SceneKit / ARKit 每帧更新一个节点

SceneKit / ARKit updating a node every frame

我正在使用 ARKit / SceneKit 并试图让箭头指向我在世界中设置的任意位置,但我遇到了一些麻烦。在我的 sceneView 中,我设置了一个场景以加载到我的箭头中。

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        guard let arrowScene = SCNScene(named: "art.scnassets/arrowScene.scn") else {
            fatalError("Scene arrow.scn not found")
        }
        
        let worldAnchor = ARAnchor(name: "World Anchor", transform: simd_float4x4(1))
        sceneView.session.add(anchor: worldAnchor)
        
        sceneView.scene = (arrowScene)
    }

然后我希望使用 SCNNode.look(at:) 将我的箭头指向指定的锚点,但是,我不确定如何让它在每一帧都发生。我知道我可以访问 ARSCNView 提供的特殊代表,例如 renderer(willUpdate node:),但我不确定当锚点没有改变位置而箭头是时如何使用这些。

感谢您的帮助!

您可以使用 updateAtTime 委托函数来实现,但我强烈建议您使用 SCNConstraint。

let lookAtConstraint = SCNLookAtConstraint(target: myLookAtNode)
lookAtConstraint.isGimbalLockEnabled = true // useful for cameras, probably also for your arrow.

// in addition you can use a position constraint
let positionConstraint = SCNReplicatorConstraint(target: myLookAtNode)
positionConstraint.positionOffset           = yourOffsetSCNVector3
positionConstraint.replicatesOrientation    = false
positionConstraint.replicatesScale          = false
positionConstraint.replicatesPosition       = true
    
// then add the constraints to your arrow node
arrowNode.constraints = [lookAtConstraint, positionConstraint ]

这将自动为每个渲染帧调整您的节点。