我正在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