swift - SceneKit – SCNAction 和 CABasicAnimation 有什么区别?

标签 swift scenekit virtual-reality caanimation scnaction

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

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

最佳答案

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

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

SCNAction是一个简单的、可重复使用的动画,它可以更改您附加到的任何节点的属性。您可以根据需要为每个对象使用任意数量的 SCNActions。将其视为许多复杂动画的最简单动画构建 block ,包含一个 3D 对象的多个 SCNAction

let action = SCNAction.repeatForever(SCNAction.rotate(by: .pi, 
                                                  around: SCNVector3(0, 1, 0), 
                                                duration: 3))
sphereNode.runAction(action)

You use actions most often to change the structure and content of the SCNNode object to which they are attached, but you can also use actions make other changes to the scene. In SceneKit, actions provide an easy way to implement animated behaviors that frequently change in response to user input.

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 中显式动画的抽象父类(super class)。您可以使用表示几何动画的 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 provides the basic support for the CAMediaTiming and CAAction protocols. You do not create instance of CAAnimation: to animate Core Animation layers or SceneKit objects, create instances of the concrete subclasses CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, or CATransition.

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/

相关文章:

swift - Timer.scheduledTimer 不触发

SceneKit:理解SCNNode的pivot属性

swift - 如何将 SCNText 放置在 SCNPlane 中?

ios - 如何修改PKDrawing中的单个笔画? - PencilKit/SwiftUI

ios - AGSLocalTiledLayer 未使用 .tpk 文件加载 map

ios - 有没有办法制作暗/低光 SceneKit 场景?

ios - Hello World VR 应用

c# - 在包 'enableVrMode' 中找不到属性 'android' 的资源标识符

ios - Segue 没有被转入(swift 3)

ios - Swift 包管理器混合语言源文件