ARKit文档翻译之ARSession类
ARSession
ARSession是一个管理增强现实体验所需的设备相机和运动处理的共享对象。
概述
ARSession对象协调ARKit代为执行的主进程以创建一个增强现实体验。这些过程包括从设备的运动传感器硬件中读取数据,控制设备的内置相机,以及对捕获的相机图像进行图像分析。会话综合了所有这些结果,以建立设备所在的真实世界空间与模拟AR内容的虚拟空间之间的对应关系。
ARKit构建的每一个AR体验都需要一个ARSession对象。如果你使用ARSCNView或ARSKView对象以轻松构建AR体验的可视化部分,则视图对象包括一个ARSession实例。如果你为AR内容构建自己的渲染器,则需要自己实例化和维护ARSession对象。
运行一个会话需要一个会话配置:ARConfiguration类或或其子类ARWorldTrackingConfiguration的实例。这些类用来确定ARKit如何让追踪设备相对于现实世界的位置和方向,从而影响可创建的AR体验的种类。
API
- 配置和运行会话
func run(ARConfiguration, options: ARSession.RunOptions = [])
使用指定的配置和选项启动AR会话处理。
参数
configuration:定义会话的运动和场景追踪行为的对象。
options:影响现有会话状态(若有的话)转换到新配置的选项。如果会话首次运行,此参数不起作用。
讨论
该会话追踪设备运动,从设备摄像头捕获和处理场景图像,并仅在其运行时与代理对象或ARSCNView或ARSKView视图协调。
在已经启动的会话上调用此方法会立即转换到新的会话配置。options参数确定现有会话状态如何转换到新配置。默认情况下,会话从最后的已知状态恢复设备的位置追踪,并保留已添加到会话的任何锚点。调用此方法后,会话将以异步方式运行。
### struct ARSession.RunOptions
当更改会话配置时影响如何转换当前AR会话状态的选项。
讨论
-
options
static var resetTracking: ARSession.RunOptions
不会继续执行之前配置的设备位置或运动追踪的会话
讨论
默认情况下,当你在运行之前或已在运行的会话上调用run(_:options:)方法时,会话将从最后一个已知状态恢复设备位置追踪(例如,ARAnchor对象持有相对于相机的明显位置)。当你使用与会话的当前配置相同类型的配置并调用run(_:options:)方法时,可以使用此选项使得设备位置追踪强制返回到其初始状态。当你使用与会话的当前配置不同类型的配置并调用run(_:options:)方法,该会话始终会重置追踪(即此选项被隐式启用)。
### static var removeExistingAnchors: ARSession.RunOptions 与之前配置中的会话关联的任何锚点都被删除。讨论
默认情况下,当你在运行之前或已在运行的会话上调用run(_:options:)方法时,会话会保留先前添加的任何ARAnchor对象。也就是说,AR场景中的对象持有其相对于设备的明显的现实位置(除非启用resetTracking选项)。如果应该在更改会话配置时使AR场景中对象的明显现实位置无效则启用removeExistingAnchors选项。例如,如果你已将虚拟内容添加到与现实世界对象相关联的AR场景中,请删除这些锚点,以便重新评估响应的现实世界的位置。另一方面,如果你的场景中的虚拟内容需要追踪现实位置,只有当该内容首次出现并且之后可以自由移动时,可禁用此选项来保留锚点。
-
Initializers
init(rawValue: UInt)
### var configuration: ARConfiguration? 定义会话的运动和场景追踪行为的对象。
### func pause() 暂停会话处理。 #### 讨论 会话暂停时,会话不再追踪设备移动或捕获场景图像,也不会协调其**代理**对象或更新任何关联的**ARSCNView**或**ARSKView**对象。
- 响应AR更新
var delegate: ARSessionDelegate?
用于接收捕获的视频图像和追踪信息或响应会话状态的更改的代理对象。
讨论
如果你使用ARSCNView和ARSKView类来显示AR体验,则不需要会话代理。这些视图会自动显示捕获的视频图像,并协调SceneKit或SpriteKit内容来追踪设备和相机运动。如果你使用Metal或其他渲染技术为AR体验创建自己的可视化文件,请设置会话代理。代理对象会定期收到会话捕获的ARFrame对象,这些对象包含可以现实的视频帧图像和AR场景信息,可以使用它们来协调你渲染的场景元素的显示。
### var delegateQueue: DispatchQueue? 会话调用代理方法的调度队列
讨论
若该值为默认值nil,会话将在主队列中调用代理方法。
### protocol ARSessionDelegate 可以实现的从AR会话接收捕获的视频帧图像和追踪状态的方法。
概述
需要直接使用会话捕获的ARFrame对象或直接遵循对会话的追踪ARAnchor对象集的更改时,执行此协议。通常,在构建用于显示AR内容的自定义视图时,使用该协议--如果使用SceneKit或SpriteKit显示内容,则ARSCNViewDelegate和ARSKViewDelegate协议提供类似的信息并集成这些技术。该协议扩展了ARSessionObserver协议,因此会话代理也可以实现这些方法来响应会话状态的更改。
代理方法
-
接收相机frame
func session(ARSession, didUpdate: ARFrame)
向代理对象提供新捕获的摄像机图像和附带的AR信息。
参数
session:提供信息的会话。
options:包含新的相机图像和AR信息的对象。
讨论
如果提供了自定义显示渲染AR体验,实现此方法。提供的ARFrame对象包含从设备摄像头捕获的最新图像,可以将其渲染为场景背景,以及有关摄像机参数和锚点转换的信息,可用于在摄像机图像顶部渲染虚拟内容。
-
处理内容更新
func session(ARSession, didAdd: [ARAnchor])
告诉代理对象一个或多个锚点已被添加到会话中。
参数
session:提供信息的会话。
anchors:新添加到会话的锚点。
讨论
根据会话配置,ARKit可以自动向会话添加锚点。如果使用SceneKit或SpriteKit显示AR体验,可以改为实现以下方法之一,不仅仅可以追踪到会话的锚点,还可以将SceneKit或SpriteKit内容添加到响应的场景中:ARSCNView:renderer(_:nodeFor:)或 renderer(_:didAdd:for:) 、ARSKView:node(for:)或view(_:didAdd:for:)。
### func session(ARSession, didUpdate: [ARAnchor]) 告诉代理对象会话已调整一个或多个锚点的属性。参数
session:提供信息的会话。
anchors:属性发生变化的锚点。
讨论
根据会话配置,ARKit可能会自动更新会话中的锚点的属性。如果使用SceneKit或SpriteKit显示AR体验,可以改为实现以下方法之一,不仅仅可以追踪到会话的锚点,还可以追踪任何相应的SceneKit或SpriteKit内容:ARSCNView:renderer(_:willUpdate:for:)或 renderer(_:didUpdate:for:) 、ARSKView:view(_:willUpdate:for:)或view(_:didUpdate:for:)。
### func session(ARSession, didRemove: [ARAnchor]) 告诉代理对象一个或多个锚点已从会话中删除。参数
session:提供信息的会话。
anchors:从会话中新删除的锚点。
讨论
根据会话配置,ARKit可能会自动从会话中删除锚点。如果使用SceneKit或SpriteKit显示AR体验,可以改为实现以下方法之一,不仅仅可以追踪到会话的锚点,还可以追踪任何相应的SceneKit或SpriteKit内容:ARSCNView:renderer(_:didRemove:for:) 、ARSKView:view(_:didRemove:for:)。
### protocol ARSessionObserver 可以实现的响应AR会话状态的更改的方法。
- AR内容的显示与交互
var currentFrame: ARFrame?
最近被会话捕获的视频帧图像,具有关联的AR场景信息。
### func add(anchor: ARAnchor) 添加要由会话追踪的指定的锚点。
讨论
锚点追踪的更在在捕获下一帧时生效。
### func remove(anchor: ARAnchor) 从会话追踪中删除指定的锚点。
讨论
锚点追踪的更在在捕获下一帧时生效。