Неверные значения положения SCNNode после CAKeyframeAnimation - PullRequest
0 голосов
/ 24 апреля 2018

Я запустил 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)

Я не могу получить никакой обратной связи о том, как позиция узла перемещается на сцене, поэтому я не могу выполнить какой-либо расчет на основе позиции узла.

1 Ответ

0 голосов
/ 03 августа 2018

Посмотрите на свойство вашего узла .presentation.Вот где позиция узла в то время как анимация действует на узел.

Для вас выведите fishNode.presentation.position вместо fishNode.position

Из Apple doc:

Свойства узла презентации обеспечивают близкое приближение к версииузел, который отображается в данный момент.

https://developer.apple.com/documentation/scenekit/scnnode/1408030-presentation

...