【问题标题】:Make an object orbit another in SceneKit在 SceneKit 中使一个物体绕另一个轨道运行
【发布时间】:2017-08-21 18:31:08
【问题描述】:

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

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

【问题讨论】:

  • 您可以为距离设置一个 SKConstraint(即,您的“卫星”设置为距它正在运行的物体的固定距离),然后给它一个脉冲?
  • @0x141E 这正是我正在寻找的。如果您将其添加为答案,我可以接受。

标签: ios sprite-kit scenekit


【解决方案1】:

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

  1. 您将 HelperNode 添加到您的 FixedPlanetNode(轨道行星)的中心,可能是它的子节点,但绝对在同一位置

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

  3. 您启动 HelperNode 围绕 不同 轴旋转(连同其坐标系),例如Y轴

  4. 这将导致 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 和动画中应该是完全可行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多