17

長年のリスナー、初めての発信者。私は XNA で小さな趣味のゲームを作成しています。これは、海上のコンテナ船に似た、宇宙の輸送船に関するものです。制限された 2D 環境で、船と惑星/月の重力圏との遭遇を予測できる必要があります。船と惑星/月、略してボディの位置は、ケプラー軌道要素から決定されます。船と本体は両方とも同じ引力の中心を周回します。

私がこれまでに考案したアプローチは、最初に遠点と近点 (引力の中心から最も遠い点と最も近い点) でいくつかの予備的なチェックを行い、遭遇が可能かどうかを確認することです。このようなチェックの間に、船の軌道が開いている場合 (双曲線、私は放物線のケースを双曲線に近似します)、遭遇することができなかった多くのシナリオを除外できます。

これらのチェックで遭遇が可能であると判断された場合、船が遭遇に適している引力の中心からの最小距離と最大距離を決定します。次に、その最小値と最大値によって定義された 2 つの円と船の軌道の交点を取得します。これにより、船の軌道上に 0、2、または 4 つの点が生じ、ボディの球体に遭遇する可能性のある 0、1、または 2 つの期間が定義されます。この時点で交差がゼロの場合、船の軌道全体が遭遇ゾーンにある可能性があります。これはおそらくまれな極端なケースですが、カバーする必要があります。

船が軌道上でこれらのポイントを通過する時間を取得し、遭遇を確認するための 1 つまたは 2 つの時間枠を与えることができますが、そこから私の最善の解決策は、時間をステップに分割して時間範囲を検索し、ボディの位置を計算することです。それらの時間、そして出会いのテスト。

このアプローチの問題点は、出会いを効率的に見つけるためのステップを踏むサイズを知ることです。Body の位置を一度に取得するのはややコストがかかるため、できる限り少なくしたいと思いますが、ステップが大きすぎると、出会いを見逃す可能性があります。

検索スペースを減らすのに役立つ共焦点円錐形状の特性はありますか? または、実質的に円錐経路に沿って移動する点と、焦点を共有する楕円に沿って移動する円との間の遭遇/衝突を予測する他の方法はありますか。

4

3 に答える 3

1

通常のピタゴラス距離式を使用して、惑星と船の間の距離 (の 2 乗) を時間の関数として表す関数を構築してみることができます。この関数のゼロを探しているので、ニュートン法などを適用してそれらを見つけることができます。

惑星の動きが船の動きよりもはるかに遅い場合、これはうまく機能するはずです。その場合、関数は比較的滑らかになり、ニュートンの方法は問題なく収束します。ただし、惑星の動きが船の動きよりもはるかに速い場合、この距離関数は、放物線のような曲線に重ねられた「ばね」のように上下に跳ね返り、x 軸と数回交差する可能性があります。ニュートン法は、導関数が急速に方向を変えるような関数で問題を起こすことがあります。

うまくいけば、距離関数を構築するときに一部の項が相殺されるか、そうでなければ式を単純化または近似できますが、そうでない場合は、垂直方向と水平方向のゼロを探すだけで十分な場合があります。(実際には、惑星の軌道の長軸など、任意の軸に沿った距離を選択できます。) これらの関数のいずれかのゼロは必要ですが、衝突の十分条件ではなく、計算が簡単になる場合があります。時間でソートされた x 方向のゼロのリストがあり、y 方向のゼロについても同じである場合、リストのマージ (マージソートのような) との交点を計算することで、真の衝突を見つけることができます。

于 2013-03-15T03:48:06.590 に答える
1

放射状の衝突検出 (円) を使用します。1 つの円は惑星の重力の影響 (惑星自体よりも大きくなります) を表し、別の円は各船に対応し、各円の中心点が直線で互いに近づくようにします。距離が短くなるにつれてわずかに。

各円が持つプルの量を各船の移動速度に適用します。移動は単純な三角関数 (x の場合は cos()、y の場合は sin()) だけで実行でき、複雑な計算は必要ありません。任意の 2 つのオブジェクト間の距離がそれらの半径の合計よりも小さい場合、衝突が発生しています。

しかし、この形式の衝突を「重力円」だけで行う場合、いわばそれらが衝突するとき、反復ごとに船の速度を少しずつ上げて重力をシミュレートすることができます。

于 2013-03-14T21:09:10.630 に答える