版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。
ARSession管理AR应用的全生命周期,包括采集处理运动传感器数据、控制虚拟摄像机与设备摄像头的对齐、执行计算机视觉图像处理等等,汇总整合所有信息后建立虚拟数字世界与现实世界的对应关系,处理AR应用开启、运行、停止全生命周期各项基础工作。
(一)创建ARSession
每一个AR应用都必须包含一个ARSession,且只能包含一个ARSession,一般ARSession创建方法如下所示。
let session = ARSession()
session.delegate = self
采用这种方法会直接手工方式创建一个ARSession,但如果使用ARKit的标准渲染框架(ARView、ARSCNView、ARSKView),这些渲染器会自动创建ARSession,并不需要我们手工去创建。可以使用如下代码所示代码获取到ARSession。
let session = myView.session
创建后的ARSession并不会马上运行,需要进行功能配置。ARKit提供的功能非常多,不同的功能有不同的配置要求,并且为了优化性能,每一个ARSession运行时都需要设置一个配置文件(ARConfiguration),配置文件的作用就是通知ARKit需要运行的功能和所需的硬件资源,因此配置文件决定了AR应用的类型(如人脸检测类型、世界跟踪类型、人体跟踪类型等等)。需要了解的是,我们可以在运行时动态的设置配置文件,可以从一种应用类型切换到另一种应用类型,因此不用担心应用配置运行后无法实现功能的问题。
运行ARSession的方法原型如下代码所示。
func run(_ configuration: ARConfiguration, options: ARSession.RunOptions = [])
该方法有两个参数,configuration参数指定运行的配置文件,options为选项,指定ARSession启动时需要执行的操作,在重置或者切换配置时这些选项非常有用。options选项由ARSession.RunOptions枚举定义,该枚举各选项如下表所示。
功能项 | 描述 |
---|---|
resetTracking | 重置设备位置,重新开始跟踪 |
removeExistingAnchors | 移除上一次ARSession中的所有ARAnchor |
stopTrackedRaycasts | 停止跟踪所有投射的射线 |
resetSceneReconstruction | 重置场景几何网格 |
(二)ARConfiguration
如前文所述,ARConfiguration决定了AR应用的特性,定义了AR的功能。在ARKit中,预定义了8种ARConfiguration(定义了8个继承ARConfiguration的子类)配置类,每一种配置实现一类特定的功能,在进行AR应用开发时,可以根据功能需求选择一种设置到ARSession,具体如下表所示。
名称 | 描述 |
---|---|
ARWorldTrackingConfiguration | 使用后置摄像头,跟踪设备的位置与方向(姿态),检测识别场景中的物体表面、人体、2D图像、3D物体,进行场景重建,是最常用的一种配置 |
ARBodyTrackingConfiguration | 使用后置摄像头,跟踪设备的位置与方向(姿态),跟踪场景中的人体、2D图像和物体表面。对人体跟踪有专门的优化,可以获取到更详细的人体跟踪信息 |
AROrientationTrackingConfiguration | 使用后置摄像头,仅跟踪设备的方向,无法检测物体表面 |
ARImageTrackingConfiguration | 使用后置摄像头,跟踪设备的位置与方向(姿态),检测跟踪通过trackingImages设置的图像库中的图像 |
ARFaceTrackingConfiguration | 使用前置摄像头,跟踪人脸运动和表情 |
ARObjectScanningConfiguration | 使用后置摄像头,跟踪设备的位置与方向(姿态),扫描收集特定3D物体的空间特征点高保真信息,用于后续的3D物体检测识别 |
ARPositionalTrackingConfiguration | 使用后置摄像头,只跟踪设备的位置,无法检测物体表面 |
ARGeoTrackingConfiguration | 使用后置摄像头,跟踪地理位置信息,跟踪设备的位置与方向(姿态),可以检测识别场景中的物体表面、2D图像、3D物体 |
选择好配置类后,通过ARSession.run(with:)方法即可启用ARSession,运行相应功能。在ARKit中有8种配置类,但ARSession运行时只允许有一种配置起作用,即无法同时运行多个配置文件。以ARWorldTrackingConfiguration为例,典型的启动ARSession的代码如下代码所示。
func makeUIView(context: Context) -> ARView {
arView = ARView(frame: .zero)
let config = ARWorldTrackingConfiguration()
if ARWorldTrackingConfiguration.isSupported {
config.planeDetection = .horizontal
arView.session.run(config, options:[ ])
}
return arView
}
另外,通过上表我们可以看到,ARWorldTrackingConfiguration可以执行物体表面、人体、2D图像、3D物体检测识别多种功能,是最常用的一种配置类。虽然其可以进行2D图像、人体检测识别,但需要这两项功能时,通常我们会创建使用更具体和优化的ARImageTrackingConfiguration、ARBodyTrackingConfiguration进行2D图像和人体检测识别配置文件类,这些具体的对配置文件类对特定功能(2D图像、人体)进行了专门的优化,更适合进行专门的工作。
一些配置文件类支持子特性,如ARBodyTrackingConfiguration支持与帧相关的子特性,可通过设置配置文件类的frameSemantics属性实现更详细的子特性指定。ARBodyTrackingConfiguration支持3类子特性,如下表所示,关于该配置类的更详细内容会在所续学习阐述。
名称 | 描述 |
---|---|
bodyDetection | 检测跟踪人体 |
personSegmentation | 检测跟踪人形,常用于人形提取与人形遮挡 |
personSegmentationWithDepth | 检测跟踪人形,并评估人体与设备相机的深度 |
需要注意的是:在设置配置文件时,可以先通过isSupported属性检查当前设备是否支持指定的配置文件,另外,并不是所有机型都支持子特性,因此使用子特性时,一般应先通过supportsFrameSemantics() 检查设备是否支持ARConfiguration.FrameSemantics设定的子特性。
在ARSession运行后,我们可以随时动态的切换配置文件,如在使用中需要关闭平面检测、关闭2D图像检测、开启人体检测子特性时,可以通过在ARSession.run(with:)方法中设置新的配置文件进行切换。默认情况下,ARKit会保持当前的Session的状态,包括检测到的环境特征点信息、物体表面信息和所有的Anchor集合(进行前后摄像头切换时状态会丢失,如从人脸检测状态切换到世界跟踪状态时),但我们也可以通过options选项重置部分或全部功能。
(三)设备可用性检查和权限申请
运行ARKit需要A9以上处理器及iOS11以上操作系统,某些特定功能对处理器及操作系统要求更高,如人体跟踪、人形遮挡需要A12以上处理器和iOS13以上操作系统,因此,在运行这些功能之前应当先检查当前设备是否支持。为确保设备可用,一般通过以下几个方面进行功能确认。
(1)AR应用开发部署时,首先确保设备支持ARKit。在ARKit工程创建后,打开工程中的Info.plist文件,确保在Required device capabilities中有arkit这一项,如下图所示。当添加这个需求项之后,不支持ARKit的设备将无法安装AR应用,也无法从AppStore上下载AR应用。
(2)在ARSession运行前,使用ARConfiguration.isSupported属性检查当前设备是否支持即将运行的配置文件类,确保特定的ARConfiguration可以执行。
(3)人脸检测需要使用设备前置摄像头,并且硬件需要支持深度相机(TrueDepth),即只支持iPhone X以上型号,在使用人脸检测功能时可以通过ARFaceTrackingConfiguration.isSupported检查设备支持情况。
(4)ARBodyTrackingConfiguration有子功能特性,应当通过supportsFrameSemantics(_:)方法检查设备是否支持ARConfiguration.FrameSemantics设定的子特性。
需要注意:为提升用户体验,一般应当在UI中对设备功能的可用性进行视觉化显示,如设备不支持人脸检测时,应当将人脸检测的按钮置灰或者隐藏。
AR应用一定会使用设备摄像头,因此,我们应当获取摄像头权限,填写摄像头使用说明,告之用户使用摄像头的原因,以便用户授权确认,如上图所示,应当配置Privacy - Camera Usage Description信息。如果应用还需要使用麦克风和相册,应当设置 Privacy - Microphone Usage Description和Privacy - Photo Library Usage Description信息,更多的授权项请查阅官方文档。