我目前正在迅速开发场景工具包中的游戏,而且我有一只飞船在飞来飞去。我正在使用以下代码使照相机跟随飞船:
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
updateCameraPosition()
}
func updateCameraPosition () {
let currentPosition = player.node.presentation.position
let x: Float = lerp(a: Float(prevCameraPosition.x), b: currentPosition.x, t: 0.03)
let z: Float = lerp(a: Float(prevCameraPosition.z), b: currentPosition.z, t: 0.03) + (cameraZoom/2)
let vector = SCNVector3(x: x, y: cameraZoom, z: z)
cameraNode.runAction(SCNAction.move(to: vector, duration: 0.2))
prevCameraPosition = currentPosition
}
func lerp (a: Float, b: Float, t: Float) -> Float {
return (1 - t) * a + t * b;
}
除了跟随飞船之外,当您更改精美的流体摄像头的方向时,它还会增加一些不错的偏移运动。
我面临的问题是船在大部分时间里来回摆动,它总是朝着正确的方向移动,但是看起来船的位置似乎正重新复位几帧。您可以通过this video看到这一点。
如您在this video中所见,没有摄像机的跟踪代码,船的移动更加流畅。
有人可以看到我的代码有什么问题吗,可能效率不高?也许有更优化的方法可以做到这一点?任何技巧/资源/建议都非常有用!
答案 0 :(得分:0)
您需要先停止先前的SCNAction,然后再应用新的SCNAction。
要使用键添加动作,请使用
cameraNode.runAction(SCNAction, forKey: String)
方法。
现在您可以通过该键删除特定操作
cameraNode.removeAction(forKey: String)