【问题标题】:Move camera in Scenekit with Swift使用 Swift 在 Scenekit 中移动相机
【发布时间】: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

标签: swift camera scenekit


【解决方案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 次,之后不再调用该函数。
  • 我更新了答案。这是你要找的吗?
  • 对,我也是这么想的。
猜你喜欢
  • 2017-03-28
  • 2020-06-21
  • 2012-09-17
  • 2017-03-27
  • 1970-01-01
  • 2018-07-18
  • 2015-10-29
  • 2016-12-16
  • 2015-06-14
相关资源
最近更新 更多