SceneKit - В чем разница между SCNAction и CABasicAnimation? - PullRequest
0 голосов
/ 28 ноября 2018

Я все еще очень плохо знаком с SceneKit и SpriteKit и только начал работать над анимацией некоторых узлов SCN.

Одна вещь, которую я не понимаю, это когда использовать SCNAction и когда использовать CABasicAnimation.Есть ли разница в производительности между SCNAction и CABasicAnimation?

1 Ответ

0 голосов
/ 29 ноября 2018

Для анимации содержимого SceneKit вы можете использовать как минимум четыре подхода: неявная анимация, явная анимация, действия и динамика.Давайте рассмотрим, что к чему.

Смотреть WWDC 2012 SceneKit Session 504 . Время 28: 40 .

SCNAction - это простая, многократно используемая анимация, которая изменяет атрибуты любого узла, к которому вы ее присоединяете.Вы можете использовать столько SCNActions для каждого объекта, сколько пожелаете.Воспринимайте его как простейший строительный блок анимации для очень сложной анимации, содержащий несколько SCNActions для одного 3D-объекта.

let action = SCNAction.repeatForever(SCNAction.rotate(by: .pi, 
                                                  around: SCNVector3(0, 1, 0), 
                                                duration: 3))
sphereNode.runAction(action)

Чаще всего действия используются для изменения структуры и содержимого объекта SCNNodeк которому они прикреплены, но вы также можете использовать действия и вносить другие изменения в сцену.В SceneKit действия обеспечивают простой способ реализации анимированного поведения, которое часто изменяется в ответ на пользовательский ввод.

SCNTransaction - это механизм для создания неявных анимаций и объединения изменений графа сцены ватомарные обновления.

@IBAction func fallAndFade(_ sender: Any) {
    SCNTransaction.animationDuration = 3.0
    sphereNode.position.y = -10
    sphereNode.opacity = 0.25
}

или

SCNTransaction.begin()
SCNTransaction.setAnimationDuration(3.0)
sphereNode.position.y = -10
sphereNode.opacity = 0.25
SCNTransaction.commit()

CAAnimation - это абстрактный суперкласс для явной анимации в Core Animation.Вы можете использовать свойства объекта CAAnimation, представляющего геометрическую анимацию, для управления ее синхронизацией, отслеживания ее хода и прикрепления действий, которые SceneKit запускает во время анимации.

let animation = CABasicAnimation(keyPath: "geometry.extrusionDepth")
animation.fromValue = 0.0
animation.toValue = 100.0
animation.duration = 1.0
animation.autoreverses = true
animation.repeatCount = .infinity
textNode.addAnimation(animation, forKey: "extrude")

CAAnimation обеспечивает базовую поддержкудля протоколов CAMediaTiming и CAAction.Вы не создаете экземпляр CAAnimation: для анимации слоев Core Animation или объектов SceneKit создаете экземпляры конкретных подклассов CABasicAnimation , CAKeyframeAnimation , CAAnimationGroup или CATransition.

Физическое моделирование добавляет динамическое поведение к элементам сцены, обнаруживает контакты и столкновения, моделирует реалистичные эффекты, такие как гравитация, пружины и транспортные средства.

let node = SCNNode(geometry: SCNSphere(radius: 1.0))
scene.rootNode.addChildNode(node)
node.physicsBody = SCNPhysicsBody.dynamicBody()
scene.physicsWorld.gravity = SCNVector3(x: 0, y: -5, z: 0)

Надеюсь, это поможет.

...