如何获取ARSCNView中添加SCNNode后自动创建的ARAnchor?
嘿,我来帮你捋清楚这个问题——你直接把SCNNode加到场景的rootNode上,ARKit不会自动为这个节点创建对应的ARAnchor,这就是你找不到锚点的核心原因~
为什么会这样?
ARKit自动生成锚点的场景都是和真实世界跟踪绑定的:比如检测到平面时生成ARPlaneAnchor,识别到指定图像时生成ARImageAnchor,或者你手动把ARAnchor添加到ARSession之后,ARKit才会自动关联对应的节点。但你直接添加SCNNode到rootNode的操作,完全和ARKit的锚点跟踪系统没绑定,自然不会有自动生成的锚点。
两种可行的解决方法
方法1:手动创建ARAnchor并绑定节点(推荐用于AR跟踪场景)
这种方式会让节点和ARKit的跟踪系统绑定,锚点会被session持续跟踪,适合需要在真实世界固定位置显示3D物体的场景:
- 首先确保你的视图控制器遵守
ARSCNViewDelegate协议,并且设置sceneView.delegate = self - 创建锚点并添加到ARSession:
// 可以自定义锚点的位置,比如用当前相机的位置,或者指定一个transform let anchorTransform = simd_float4x4(matrix_float4x4Identity) // 这里替换成你想要的位置 let anchor = ARAnchor(transform: anchorTransform) sceneView.session.add(anchor: anchor)
- 在代理方法中把你的节点关联到这个锚点:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { // 可以通过anchor的identifier来区分是我们手动添加的锚点 let boxNode = SCNNode() boxNode.geometry = SCNBox(width: 0.5, height: 0.1, length: 0.3, chamferRadius: 0) boxNode.geometry?.firstMaterial?.diffuse.contents = UIColor.green node.addChildNode(boxNode) testNode = boxNode }
之后你就可以通过testNode.parent?.anchor获取对应的ARAnchor,或者遍历sceneView.session.currentFrame?.anchors找到目标锚点。
方法2:给现有节点手动绑定锚点(仅适合不需要跟踪的场景)
如果你只是想给已有的节点挂一个锚点,但不需要ARKit跟踪它的位置变化,可以这么做:
let node = SCNNode() node.geometry = SCNBox(width: 0.5, height: 0.1, length: 0.3, chamferRadius: 0) node.geometry?.firstMaterial?.diffuse.contents = UIColor.green // 创建一个锚点,用节点当前的transform let anchor = ARAnchor(transform: node.simdTransform) // 把锚点绑定到节点上 node.anchor = anchor sceneView.scene.rootNode.addChildNode(node) testNode = node
⚠️ 注意:这种方式的锚点不会被ARSession管理,当AR跟踪状态更新时,锚点和节点的位置不会同步调整,所以只适合静态展示的场景。
关键总结
ARKit的锚点是用来连接虚拟节点和真实世界位置的桥梁,只有当锚点被加入到ARSession中,ARKit才会对它进行跟踪管理。直接添加到rootNode的节点属于场景的静态元素,和AR跟踪系统无关,自然不会有自动生成的锚点。
内容的提问来源于stack exchange,提问作者P.M.
相关产品推荐
相关产品推荐

