衝突チェックのために2つの高速移動オブジェクトを送信する必要があるかどうかの判断


8

基本的な2D物理エンジンを実行しています。これはほとんどパーティクルエンジンであり、AABBや円などの基本的な形状を使用するだけなので、回転はできません。私はCCDを実装しており、2つの高速移動オブジェクトに正確なTOIを与えることができ、すべてがスムーズに機能しています。

今の私の問題は、最初に2つの高速移動オブジェクトを互いにチェックする必要があるかどうかを判断する方法を理解できないことです。空間分割と高速移動オブジェクトごとに四分木を使用しています。通過する各セル内のオブジェクトと照合します。これは、静的なジオメトリとの衝突を決定するのにうまく機能しますが、衝突する可能性があるが、チェックされているセルのいずれにもない他の高速移動オブジェクトは考慮されないことを意味します。

私が考えることができる唯一の解決策は、セルを十分に大きくして、これで十分であるフィンガーをクロスさせるか、ある種のブルートフォースアルゴリズムを実装することです。これに対処する適切な方法はありますか、おそらく誰かがこの問題を効率的な方法で解決しました。それとも、これを説明するスペースを分割するより良い方法があるでしょうか?

ここに図があります:

ここに画像の説明を入力してください

オブジェクトAとBの「影響範囲」が交差しているため、それらを相互にチェックする必要があります。しかし、現在衝突をチェックしている方法では、これは考慮されていません。繰り返しになりますが、速度がxまたは何かよりも高くなったときにオブジェクトのパスが交差するかどうかを実際にチェックするなど、これに対するいくつかの解決策を考えることができますが、それはハックのように感じ、試行錯誤します。


メソッドが失敗するシナリオの例を教えてください。
あんこ

1
オブジェクトAとBはこの構成にあります:[A] [] [B]。Aは右向き、Bは左向きです。彼らは速く行きます。衝突チェックは次のように行われます。Aの次のセルは空ですか?はい、中央のセルには何もありません。Bの次のセルは空ですか?はい。衝突はありません。しかし、実際の物理学は、AとBが衝突する可能性が高いことを示します(特に、この1次元ゲームでは、私は;)
Cystack

@Cystack CCDを実装しています。あなたが説明した状況は問題ではありません。2つのオブジェクトは互いにまっすぐに進んでおり、私が説明した実装はそれを拾って解決します。
dreta

状況の物理学は明らかです。オブジェクトを事前に「高速移動」として識別できるとしましょう。次に、衝突チェックを行う場合、オブジェクトが現在あるセルだけでなく、最後のタイムステップで通過したすべてのセルをチェックする必要があります。したがって、上の画像で描いた緑の帯全体のように、動きの速い各オブジェクトには実際には複数の場所があります。
theJollySin

@theJollySin私はあなたが与えている解決策をすでに説明しました、それはハック、特別なケースです、もしあれば一般的な解決策を探しています。
dreta

回答:


5

あなたが話している問題はしばしば「ブロードフェーズ衝突検出」と呼ばれ、あなたの解決策は「スイープされたボリューム」であり、実際にはハックではなく、それがどのように行われるかだけです(モーションの開始と終了の両方を含むオブジェクトのAABBを単純に取り、衝突にはこれを使用します-ただし、回転により少しトリッキーになります)。

次に、これを高速にするブロードフェーズ衝突検出アルゴリズムへの移行を「スイープとプルーン」と呼びます。


この問題が発生する前に、SAPを破棄しました。私はこれをJavaScriptで行っているため、リストのオーバーヘッドが顕著になり、パフォーマンスに関して配列の信頼性が低下する可能性もあります。私は物事を再考する必要があると思います。おかげで、アルゴリズムは実際に問題を解決します。
dreta 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.