2

私は、ミサイルなどのさまざまなオブジェクトに重力が作用する惑星を持つ物理ベースのゲームを書いています。(Farseer Physicsエンジンを使用)

メインのゲームプレイでは、固定されたタイムステップで単一の物理シミュレーションを使用しています。これはすべてうまく機能し、美しく機能します。

ここに問題があります。特定の発射体の経路を将来に投影するために、より大きなタイムステップを持つ2番目の物理シミュレーターを使用しています。基本的に、惑星やその他の静的な重力生成エンティティを含むパラレルユニバース(これらの投影シミュレーションをリアルタイムで実行しているため、高速である必要があり、したがってタイムステップが大きくなります)。

わずかに異なる結果を生成しています。

タイムステップごとに実行される基本的なコードは次のとおりです。

 Vector2 force = GravityStrength / centerToCenterDist.LengthSquared() /  Math.Sqrt(centerToCenterDist.LengthSquared()) * body1.Mass * body2.Mass * centerToCenterDist;

//GravityStrength is in addition to the Mass calculations

私のパラレルユニバースのタイムステップは現在(5.0 *タイムステップ)です。

結果を次のように変更することで、結果の違いを修正しようとしました。

force = (force * (timestep+1))

私の質問:並列シミュレーターで異なるタイムステップを使用してメインシミュレーターの結果を複製することは可能ですか?

私の数学はあまり良くないので、考えられる解決策を見つけるのに問題を考えるのに苦労しています。非線形タイプの方程式が関係しているため、それは不可能だと思います。
その場合、近い結果を得るのに合理的に正確な方法はありますか?

4

1 に答える 1

1

これは物理学の問題ではなく数学の問題ですが、答えはノーです。シミュレーション(任意のシミュレーション)は近似値であり、いくつかの変数に大きく依存します。

この場合、それは基本的なオイラー法シミュレーションのように見えます。表示されているのは、2つのシミュレーションのグローバル切り捨てエラーの違いです。つまり、各シミュレーションには固有の異なるエラー特性があります。

たとえば、「接近に近い」場合には、はるかに発散したシミュレーションが表示されます(2つの物体が大幅に偏向すると、誤差が大きくなります)。2つのモデルを組み合わせた場合よりも修正が複雑になるため(つまり、計算能力が必要になるため)、修正することはできません。

于 2012-03-01T02:29:36.397 に答える