假设我的 SceneKit 场景中有 2 个节点。我希望一个围绕或绕轨道运行(就像行星围绕恒星运行),另一个节点在某个时间间隔内旋转一次。我知道我可以像这样设置动画:

let anim = CABasicAnimation(keyPath: "rotation")
anim.fromValue = NSValue(scnVector4: SCNVector4(x: 0, y: 1, z: 0, w: 0))
anim.toValue = NSValue(scnVector4: SCNVector4(x: 0, y: 1, z: 0, w: Float(2 * Double.pi)))
anim.duration = 60
anim.repeatCount = .infinity
parentNode.addAnimation(aim, forKey: "spin around")

是否有“轨道”动画,以及指定目标节点的方法?

最佳答案

这样做的方法是使用额外的(帮助程序)SCNNode。您将使用它添加自己的坐标系并且其所有子节点将与该(辅助)坐标系一起移动的事实。如果您从世界坐标系中查看偏离中心的子节点,它们将有效地在轨道上运行。

  • 您在 FixedPlanetNode(轨道行星)的 中心 添加 HelperNode ,可能是它的 child ,但绝对在相同的位置
  • 您将 OrbitingPlanetNode 作为 子节点 添加到 HelperNode ,但在轴之一上具有 偏移量 ,例如X 轴上的 10 个点
  • 您启动 HelperNode 围绕 不同的 轴旋转(连同其坐标系),例如Y 轴
  • 这将导致 OrbitingPlanetNode 围绕 HelperNode 的 Y 轴运行,轨道半径为 10 点。

  • 例子
    earthNode - 固定轨道行星
    moonNode - 轨道行星
    helperNode - 添加辅助节点以提供坐标系
    // assuming all planet geometry is at the centre of corresponding nodes
    // also helperNode.position is set to (0, 0, 0)
    [earthNode addChildNode:helperNode];
    moonNode.position = SCNVector3Make(10, 0, 0);
    [helperNode addChildNode:moonNode];
    
    // set helperNode to rotate forever
    SCNAction * rotation = [SCNAction rotateByX:0 y:3 z:0];
    SCNAction * infiniteRotation = [SCNAction repeatActionForever:rotation];
    [helperNode runAction:infiniteRotation];
    

    我使用了 Action 和objective-c,因为这是我熟悉的,但在Swift和动画中应该是完全可行的。

    10-08 14:51