在SceneKit中追逐相机

时间:2014-07-21 08:50:00

标签: ios scenekit

假设我有一个多维数据集的节点,我在场景中移动它,我怎么能有一个跟在盒子后面的摄像头?

我知道有SCNLookAtConstraint,但我追求的是追逐相机。一个实际上改变它的位置,以便它在节点后面附加。

我还没有找到任何显示实现方法的示例代码,有没有人有任何想法?

4 个答案:

答案 0 :(得分:6)

你能不能让你的摄像机节点成为盒子节点的子节点吗?

答案 1 :(得分:5)

这里有很多好主意。 :)这是第三个(和第四个?)选项:在iOS 11(和macOS 10.13等)中有更多SCNConstraint类型可用,因此您可以轻松地将它们链接在一起以实现各种风格的“追逐相机” “行为。

您可以在WWDC17 talk on SceneKit

中看到更多相关信息和一些示例
  • SCNLookAtConstraint + SCNReplicatorConstraint可让您获得最近的3D马里奥游戏,相机跟随播放器,但其相对于世界的方向不会改变。

  • SCNLookAtConstraint + SCNDistanceConstraint为您提供更多“追逐相机”风格,相机会自动转动播放器。

SCNAccelerationConstraint添加到其中任何一个中都可以通过平滑快速移动并逐渐赶上玩家来感觉更自然。您还可以为许多第三人称游戏中常见的行为添加SCNAvoidOccluderConstraint之类的内容,相机不会穿过墙壁,避免尝试查看列等等。


在iOS 11之前,您可以使用SCNTransformConstraint和一个基于移动立方体重置相机节点位置的块。将其与观察约束相结合以使相机指向立方体,并调整每个约束的influenceFactor以获得所需的平滑/滞后程度。

答案 2 :(得分:2)

SceneKit Vehicle示例代码中有一个与此类似的示例。 SCNCamera跟随汽车有一些延迟。 Look here

它的工作原理是根据车辆的位置计算摄像机的位置。然后它将当前摄像机位置插入到目标位置。

答案 3 :(得分:0)

与其他建议相比,我更喜欢Rickster的方法。

使camera节点成为box节点的子节点是可以的,但是如果box旋转了,照相机将指向一个笨拙的角度。

更清洁的方式:

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)
相关问题