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 ]
这将自动为每个渲染帧调整您的节点。
我正在使用 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 ]
这将自动为每个渲染帧调整您的节点。