繁体   English   中英

在SceneKit中追逐相机

[英]Chase camera in SceneKit

假设我有一个节点,它是一个多维数据集,并且正在场景中移动它,那么如何在框后跟随摄像机?

我知道这里有SCNLookAtConstraint ,但我追求的是一台追逐相机。 实际上会改变其位置的位置,以使其附着在节点后面。

我没有找到任何示例代码来显示实现此目标的方法,有人有什么想法吗?

不能将相机节点设为Box节点的子节点吗?

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

您可以在SceneKitWWDC17演讲中看到有关此内容的更多信息和一些示例:

  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM