【问题标题】:scenekit swift spaceship jittery movement with camera followScenekit 快速宇宙飞船抖动运动与相机跟随
【发布时间】:2018-12-29 07:05:45
【问题描述】:

我目前正在使用 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;
}

除了只是跟随船,当你改变方向时,它会添加一些漂亮的偏移运动,以获得一个漂亮的流体相机。

我面临的问题是船在很长一段时间内来回出现故障,它总是朝着正确的方向移动,但看起来船的位置似乎正在重置几帧。您可以通过this video 看到这一点。

如果没有相机跟随代码,船的移动会更加顺畅,正如您在 this video 中看到的那样

任何人都可以看到我的代码可能效率低下的任何问题吗?也许有更优化的方法来做到这一点?非常感谢任何提示/资源/建议!

【问题讨论】:

    标签: ios swift scenekit


    【解决方案1】:

    在应用新的 SCNAction 之前,您需要停止之前的 SCNAction。

    要使用键添加操作,请使用

    cameraNode.runAction(SCNAction, forKey: String)
    

    方法。

    现在您可以通过该键删除特定操作

    cameraNode.removeAction(forKey: String)
    

    【讨论】:

    • 嗯,当我添加 forKey 参数时,相机根本无法跟踪。我刚刚添加了cameraNode.runAction(action, forKey: "cameraMove"),它确实可以跟踪。也不跟踪removeAction
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2011-01-30
    • 2017-06-06
    • 2013-12-07
    • 2015-08-11
    相关资源
    最近更新 更多