ARSession

2018-11-06  本文已影响0人  Hikarri

ARSession

参考文档:https://developer.apple.com/documentation/arkit/arsession?language=objc

A shared object that manages the device camera and motion processing needed for augmented reality experiences.
一个共享的管理设备摄像头和增强现实体验所需要的传感器(三轴陀螺仪等)的对象。

综述

一个ARSession对象协调着ARKit在你创建一个增强现实体验的主要过程。这个过程包括从设备上的传感器上读取数据,控制设备上的摄像头,同时基于摄像头扑捉到的图片上显示图像。这个session综合所有的这些结果来使得设备所处的现实空间和你的AR模型内容所在的虚拟空间一致。
每一个基于ARKit的AR体验的建立都需要一个独立的ARSession对象。如果你使用 ARSCNView 或者 ARSKView对象来简单的建立你的AR体验的视觉部分,那么这个view对象需要包括一个ARSession的实例。如果你要为自己的AR内容渲染,你需要一个实例化而且包含一个自己的ARSession对象
使用一个session需要一个框架。抽象ARConfiguration类的子类确定ARKit如何跟踪设备相对于现实世界的位置和运动,从而影响您可以创建的AR体验类型。例如,使用ARWorldTrackingConfiguration进行体验,通过设备的后置摄像头增强用户对周围世界的视图。

API

配置和运行session

- (void)runWithConfiguration:(ARConfiguration *)configuration options:(ARSessionRunOptions)options;
使用指定的配置和选项运行session的AR处理。
参数:

typedef enum ARSessionRunOptions :  NSUInteger {
    ...
} ARSessionRunOptions;

当你改变它的配置转变的AR session的当前状态的选项时,它的影响如何。
options:

响应AR更新:

- (void)session:(ARSession  *)session didUpdateFrame:(ARFrame   *)frame;

提供一个新扑捉的摄像头图像并且将AR信息同步到这个协议

- (void)session:(ARSession  *)session didAddAnchors:(NSArray< ARAnchor *> *)anchors;

告诉这个协议,一个或多个锚点已经加入到这个session

- (void)session:(ARSession  *)session didUpdateAnchors:(NSArray< ARAnchor *> *)anchors;

告诉协议,session已经适配升级的一个或多个锚点的属性

- (void)session:(ARSession  *)session didRemoveAnchors:(NSArray< ARAnchor *> *)anchors;

告诉协议锚点已经从这个session移除

显示AR内容并与之交互

currentFrame
- (void)addAnchor:(ARAnchor *)anchor;
- (void)removeAnchor:(ARAnchor *)anchor;

保存或共享session状态

- (void)getCurrentWorldMapWithCompletionHandler:(void (^)(ARWorldMap *worldMap, NSError *error))completionHandler;
//返回一个封装了跟踪现实世界session的空间映射状态和锚点集的对象。
//参数:completionHandler ARKit完成生成世界地图后要异步调用的块。 该块有两个参数:
//worldMap:生成的ARWorldMap,如果无法生成地图,则为nil。
//error
//注意:ARKit在会话的delegateQueue上调用您的completionHandler(如果设置,则在主队列上调用)。 如果您需要从此处理程序执行消耗线程的工作(例如归档和保存或发送世界地图),请在适当的调度队列上执行此操作以避免中断性能。

扫描3D对象以进行检测

//从session的世界空间的指定区域创建参考对象(用于3D对象检测)
- (void)createReferenceObjectWithTransform:(simd_float4x4)transform center:(simd_float3)center extent:(simd_float3)extent completionHandler:(void (^)(ARReferenceObject *referenceObject, NSError *error))completionHandler;
//参数:
/* 
transform:一个变换矩阵,定义要提取的区域的局部坐标系的原点和方向。
extend:要提取的区域的宽度,高度和深度,以中心点为中心并定向到由transform指定的局部坐标系。
completionHandler:在ARKit完成创建引用对象后异步调用的处理程序。 处理程序有两个参数:referenceObject(ARReferenceObject),error
*/
//返回值:表示世界地图的指定区域的ARReferenceObject,如果无法提取对象,则为nil。

注意: 此方法仅在运行具有ARObjectScanningConfiguration的会话时有效,该会话启用扫描参考对象所需的高保真空间数据收集。 在具有不同配置的会话上调用此方法会立即调用您的completionHandler并显示错误。
另外:要将提取的参考对象用于3D对象检测,请将其分配给世界跟踪配置的detectionObjects属性。 您可以将应用程序中的参考对象保存到文件并将其添加到Xcode资产目录中。
当ARKit检测到参考图像时,生成的ARObjectAnchor的变换基于参考对象坐标系的原点 - 您在提取参考对象时指定的变换。 例如,如果参考对象表示位于水平表面上的物理项目,则虚拟内容应该看起来位于物理对象所做的任何表面上。 要在提取引用对象的原点后调整它,请使用referenceObjectByApplyingTransform:方法。

更新现实世界原点

- (void)setWorldOrigin:(simd_float4x4)relativeTransform;
//Changes the basis for the AR world coordinate space using the specified transform.
上一篇 下一篇

猜你喜欢

热点阅读