查看在增强图像网页上发布的此视频(使用 Chrome 浏览器观看此视频)。
创建这种类型的虚拟立方体很容易。您只需要一个没有正面多边形的简单立方体基元的 3D 模型(以便查看其内表面)。你还需要一架带方孔的飞机。为这个平面分配一个开箱即用的RealityKit 遮挡材质或手工制作的SceneKit 遮挡材质,它将隐藏立方体的所有外墙(见下图)。
在 Autodesk Maya中,遮挡材质是渲染统计中的一个保留选项(仅适用于 Viewport 2.0):
当您将在墙上跟踪您的海报时(启用detectionImages选项),您的应用程序必须识别图片并使用遮挡着色器“加载”3D 立方体及其遮罩平面。因此,如果ARImageAnchor
在海报上和pivot point
3D 立方体必须相遇,则立方体的轴心点必须位于立方体的前边缘(与墙壁表面相同的水平)。
如果您想下载 Apple 的包含图像检测体验的示例代码 - 只需单击与 detectionImages 相同的网页上的蓝色按钮。
这是我的代码的一个简短示例:
@IBOutlet var sceneView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self // for using renderer() methods of ARSCNViewDelegate
sceneView.scene = SCNScene()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
resetTrackingConfiguration()
}
func resetTrackingConfiguration() {
guard let refImage = ARReferenceImage.referenceImages(inGroupNamed: "Poster",
bundle: nil)
else { return }
let config = ARWorldTrackingConfiguration()
config.detectionImages = refImage
config.maximumNumberOfTrackedImages = 1
let options = [ARSession.RunOptions.removeExistingAnchors,
ARSession.RunOptions.resetTracking]
sceneView.session.run(config, options: ARSession.RunOptions(options))
}
...当然还有 SceneKit 的renderer()
实例方法:
func renderer(_ renderer: SCNSceneRenderer,
didAdd node: SCNNode,
for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor,
let _ = imageAnchor.referenceImage.name
else { return }
anchorsArray.append(imageAnchor)
if anchorsArray.first != nil {
node.addChildNode(portalNode)
}
}