1

惑星が星を周回する簡単な惑星シミュレーションを作成しました。軌道のコードは次のとおりです。

    a = a + vel * delta;
    planetX = Math.cos(a) * orbitRadius + parentStar.getX();
    planetY = Math.sin(a) * orbitRadius + parentStar.getY();

これで問題なく動作しますが、私の問題は、軌道が星の中心を回る惑星の中心からではないことです。 これが起こることです

ご覧のとおり、小さな円の最初の赤い点は、2 番目の小さな赤い点の周りを周回する惑星の位置です。これは、円が (0,0) から描かれているため、両方の惑星 (0,0 ) は、星の (0,0) の周りを一周します。

星の原点ではなく、星の中心を一周する惑星の中心が必要です。

これに対する良い修正はありますか?

4

2 に答える 2

0

今のところ、私が考えることができる最も適切な方法は、星の世界座標を取得し、それらをすべてのフレームで子の座標に渡すことです。そうすると、子はすべてのフレームで同じ座標を持つことになります。

次の部分は、それを変換し、星の周りを回転させます。これを達成する方法は、sin(x)*cos(x) で星の位置によって転置されるように惑星の位置を設定することです。

例を示しましょう。

惑星[0] = 星[0] + sin(角度)*スケール

惑星[1] = 星[1] + cos(角度)*スケール

角度が段階的に変化し、スケールが子オブジェクトをその親からさらにシフトし、定数を維持して (または必要に応じて変更して)、「新しい」中心からの半径を増やします。

行列や他のタイプの変換について言及する人もいるかもしれませんが、この状況では、上記の解決策が最も関連性が高く、最もクリーンであると思いますp

それが機能する方法は、親の 'WORLD 座標' を取得し、それらを子のものに設定することです。Scale 値を変更することで、オブジェクトの中心からの距離を増やし (重ならないように)、これに指定した角度の sin と cos を掛けて回転させます。

PS レンダリングに FPS 依存のエンジンを扱っている場合、FPS が高いほどシミュレーションが高速になることに注意してください。また、その逆も同様です。たとえば、100 と比較します。したがって、角度をそれぞれ 1000 倍または 100 倍します。この問題が発生した場合は、可能であれば一定のフレームレートを設定してみてください。これは、軽量シミュレーションの最も簡単な回避策です。

編集:あなたのケースのすべてのオブジェクトに対してこの概念が機能することを忘れていました。リレーションシップを処理し、各オブジェクトが軌道の位置と角度を持つ eqch オブジェクトの関数を個別に使用する必要があります (別のオブジェクトの周りを周回する場合)。

于 2016-01-30T16:46:40.720 に答える