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

我不明白的一件事是何时使用 SCNAction 以及何时使用 CABasicAnimationSCNActionCABasicAnimation 之间有什么性能差异吗?

最佳答案

对于动画 SceneKit 的内容,您至少可以使用四种方法:隐式动画、显式动画、 Action 和动态。让我们探索什么是什么。

观看 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)



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 中显式动画的抽象父类(super class)。您可以使用表示几何动画的 CAAnimation 对象的属性来控制其时间、监控其进度以及附加 Action 以在动画期间触发 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")



Physics Simulation 为场景元素添加动态行为,检测接触和碰撞,模拟重力、 Spring 和车辆等真实效果。
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)

关于swift - SceneKit – SCNAction 和 CABasicAnimation 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53524443/

10-15 03:02