SceneKit - SCNAction和CABasicAnimation之间有什么区别?

4

我对SceneKit和SpriteKit还很陌生,刚开始尝试给一些SCNNodes添加动画。

有一件事我不太明白,就是何时使用SCNAction,何时使用CABasicAnimation。在SCNActionCABasicAnimation之间是否存在性能差异?

2个回答

8

您可以使用至少四种方法来为SceneKit的内容添加动画效果:隐式动画、显式动画、动作和动力学。让我们来探索一下它们各自的含义。

请观看WWDC 2012SceneKit Session 504时间为28:40

SCNAction是一个简单、可重复使用的动画,可以改变您附加到任何节点上的属性。您可以为每个对象使用任意数量的SCNActions。将其视为最简单的动画构建块,用于创建包含多个SCNActions的更复杂的动画,以渲染三维对象。

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.animationDuration = 3
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的实例:要为核心动画图层或SceneKit对象设置动画,请创建具体子类CABasicAnimationCAKeyframeAnimation、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)

0
  • 实际上没有什么区别。

  • 性能上也没有差异。

  • 显然,如果您使用单独的动作,可以创建非常复杂的动画。假设您在一个组中有20个不同的动画。如果您使用单独的动作,它们可以在不同的时间开始,具有不同的长度、缓动、完成模式等等。如果您使用事务,则它们只是同时以相同的方式和时间运行。

  • 还有一些非常微小的差异,例如,事务始终对四元数动画使用最短单位弧。

简而言之,使用事务和单独的动作之间唯一的区别就是使用单独的动作可以自定义每个动画。(如果您只在组中执行“一个动画”,则事务和单独的动作之间实际上没有区别。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接