SceneKit – SCNAction 和 CABasicAnimation 有啥区别?

Posted

技术标签:

【中文标题】SceneKit – SCNAction 和 CABasicAnimation 有啥区别?【英文标题】:SceneKit – What's the difference between SCNAction and CABasicAnimation?SceneKit – SCNAction 和 CABasicAnimation 有什么区别? 【发布时间】:2018-11-28 16:53:41 【问题描述】:

我对 SceneKit 和 SpriteKit 还是很陌生,刚刚开始制作一些 SCNNode 的动画。

我不明白什么时候使用SCNAction,什么时候使用CABasicAnimationSCNActionCABasicAnimation 之间有性能差异吗?

【问题讨论】:

【参考方案1】:

要为 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 对象设置动画,请创建具体子类 CABasicAnimationCAKeyframeAnimation、CAAnimationGroup 或 CATransition 的实例。

Physics Simulation 为场景元素添加动态行为,检测接触和碰撞,模拟重力、弹簧和车辆等真实效果。

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)

【讨论】:

以上是关于SceneKit – SCNAction 和 CABasicAnimation 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

SCNAction.rotateByAngle 旋转在 El Capitan 或 Metal 中反转

SCNAction 完成处理程序等待手势执行

将scenekit和spritekit组合在一个屏幕中

如何在 SceneKit 中显示金属和透明纹理?

SpriteKit 和 SceneKit – 如何完全暂停游戏?

SceneKit + Collada + 动画