【发布时间】:2021-08-29 15:04:33
【问题描述】:
我正在尝试将 SCNNode 指向另一个目标节点。我觉得我错过了一些东西,因为无论我给目标节点提供什么位置,查看器都会保持相同的方向。粘贴到情节提要中的以下代码始终如一地生成此控制台日志:
SCNVector4(x: 0.0, y: 0.0, z: 0.0, w: 1.0) SCNVector4(x: 0.0, y: 0.0, z: 0.0, w: 1.0)
func lookAtNode() {
let sceneView = SCNView()
let scene = SCNScene()
sceneView.scene = scene
let target = SCNNode()
target.position = SCNVector3(x: 5, y: 0, z: -5)
sceneView.scene?.rootNode.addChildNode(target)
let viewer = SCNNode()
viewer.position = SCNVector3(x: 0, y: 5, z: 0)
let lookAt = SCNLookAtConstraint(target: target)
//lookAt.isGimbalLockEnabled = true
viewer.constraints = [lookAt]
sceneView.scene?.rootNode.addChildNode(viewer)
print(viewer.presentation.orientation, viewer.orientation)
}
lookAtNode()
我使用它而不是简单的lookAt(节点)的主要原因是因为我需要防止滚动,如果我可以让它工作,isGimbalLockEnabled 属性提供了这个功能。
【问题讨论】:
-
您正在创建一个新的
SCNView,而不是使用您的 viewController 的视图? -
这只是故事板中的一个例子。我不确定为什么会有所作为。一个简单的 .lookAt(node: 工作只是在这个上下文中找到。它也只是围绕 Z 旋转。
-
这是因为
lookAt(node:会立即更新节点,但在渲染循环期间会评估约束。由于您的场景从未渲染,因此不会应用约束。 -
@JamesP 好吧,这就解释了。太感谢了。这真的很有帮助。刚刚把它移到了一个 VC 中,正如你所说,它现在可以工作了。谢谢!