Как получить правильные значения из SCNTransaction во время выполнения?

Я пытался получить значения из определенного объекта SceneKit, который изменен SCNTransaction следующим образом:

(focalLength изначально 50)

      SCNTransaction.begin()
SCNTransaction.animationDuration = 5.0
cameraNode.camera?.focalLength = 24
SCNTransaction.commit()

SCNTransaction выполняется нормально и делает именно то, что должно, а объект камеры уменьшается.

В течение этого периода транзакции я хочу получить текущую «focalLength», поскольку она применяется транзакцией SCNTransaction в любой момент времени.

      print("Current focalLength: \(cameraNode.camera?.focalLength)")

Результат всегда равен 24 - конечное значение - независимо от того, получаю ли я значение в 0, 1 или 3 секунды. Поэтому я предполагаю, что SCNTransaction выполняет эту плавную модификацию каким-то образом внутри. Есть ли способ получить реальные значения из текущей SCNTransaction. Кто-нибудь может подробно объяснить, что происходит внутри SCNTransaction?

PS: конечно, я мог бы сделать SCNAction.cutomAction или CABasicAnimation, но мне было интересно, есть ли способ получить значения из SCNTransaction.

1 ответ

Доступ к этому можно получить через узелpresentationNode:

Когда вы используете неявную анимацию (см. SCNTransaction) для изменения свойств узла, эти свойства узла немедленно устанавливаются в свои целевые значения, даже если содержимое анимированного узла переходит от старых значений свойств к новым. Во время анимации SceneKit поддерживает копию узла, называемого узлом представления, свойства которого отражают временные значения, определяемые любыми анимациями в полете, которые в данный момент влияют на узел. Свойства узла представления обеспечивают близкое приближение к версии узла, отображаемой в данный момент. SceneKit также использует узел представления при вычислении результатов явной анимации, физики и ограничений.

      print("Current focalLength: \(cameraNode.presentation.camera?.focalLength)")
Другие вопросы по тегам