假设我有一个立方体节点并且我在场景中移动它,我怎样才能有一个跟随盒子的相机?
我知道有SCNLookAtConstraint
,但我追求的是追逐相机。一个实际上改变了它的位置,以便它被附加在节点后面的一种。
我还没有找到任何示例代码来显示实现这一点的方法,有人有什么想法吗?
你不能让你的相机节点成为盒子节点的子节点吗?
这里已经有很多好主意了。:) 这是第三个(和第四个?)选项:在 iOS 11(和 macOS 10.13 等)中有更多SCNConstraint
可用的类型,因此您可以轻松地将它们链接在一起以实现各种风格的“追逐相机”行为。
您可以在WWDC17 关于 SceneKit的演讲中看到更多关于此的内容和一些示例:
SCNLookAtConstraint
+SCNReplicatorConstraint
让您获得类似最近的 3D 马里奥游戏,其中相机跟随玩家,但其相对于世界的方向不会改变。
SCNLookAtConstraint
+SCNDistanceConstraint
给你更多的“追逐相机”风格,相机会随着玩家自动转动。
SCNAccelerationConstraint
通过平滑快速移动并逐渐赶上玩家,添加其中任何一个都可以让它感觉更自然。您还可以添加SCNAvoidOccluderConstraint
许多第三人称游戏常见的行为,其中相机不会穿过墙壁,避免尝试穿过柱子等等。
在 iOS 11 之前,您可能会使用SCNTransformConstraint
一个块来根据移动立方体的位置重置相机节点的位置。将其与观察约束相结合,以使相机指向立方体,并调整influenceFactor
每个约束的 ,以获得所需的平滑/滞后程度。
SceneKit Vehicle
示例代码中有一个与此类似的示例。SCNCamera 有一些延迟跟随汽车。看这里。
它的工作原理是根据车辆的位置计算摄像头的位置。然后它将当前相机位置插值到目标位置。
比起其他任何建议,我更喜欢 Rickster 的方法。
使相机节点成为盒子节点的子节点会起作用,但如果旋转盒子,相机将指向一个尴尬的角度。
更清洁的方式:
let distanceConstraint = SCNDistanceConstraint(target: box)
distanceConstraint.minimumDistance = 55
distanceConstraint.maximumDistance = 60
let lookAtConstraint = SCNLookAtConstraint(target: box)
lookAtConstraint.isGimbalLockEnabled = true
cameraNode.constraints = [lookAtConstraint,distanceConstraint]
scnView.scene?.rootNode.addChildNode(cameraNode)