使用 Swift 在 Scenekit 中移动相机
Posted
技术标签:
【中文标题】使用 Swift 在 Scenekit 中移动相机【英文标题】:Move camera in Scenekit with Swift 【发布时间】:2018-08-19 18:51:36 【问题描述】:我想在 Scenekit 的 z 轴上每帧自动移动相机。我已经用 Swift 编写了这段代码:
func renderer(_ renderer: SCNSceneRenderer,
updateAtTime time: TimeInterval)
cameraNode.position.z = cameraNode.position.z + 2
这仅适用于 3 帧,之后相机不再移动。有人可以给我正确的代码,以便相机每帧自动移动吗?
【问题讨论】:
确保您的场景正在播放。scnView.isPlaying = true
【参考方案1】:
根据SceneKit documentation:
SceneKit 每帧只调用一次此方法,只要显示场景的 SCNView 对象(或其他 SCNSceneRenderer 对象)没有暂停。
如果您的视图中没有其他东西在移动,则场景“暂停”并且不会渲染。根据this question,为了强制每帧渲染,解决方法应该是:
sceneView.loops = true
但是,每帧更新位置并不是最佳做法,因为 FPS 可能会发生变化,这会影响相机速度。但是您可以使用 SCNAction 保持一致的相机速度,而无需使用渲染功能:
let move = SCNAction.moveBy(x: 0, y: 0, z: 120, duration: 1.0)
let moveForever = SCNAction.repeatActionForever(move)
cameraNode.runAction(moveForever)
这也将使您的相机在需要停止时更容易控制,并且在不必要时不会强制渲染。
【讨论】:
我可以工作,但是为什么没有 moveyBy 的代码使用 Spritekit 中的 update(....) 函数而不使用 Scenekit 中的渲染器函数? 您能否添加一个带有时间戳或其他内容的打印函数,以确保它被调用。此外,如果您的 FPS 不是恒定的,您的相机速度会发生变化,但使用 SCNAction,速度将是固定的 我可以创建一个打印函数,我看到它被调用了 3 次,之后不再调用该函数。 我更新了答案。这是你要找的吗? 对,我也是这么想的。以上是关于使用 Swift 在 Scenekit 中移动相机的主要内容,如果未能解决你的问题,请参考以下文章