Я запустил CAKeyframeAnimation на SCNNode, добавленном к сцене спрайт-набора (проект ARKit).
Узел движется отлично и корректно запускает события запуска / остановки анимации. Однако значения положения узла остаются неизменными.
Вот добавление узла, я проверил, что он добавляется один и только один раз:
let plane = SCNPlane(width: 0.1, height: 0.1)
plane.firstMaterial?.diffuse.contents = UIImage(named: "fish_idle_1_\(GameManager.selectedFishSkin+1)")
fishNode = SCNNode(geometry: plane)
fishNode.name = "fish"
fishNode.constraints = [SCNBillboardConstraint()]
sceneView.scene.rootNode.addChildNode(fishNode)
Запуск анимации, работает корректно:
let pendulumSwings = CAKeyframeAnimation(keyPath: "translation")
pendulumSwings.duration = time
pendulumSwings.repeatCount = 1
pendulumSwings.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
pendulumSwings.values = computedVectors
pendulumSwings.delegate = self
fishNode.removeAllAnimations()
fishNode.addAnimation(pendulumSwings, forKey: nil)
Код делегата:
extension Game: CAAnimationDelegate {
func animationDidStart(_ anim: CAAnimation) {
guard let viewController = viewController else { return }
guard let first = viewController.anchors.first else { return }
guard let last = viewController.anchors.last else { return }
print("START \(fishNode.position)")
print("SCENE START \(viewController.sceneView.scene.rootNode.childNode(withName: "fish", recursively: false)!.position)")
}
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
guard let viewController = viewController else { return }
guard let first = viewController.anchors.first else { return }
guard let last = viewController.anchors.last else { return }
print("END \(fishNode.position)")
print("SCENE END \(viewController.sceneView.scene.rootNode.childNode(withName: "fish", recursively: false)!.position)")
}
}
Оба 4 оператора печати отображают одинаковые значения (значения зависят от варианта использования):
START SCNVector3 (x: 0.386469185, y: -0.640618205, z: 0.609007716)
Я не могу получить никакой обратной связи о том, как позиция узла перемещается на сцене, поэтому я не могу выполнить какой-либо расчет на основе позиции узла.