楕円軌道モデリング


8

私は単純な2Dゲームで軌道で遊んでいます。このゲームでは、船が宇宙空間を飛び回り、巨大なものに引き付けられます。船の速度はベクトルに保存され、ニュートンの万有引力の法則を考慮して、必要に応じてフレームごとに加速度が適用されます。点の質量は移動しないので(現在は1つしかありません)、楕円軌道を期待します。

代わりに、私はこれを見ます:

これは私が見るものです

私はほぼ円形の軌道で試してみましたが、質量を大幅に(100万倍)異ならせようとしましたが、常にこの回転軌道を取得しています。

コンテキスト用の(D)コードを次に示します。

void accelerate(Vector delta)
{
    velocity = velocity + delta; // Velocity is a member of the ship class.
}

// This function is called every frame with the fixed mass. It's a
// method of the ship's.
void fall(Well well)
{
    // f=(m1 * m2)/(r**2)
    // a=f/m
    // Ship mass is 1, so a = f.
    float mass = 1;
    Vector delta = well.position - loc;
    float rSquared = delta.magSquared;
    float force = well.mass/rSquared;
    accelerate(delta * force * mass);
}

うわ。うん。D.既知の結果に対するその数学コードの単体テスト。そして、すべてがうまくいきます。
deceleratedcaviar

回答:


7

バグはfall関数にあります。我々は持っています

  1. delta:井戸から船へのベクトル
  2. force:これら2つの物体間の重力の大きさ。

|force| G * m1 * m2 / r ^ 2

しかし|delta|、すでにrです!加速が速すぎます。r加速を呼び出す前に、再度除算する必要があります(基本的にデルタベクトルを正規化します)。

accelerate(delta * well.mass * mass / rSquared / Math.sqrt(rSquared))

4

数学のバグが修正されていても、オイラー積分を使用している(つまりvelocity += delta、おそらくposition += velocity)ので、時間の経過とともに軌道楕円が回転し、楕円が大きくなるなどの奇妙な効果が得られることに注意してください。オイラー積分はエネルギーの節約を保証しないため、/小さい。

エネルギーを節約し、軌道力学に適している、飛躍的な統合に切り替えることができます。また、シミュレーションにフレームレートに依存しないように、方程式にフレーム時間を含める必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.