我正在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上运行任意次数后,该应用程序崩溃。它一直在变化,我不知道发生了什么。任何帮助表示赞赏!
答案 0 :(得分:0)
代替使用Timer,而是实现以下ARSessionDelegate方法:
session(_:didUpdate:)
每次生成新帧时,只要AR会话正在运行,就会循环调用此方法。
我的建议是使用它为SCNNodes动画,不要使用计时器。每秒有60帧,相当于一个定时器,每16毫秒触发一次。
此外,通过此方法,请确保在每个帧中节点都有一个新位置。计时器不稳定,并且与框架不同步,它们不会给SCNNode提供流畅的动画。
别忘了设置会话的代表:
sceneView.session.delegate = self