Для анимации содержимого 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)
Надеюсь, это поможет.