[英]Chase camera in SceneKit
假设我有一个节点,它是一个多维数据集,并且正在场景中移动它,那么如何在框后跟随摄像机?
我知道这里有SCNLookAtConstraint
,但我追求的是一台追逐相机。 实际上会改变其位置的位置,以使其附着在节点后面。
我没有找到任何示例代码来显示实现此目标的方法,有人有什么想法吗?
不能将相机节点设为Box节点的子节点吗?
这里已经有很多好主意。 :)这是第三个(和第四个?)选项:在iOS 11(和macOS 10.13等)中,有更多的SCNConstraint
类型可用,因此您可以轻松地将它们链接在一起以实现各种样式的“追逐相机”行为。
您可以在SceneKit的WWDC17演讲中看到有关此内容的更多信息和一些示例:
SCNLookAtConstraint
+ SCNReplicatorConstraint
您提供类似最近的3D Mario游戏的效果,其中摄像机跟随玩家,但其相对于世界的方向不变。
SCNLookAtConstraint
+ SCNDistanceConstraint
为您提供了更多的“追逐相机”风格,其中相机会随着播放器自动旋转。
将SCNAccelerationConstraint
添加到这两个SCNAccelerationConstraint
,可以使快速移动变得平稳,并逐渐追赶玩家,从而使其感觉更加自然。 您还可以添加诸如SCNAvoidOccluderConstraint
类的SCNAvoidOccluderConstraint
,以实现许多第三人称游戏常见的行为,其中相机不会穿过墙壁,会避免尝试穿过一列,等等。
在iOS 11之前,您可以使用SCNTransformConstraint
和一个基于移动立方体的位置重置相机节点位置的块。 再加上一看,在约束保持相机对准了立方体,并调整了influenceFactor
每个约束的平滑度/滞后你想要的。
SceneKit Vehicle
示例代码中有一个与此类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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.