在功能中使用ARKit更改SCNNode会使应用停止运行

时间:2019-03-21 01:50:23

标签: swift scenekit arkit

我正在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上运行任意次数后,该应用程序崩溃。它一直在变化,我不知道发生了什么。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

代替使用Timer,而是实现以下ARSessionDelegate方法:

session(_:didUpdate:)

每次生成新帧时,只要AR会话正在运行,就会循环调用此方法。

我的建议是使用它为SCNNodes动画,不要使用计时器。每秒有60帧,相当于一个定时器,每16毫秒触发一次。

此外,通过此方法,请确保在每个帧中节点都有一个新位置。计时器不稳定,并且与框架不同步,它们不会给SCNNode提供流畅的动画。

别忘了设置会话的代表:

sceneView.session.delegate = self