swift - SceneKit – SCNAction 和 CABasicAnimation 有什么区别?
问题描述
我对 SceneKit 和 SpriteKit 还是很陌生,刚刚开始制作一些 SCNNode 的动画。
我不明白的一件事是何时使用SCNAction
以及何时使用CABasicAnimation
. SCNAction
和之间有任何性能差异CABasicAnimation
吗?
解决方案
要为 SceneKit 的内容制作动画,您至少可以使用四种方法:隐式动画、显式动画、动作和动态。让我们探索一下什么是什么。
观看 WWDC 2012 SceneKit 会议 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 的实例:要为核心动画层或 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)
推荐阅读
- groovy -
预期,在 Groovy 中为变量赋值得到“=” - amazon-web-services - AWS CLI:解析参数'--item'时出错:预期:'=',收到:'"' 用于输入:
- javascript - 在视图中显示来自控制器的信息时出现问题
- shopify - Zipify 替代品(免费或更便宜)
- javascript - 为什么添加 .eslintrc 文件会导致错误:保留关键字“import”
- asp.net - 将 CSV 文件导入到 gridview 时如何删除它?
- android-studio - 启动模拟器时出现模拟器错误?
- qt - QSpinbox editingFinished 上/下箭头上的信号
- c++ - 为什么 c++11 不允许使用 auto 进行直接列表初始化
- yii2 - 如何将参数从控制器传递到视图内的另一个视图(表单)