SCNNode 没有锚定在现实世界坐标

SCNNode is not being anchored at real world coordinates

我有一个简单的 SCNNode,我想将其放置在真实世界的位置,该节点对应于具有已知坐标的地标。我想让 SCNNode 保持在它的位置,但它往往会随着相机移动。我不能使用平面检测或命中测试将节点放置在现实世界中,我只能使用现实世界的坐标。我当前的解决方案使用 SCNNodes 世界变换创建一个 ARanchor。

showNode(node: Node, location: convertedPoint)
let anchor = ARAnchor(transform: Node.simdWorldTransform)
self.sceneView.session.add(anchor: anchor)

我认为这足以锚定节点。有没有不使用平面检测或命中测试来锚定节点的解决方案?

谢谢

首先,即使你用锚点来稳定你的节点,它也永远不会完美,只会更好。

但是,当在您指定的坐标处创建 ARAnchor 时,您想要稳定的节点实际上并未放置在该锚点内。

您需要在您的 ARSCNViewDelegate 和 return 您希望通过锚点稳定的目标节点中实现 renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) 功能(或者,您可以将您的节点添加为通过实现renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)函数默认创建锚节点的childNode)。

如果您的 nodeToBeStabilized 对象在 ViewController 中作为 属性 可用,那么一个非常愚蠢的实现可能是这样的:

extension WAViewController: ARSCNViewDelegate, ARSessionDelegate {
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        return nodeToBeStabilized
    }
}