私は、3D宇宙飛行、惑星/恒星重力、船の推力、相対論的効果を組み込んだ物理エンジン/シミュレーターを書いています。これまでのところ、非常にうまくいっていますが、私が助けを必要としていることの1つは、衝突検出アルゴリズムの計算です。
私が使用している動きの反復シミュレーションは、基本的に次のとおりです。
(注:3Dベクトルはすべて大文字です。)
For each obj
obj.ACC = Sum(all acceleration influences)
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2 (*EQ.2*)
obj.VEL = obj.VEL + (obj.ACC * dT)
Next
どこ:
obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object
obj.Radius is the radius (scalar) of the object
dT is the time delta or increment
基本的に私がする必要があるのは、上記の(EQ.2)から派生した2つのオブジェクト(obj1、obj2)の効率的な式を見つけて、それらが衝突するかどうか、衝突する場合はいつかを判断することです。正確な時刻が必要なのは、それがこの特定の時間増分にあるかどうかを判断できるようにするため(加速度は時間増分ごとに異なるため)と、正確な位置を特定できるようにするためです(これは、時間)
このエンジンでは、すべてのオブジェクトを球としてモデリングしています。この式/アルゴリズムで行う必要があるのは、どのポイントであるかを把握することだけです。
(obj1.POS - obj2.POS).Distance = (obj1.Radius + obj2.Radius)
ここで、.Distanceは正のスカラー値です。(これが簡単な場合は、.Distance計算に暗黙的に含まれる平方根関数を回避するために、両側を2乗することもできます)。
(はい、私は他の多くの衝突検出の質問を知っていますが、それらの解決策はすべてそれらのエンジンと仮定に非常に特有であるようであり、シミュレーションの増分内で適用される3D、球、および加速度の条件に一致するものはないようです。私が間違っているかどうか教えてください。)
いくつかの説明:
1)時間増分の前後で2つの球の交差をチェックするだけでは不十分です。多くの場合、それらの速度と位置の変化はそれらの半径をはるかに超えます。
2)RE:効率性、衝突の可能性のある候補を決定することに関して(とにかくこの時点で)助けは必要ありません、私はそれをカバーしていると思います。
たくさん出てくるように思われる別の説明:
3)増分移動の私の方程式(EQ.2 )は、速度と加速度の両方を適用する2次方程式です。
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2
私が見た物理エンジン(そして確かに私が今まで聞いたすべてのゲームエンジン)では、速度のみを適用する増分運動の線形方程式のみ:
obj.POS = obj.POS + (obj.VEL * dT)
これが、StackOverflow、Wikipedia、およびWeb全体で見られる、2つの線分の交差/最も近いアプローチの検出など、一般的に公開されている衝突検出ソリューションを使用できない理由です。私のシミュレーションでは、結果の基本となる可変加速度を扱っているため、必要なのは2つの放物線セグメントの交差/最も近いアプローチです。