使用ARKIT在功能上更改SCNNODE的工作正在使应用程序停止运行



我正在Swift Playgrounds中的Arkit项目,这是我现在拥有的:

Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.animateSoldiers), userInfo: nil, repeats: true)

@objc func animateSoldiers() {
  if self.soldiersPlacedCount >= self.numberOfSoldiers {
      for node in self.allNodesSet {
          if node.name!.contains("soldier") {
              node.position = SCNVector3(x: node.position.x + 0.01, y: node.position.y, z: node.position.z)
              let pitch = sceneView.session.currentFrame?.camera.eulerAngles.x
              let yawn = sceneView.session.currentFrame?.camera.eulerAngles.y
              let roll = sceneView.session.currentFrame?.camera.eulerAngles.z
              let newRotation = SCNVector3Make(pitch!, yawn!, roll!)
              node.eulerAngles = newRotation
          }
      }
  }
}

我将问题范围缩小到了此方法。在运行iPad时运行任意次数后,该应用程序崩溃。它不断变化,我不知道发生了什么。任何帮助都将不胜感激!

而不是使用计时器,而是实现此ArsessionDelegate方法:

session(_:didUpdate:)

每当生成新帧时,就AR会话运行时,都将调用此方法。

我的建议是使用它来使scnnodes动画,切勿使用计时器。每秒有60帧,它等效于每16毫秒左右触发的计时器。

另外,使用此方法,您可以确保在每个帧中都有该节点的新位置。计时器不稳定,也不与框架同步,不会给scnnodes提供流畅的动画。

不要忘记设置会话的委托:

sceneView.session.delegate = self

相关内容

最新更新