在SceneKit中使对象绕另一个轨道运行

时间:2017-03-28 15:27:34

标签: ios sprite-kit scenekit

假设我的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")

是否有#34; orbiting"的动画,以及指定目标节点的方法?

1 个答案:

答案 0 :(得分:10)

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

  1. 您在FixedPlanetNode(轨道行星)的中心处添加了 HelperNode ,可能是它的孩子,但绝对位于同一位置

  2. 您将OrbitingPlanetNode作为添加到 HelperNode ,但在其中一个轴上添加偏移,例如X轴上有10个点

  3. 您可以围绕不同的轴启动 HelperNode 旋转(及其坐标系统),例如Y轴

  4. 这将导致OrbitingPlanetNode围绕HelperNode的Y轴绕轨道运行,轨道半径为10点。

  5. 实施例

    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];
    

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