我目前正在与swift一起在scenekit开发一款游戏,我有一艘宇宙飞船在四处飞行。我使用以下代码使相机跟随宇宙飞船:
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;
}
除了跟随飞船,当你为一个漂亮的流体相机改变方向时,它还增加了一些不错的偏移运动。
我面临的问题是,飞船在很大一部分时间里来回出现故障,它总是朝着正确的方向移动,但看起来飞船的位置几乎要重置几帧。你可以在这个视频中看到这一点。
如果没有摄像头跟随代码,船的移动会更加平稳,正如你在这个视频中看到的那样
有人能看到我的代码中有什么可能效率低下的错误吗?也许有一种更优化的方法可以做到这一点?任何提示/资源/建议都将不胜感激!
在应用新的SCNAction之前,您需要停止上一个SCNAction。
要使用密钥添加操作,请使用
cameraNode.runAction(SCNAction, forKey: String)
方法。
现在您可以通过该键删除特定操作
cameraNode.removeAction(forKey: String)