创建一个运行AR session并利用平面检测使用SceneKit来放置3D内容的app。
概述
这个示例app运行一个 ARKit 现实追踪 session,并且在 SceneKit 视图中显示内容。为了演示平面检测,这个app仅放置一个 SCNPlane 对象来可视化每个检测到的 ARPlaneAnchor 对象。
配置并运行 AR Session
ARSCNView 类是一个 SceneKit 视图,包括一个 ARSession 对象,该对象用来管理创建AR体验所需的运动跟踪和图像处理。但是,要运行 AR Session,必须要提供一个 Session 配置。
ARWorldTrackingConfiguration 类提供高精度的运动跟踪,并且可以帮助你将虚拟内容放置在真实物体表面。要启动 AR Session,请使用你想要的选项(例如平面检测)来创建一个Session配置对象,然后在ARSCNView实例的session对象上调用run方法:
1 | let configuration = ARWorldTrackingConfiguration() |
只有在屏幕上显示View的时候才运行session。
重要: 如果你的app的核心功能需要使用ARKit,请使用你app的Info.plist文件 UIRequiredDeviceCapabilities 中的 arkit 键,以确保你的app仅在支持ARKit的设备上可用。
如果AR只是你app的辅助功能,请使用 isSupported 属性来确定是否提供基于AR的功能。
在检测到的平面上放置3D内容
在设置好AR session后,可以使用 SceneKit 来放置虚拟内容在视图里。
当启用平面检测时,ARKit 为每个检测到的平面 添加和更新 anchors。默认情况下,ARSCNView 类为每个anchor 添加一个 ACNNode 对象到 SceneKit 场景。你的View的代理可以实现 renderer(_:didAdd:for:) 方法来向场景中添加内容。
1 | func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { |
如果将内容添加为与anchor相对应的节点的子节点,ARSCNView类会自动的移动改内容,因为ARKit会优化它对平面位置和范围的估计。为了显示估计平面的全部范围,该示例app还实现了renderer(_:didUpdate:for:) 方法,更新SCNPlane对象的大小来反映ARKit提供的估计值。
1 | func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { |