配置AR会话,并使用SceneKit或SpriteKit显示AR内容。
概观
当你使用ARSCNView 或 ARSKView时,ARKit自动管理创建AR体验的基本要求:每个视图以实时摄像机图像为背景显示,并渲染您提供的2D或3D虚拟物体,以创建虚拟物体存在于现实世界中的幻觉。要使用这些视图类之一,您可以将其配置为您要创建的AR体验类型,并为虚拟内容选择放置位置和形态。
要建立自己的AR体验视图,请参阅Displaying an AR Experience with Metal。
- Tips
本文介绍了Xcode项目模板中的代码。有关完整的示例代码,请使用Augmented Reality模板创建新的iOS应用程序,然后从弹出菜单中选择“SceneKit”或“SpriteKit”。
配置并运行AR会话
ARSCNView 和ARSKView两个类都包括ARSession对象,来管理创建AR体验所需的运动跟踪和图像处理。但是,要运行会话,您必须提供会话配置。
ARWorldTrackingSessionConfiguration类提供高精度的运动跟踪,并提供了能够帮助您将虚拟内容放置在与现实世界相关的表面上的功能。在世界跟踪不可用的情况下,基类ARSessionConfiguration提供了简单的运动跟踪,其允许较少沉浸式的AR体验。要启动AR Session,需创建具有所需选项的Session配置对象,然后调用ARSCNView实例的session对象的run(_:options:)方法:
overridefuncviewWillAppear(_animated: Bool){
super.viewWillAppear(animated)
// Create a session configuration
let configuration =ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal
// Run the view's session
sceneView.session.run(configuration)
}
- Tips
只有屏幕上显示视图才可以运行会话。
设置完AR会话后,使用SceneKit或SpriteKit将虚拟内容放置在视图中。
使用SceneKit创建3D虚拟内容
使用SceneKit为您的AR内容添加逼真的三维对象。
概述
要将SceneKit内容放在AR中,您首先需要运行AR会话(请参阅Building a Basic AR Experience).
因为ARKit会将SceneKit空间自动匹配到现实世界中,所以放置一个虚拟对象,以使其看起来在真实的位置上,这要求您将ScenceKit对象设置在适当地位置。例如,在默认配置中,以下代码将10厘米立方体放置在相机初始位置前20厘米处:
letcubeNode =SCNNode(geometry:SCNBox(width:0.1, height:0.1, length:0.1, chamferRadius:0))
cubeNode.position =SCNVector3(0,0, -0.2) // SceneKit/AR coordinates are in meters
sceneView.scene.rootNode.addChildNode(cubeNode)
上面的代码直接在视图的SceneKit场景中放置一个对象。该对象自动显示并跟踪真实世界的位置,因为ARKit将SceneKit空间与现实世界空间相匹配。
或者,您可以使用ARAnchor通过自己创建锚点并将其添加到会话或通过观察ARKit自动创建的锚点来跟踪现实世界的位置。例如,当启用平面检测时,ARKit会为每个检测到的平面添加并更新锚点。为这些锚添加可视化内容,实现ARSCNViewDelegate方法,如下:
funcrenderer(_renderer: SCNSceneRenderer, didAdd node: SCNNode,foranchor: ARAnchor){
//该可视化内容仅涵盖检测到的平面。
guard let planeAnchor = anchoras?ARPlaneAnchor else{return}
//创建一个SceneKit平面,以使用该平面的位置和大小。
let plane =SCNPlane(width:CGFloat(planeAnchor.extent.x),
height:CGFloat(planeAnchor.extent.z))
let planeNode =SCNNode(geometry: plane)
planeNode.position =SCNVector3Make(planeAnchor.center.x,0, planeAnchor.center.z)
// SCNPlanes are vertically oriented in their local coordinate space.
// Rotate it to match the horizontal orientation of the ARPlaneAnchor.
// SCNPlanes在本地坐标系中垂直定向。
// 旋转它以匹配到ARPlaneAnchor的水平方向。
planeNode.transform =SCNMatrix4MakeRotation(-Float.pi /2,1,0,0)
// ARKit拥有与锚相对应的节点,因此该平面成为一个子节点。
node.addChildNode(planeNode)
}
遵循设计3D模型的最佳做法
使用SceneKit基础的物理照明模型,以获得更逼真的外观。 (见SCNMaterial类和Badger: Advanced Rendering in SceneKit项目中示例代码。)
创建环境遮挡阴影,使物体在各种场景照明条件下都能正常显示。
如果您创建一个虚拟对象,您打算放置在AR的真实平面上,请在3D模型中的对象下方放置一个具有柔和的阴影纹理的透明平面。
Apple 文档地址:
building_a_basic_ar_experience