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处理。
参数:
- configuration:定义session的运动和场景跟踪行为的对象。
- options:影响现有session状态(如果有)如何转换为新配置的选项。
- (void)runWithConfiguration:(ARConfiguration *)configuration;
使用指定的配置运行session的AR处理。
参数: - configuration:定义session的运动和场景跟踪行为的对象。
typedef enum ARSessionRunOptions : NSUInteger {
...
} ARSessionRunOptions;
当你改变它的配置转变的AR session的当前状态的选项时,它的影响如何。
options:
- ARSessionRunOptionResetTracking
默认情况下,当您在之前运行或已运行的会话上调用runWithConfiguration:options:方法时,session将从其上次已知状态恢复设备位置跟踪。 (例如,ARAnchor对象保持其相对于摄像机的明显位置。)当您调用runWithConfiguration:options:方法时,其配置与会话的当前配置相同,您可以使用此选项强制设备位置跟踪到 回到初始状态。当您使用与会话的当前配置不同类型的配置调用runWithConfiguration:options:方法时,session始终重置跟踪(即,隐式启用此选项)。 - ARSessionRunOptionRemoveExistingAnchors
默认情况下,当您在之前运行或已在运行的session上调用runWithConfiguration:options:方法时,会话将保留您之前添加的任何ARAnchor对象。 也就是说,AR场景中的对象保持其相对于设备的明显真实位置(除非您启用ARSessionRunOptionResetTracking选项)。
如果更改session配置应使AR场景中对象的明显真实位置无效,则启用ARSessionRunOptionRemoveExistingAnchors选项。 例如,如果您已将虚拟内容添加到其位置与现实世界对象相关的AR场景中,请删除这些锚点,以便您可以重新评估相应的实际位置。 另一方面,如果场景中的虚拟内容仅在该内容首次出现时才需要跟踪实际位置,并且此后可以自由移动,则可以禁用此选项以保留锚点。
响应AR更新:
- delegate
如果您使用ARSCNView或ARSKView类来显示您的AR体验,则不需要会话委托。 这些视图自动显示捕获的视频图像并协调SceneKit或SpriteKit内容以跟踪设备和摄像机运动。
如果使用Metal或其他渲染技术为AR体验创建自己的可视化,请设置会话委托。 您的委托对象定期接收会话捕获的ARFrame对象。 这些对象包含可供您显示的视频帧图像和可用于协调显示场景元素的AR场景信息 - delegateQueue
- ARSessionDelegate
如果您需要直接使用session捕获的ARFrame对象,或者直接跟踪对session的跟踪ARAnchor对象集的更改,请实现此协议。 通常,在构建用于显示AR内容的自定义视图时采用此协议 - 如果使用SceneKit或SpriteKit显示内容,ARSCNViewDelegate和ARSKViewDelegate协议会提供类似的信息并与这些技术集成。此协议扩展了ARSessionObserver协议,因此您的session委托也可以实现这些方法来响应会话状态的变化。
重点:
- (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移除
- ARSessionObserver
你可以用来回应AR 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.
网友评论