为啥我不能使用 CAKeyframeAnimation 在 eulerAngle 上为 SCNnode 设置动画
Posted
技术标签:
【中文标题】为啥我不能使用 CAKeyframeAnimation 在 eulerAngle 上为 SCNnode 设置动画【英文标题】:Why I can't animate the SCNnode on eulerAngle using CAKeyframeAnimation为什么我不能使用 CAKeyframeAnimation 在 eulerAngle 上为 SCNnode 设置动画 【发布时间】:2021-12-21 19:31:37 【问题描述】:我正在尝试使用 CAKeyframeAnimation 为 SCNnode 设置动画,我能够毫无问题地更改对象的位置,但无法为 EulerAngle 属性的更改设置动画。
下面的代码改变了节点的位置。
func animatePlaneKey(nodeToAnimate: SCNNode)
let pos = nodeToAnimate.position
let animation = CAKeyframeAnimation(keyPath: "position")
let pos1 = SCNVector3(pos.x, pos.y, pos.z)
let pos2 = SCNVector3(pos.x + 1 , pos.y, pos.z)
let pos3 = SCNVector3(pos.x + 1 , pos.y, pos.z + 1)
animation.values = [pos1,pos2, pos3]
animation.keyTimes = [0,0.5,1]
animation.calculationMode = .linear
animation.duration = 10
animation.repeatCount = 1
animation.isAdditive = true
nodeToAnimate.addAnimation(animation, forKey: "position")
下面的应该更改 eulerAngles 属性但不起作用。 知道为什么我不能为旋转设置动画吗?
func animatePlaneKey(nodeToAnimate: SCNNode)
let animation2 = CAKeyframeAnimation(keyPath: "rotation")
let angles = nodeToAnimate.eulerAngles
let rot0 = SCNVector3(angles.x, angles.y, angles.z)
let rot1 = SCNVector3(angles.x, angles.y + Float(deg2rad(45)) , angles.z)
animation2.values = [rot0, rot1]
animation2.keyTimes = [0, 1]
animation2.duration = 2
animation2.repeatCount = .infinity
animation2.isAdditive = true
nodeToAnimate.addAnimation(animation2, forKey: "rotation")
感谢您的帮助。
【问题讨论】:
我推荐:SCNAction.rotate(by: around, duration) - i.Ex: let rotate = SCNAction.rotate(by: CGFloat.pi*2, around: SCNVector3(0,1,0 ),持续时间:5.0) - 这会将 Y 轴上的节点旋转 360 度。您可以重复 SCNAction - 也可以永远重复。 SCNNode 旋转属性是一个 SCNVector4。将旋转更改为 SCNVector4,或将 keyPath 更改为“eulerAngles”。 【参考方案1】:您必须使用 SCNVector4 类型(又名四元数)而不是 SCNVector3 类型(又名 Euler)。
还有一个键“旋转”而不是“旋转”。
let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!
let animation = CABasicAnimation(keyPath: "rotation")
let start = SCNVector4(0, 0, 0, 0)
let end = SCNVector4(0, 1, 0, CGFloat(Float.pi * 6))
animation.fromValue = start
animation.toValue = end
animation.duration = 10
animation.repeatCount = .infinity
ship.addAnimation(animation, forKey: "spin around")
【讨论】:
我会尽快尝试您的解决方案,非常感谢...,以上是关于为啥我不能使用 CAKeyframeAnimation 在 eulerAngle 上为 SCNnode 设置动画的主要内容,如果未能解决你的问题,请参考以下文章