SceneKit – SCNAction和CABasicAnimation有什么区别?

时间:2018-11-28 16:53:42

标签: swift scenekit caanimation scnaction

我对SceneKit和SpriteKit还是很陌生,并且刚开始为某些SCNNode设置动画。

我不了解的事情是何时使用SCNAction和何时使用CABasicAnimationSCNActionCABasicAnimation之间有什么性能差异?

1 个答案:

答案 0 :(得分:2)

要对SceneKit的内容进行动画处理,可以使用至少四种方法:隐式动画,显式动画,动作和动态。让我们探索什么是什么。

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

SCNAction是一个简单的可重复使用的动画,它会更改附加到其上的任何节点的属性。您可以根据需要为每个对象使用任意数量的SCNActions。将其视为复杂得多的动画的最简单的动画构建基块,其中一个3D对象包含多个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.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的实例。

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)

希望这会有所帮助。