2017-03-28 10 views
3

SceneKitシーンに2つのノードがあるとします。私は周りを回るか、または軌道を回る惑星(星を周回する惑星のような)を、ある時間間隔にもう一回ノードを回したい。私はそうのようなアニメーションを設定することができます知っている:SceneKitで別のオブジェクトの軌道を作る

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") 

「周回」のアニメーション、およびターゲット・ノードを指定する方法はありますか?

+1

SKConstraintを距離に設定できます(つまり、あなたの「衛星」は周回している物体から一定の距離に設定されています)。 –

+2

これはあなたが探しているものかもしれないhttp://stackoverflow.com/questions/34243964/follow-a-path-inverse – 0x141E

+0

@ 0x141Eこれはまさに私が探しているものです。それを回答として追加すると、私はそれを受け入れることができます。 – Timestretch

答えて

5

これを行う方法は、追加の(ヘルパー)SCNNodeを使用することです。独自の座標系を追加し、すべての子ノードがその(ヘルパー)座標系と共に移動するという事実を使用します。中心から外れている子ノードは、ワールド座標系からそれらを見ると、実際に軌道を描くことになります。

  1. あなたはおそらく、その子として、あなたのFixedPlanetNodeの中央(周回惑星)でHelperNodeを追加し、間違いなく同じ位置

  2. であなたが子としてごOrbitingPlanetNodeを追加からHelperNodeですが、のオフセットが軸の1つにあります。 X軸上の10点

  3. あなたは、例えば、異なる軸の周りに(一緒に、その座標系で)回転HelperNodeを開始

  4. この結果、OrbitingPlanetNodeは軌道半径が10ポイントのHelperNodeのY軸周りを周回するようになります。

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

座標提供するために添加Iアクション及びオブジェクトを使用これは私がよく知っているものですが、Swiftやアニメーションでは完全に実行可能でなければなりません。

関連する問題