You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取ARSCNView中添加SCNNode后自动创建的ARAnchor?

嘿,我来帮你捋清楚这个问题——你直接把SCNNode加到场景的rootNode上,ARKit不会自动为这个节点创建对应的ARAnchor,这就是你找不到锚点的核心原因~

为什么会这样?

ARKit自动生成锚点的场景都是和真实世界跟踪绑定的:比如检测到平面时生成ARPlaneAnchor,识别到指定图像时生成ARImageAnchor,或者你手动把ARAnchor添加到ARSession之后,ARKit才会自动关联对应的节点。但你直接添加SCNNode到rootNode的操作,完全和ARKit的锚点跟踪系统没绑定,自然不会有自动生成的锚点。

两种可行的解决方法

方法1:手动创建ARAnchor并绑定节点(推荐用于AR跟踪场景)

这种方式会让节点和ARKit的跟踪系统绑定,锚点会被session持续跟踪,适合需要在真实世界固定位置显示3D物体的场景:

  1. 首先确保你的视图控制器遵守ARSCNViewDelegate协议,并且设置sceneView.delegate = self
  2. 创建锚点并添加到ARSession:
// 可以自定义锚点的位置,比如用当前相机的位置,或者指定一个transform
let anchorTransform = simd_float4x4(matrix_float4x4Identity) // 这里替换成你想要的位置
let anchor = ARAnchor(transform: anchorTransform)
sceneView.session.add(anchor: anchor)
  1. 在代理方法中把你的节点关联到这个锚点:
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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:20:12