【发布时间】:2014-09-11 17:12:39
【问题描述】:
假设我有一个立方体节点,我在场景中移动它,我怎么能有一个跟随盒子的相机?
我知道有SCNLookAtConstraint,但我追求的是追逐相机。一个实际上改变了它的位置,因此它有点附加在节点后面。
我还没有找到任何示例代码来说明实现这一点的方法,有人有什么想法吗?
【问题讨论】:
-
如果不是“看”盒子,“跟随”盒子是什么意思?
假设我有一个立方体节点,我在场景中移动它,我怎么能有一个跟随盒子的相机?
我知道有SCNLookAtConstraint,但我追求的是追逐相机。一个实际上改变了它的位置,因此它有点附加在节点后面。
我还没有找到任何示例代码来说明实现这一点的方法,有人有什么想法吗?
【问题讨论】:
你不能让你的相机节点成为盒子节点的子节点吗?
【讨论】:
这里已经有很多好主意了。 :) 这是第三个(和第四个?)选项:在 iOS 11(和 macOS 10.13 等)中有更多可用的 SCNConstraint 类型,因此您可以轻松地将它们链接在一起以实现各种风格的“追逐相机”行为.
您可以在WWDC17 talk on SceneKit 中查看更多相关信息和一些示例:
SCNLookAtConstraint + SCNReplicatorConstraint 为您提供最近的 3D 马里奥游戏,其中相机跟随玩家,但其相对于世界的方向不会改变。
SCNLookAtConstraint + SCNDistanceConstraint 给你更多的“追逐镜头”风格,镜头会随着玩家自动转动。
将SCNAccelerationConstraint 添加到其中任何一个都可以通过平滑快速移动并逐渐赶上玩家来让游戏感觉更自然。您还可以添加 SCNAvoidOccluderConstraint 之类的内容,用于许多第三人称游戏常见的行为,其中相机不会穿过墙壁,避免尝试穿过柱子等等。
在 iOS 11 之前,您可能会使用 SCNTransformConstraint 和一个块,该块根据移动立方体的位置重置相机节点的位置。将其与观察约束相结合,以使相机始终指向立方体,并调整每个约束的 influenceFactor 以获得所需的平滑/滞后程度。
【讨论】:
SceneKit Vehicle 示例代码中有一个类似的示例。 SCNCamera 有一些延迟跟随汽车。 Look here.
它的工作原理是根据车辆的位置计算摄像头的位置。然后将当前相机位置插值到目标位置。
【讨论】:
比起其他任何建议,我更喜欢 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)
【讨论】: