複数のオブジェクトとの衝突の場合の衝突解決


15

静的オブジェクトと可動オブジェクトがあります。衝突は、separating-axis-theoremを使用して検出されます。

たとえば、この状況では、2つの静的オブジェクト(赤)があります。

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

そして2つの間の可動オブジェクト:

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

私のアルゴリズムは、これらの2つのオブジェクト間の衝突を計算できます。また、衝突に対して完全な解像度ベクトル(最小変位ベクトル)を吐き出します。

したがって、たとえば、緑の長方形と右の赤の長方形の衝突をチェックすると、アルゴリズムは、衝突を解決するために緑の長方形を移動する方法を示すベクトルを吐き出します。

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

MSPaintでこれをすばやく描画したことに注意してください。そのため、その図では、minimum-translation-vectorが緑の長方形を上部に押し出している可能性がありますが、右は実際には短いです。

これにアプローチする一般的な方法は、一度にすべてではなく、フレームごとに1つの衝突の衝突を解決することです。しかし、私の場合、これはフリップフロップになります:

最初に、ソルバーは2つの衝突を検出しますが、右の長方形と緑の長方形の間の衝突のみを解決します。

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

次に、次のフレームで、左の赤い長方形と緑の長方形の間の衝突を1つだけ検出し、解決します。

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

ご覧のとおり、これは実際には衝突を解決しません(たとえば、緑色の長方形を一番上に押し出すことによって)。代わりに、2つの状態の間でフロップを無限にフリップします。

どうすれば解決できますか?


例では長方形を使用しています。衝突アルゴリズムは、1つの軸でのみ衝突を解決しますか?もしそうなら、あなたが説明する行動が起こっていることは理にかなっています。
カオス技術者

いいえ、すべての可能な軸上のあらゆる種類の形状で解決できます(長方形だけでなく、MSペイントで描くのが最も簡単です:P)、2つのオブジェクトを押し離す最短のベクトルを常に見つけます。
TravisG

+1良い質問です。タイトルから(2D)「タグ」を削除しました。これは避けるべきものです(メタを参照)。
bummzack

回答:


7

正確に達成しようとしているものに応じて(高い物理的精度または十分に近いリアルタイムシミュレーション)、投機的な接触を使用してみてください。

詳細は次のとおりです。http//www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an-continuous-collision-engine-approach-part-1/

彼はその記事で、あなたがそれを実装するために知っておくべきことを説明しており、他のアプローチ(球のキャスティングや衝突時間による衝突解決のソートなど)と比較して非常に簡単です。

さらに必要な場合は、彼のソースコードを(IIRC)7ドルで購入できます。

3Dでの実装のビデオを次に示します。http//www.youtube.com/watch?v = JvT2H1RmOas

1回の反復でシミュレーションの安定性に注目してください。フレームごとに複数の反復を簡単に使用して、より正確な複数の衝突を安定状態に解決できます。


2

最初に各衝突を解決するために必要なすべてのベクトルを計算してから、それらの結果を計算できます。

これがバイトできる唯一のケースは、例のようにこれらのベクトルがお互いを無効にする場合です。その場合、衝突は解決できません。


衝突に約イプシロン * 10の大きさの小さなランダムベクトルを追加しますか?残りは浮動小数点演算で処理する必要があります。
マーティンソイカ

2
はい、これはうまくいくと思います。しかし、それはまた動揺する動きを生み出す可能性があります。
ミハイマルセック

1
結果についての計算は「無限ループ」問題を修正しますが、同じサイズのタイルで作られた壁を滑らせながら移動すると身体がタイルの「割れ目」の間に立ち往生。これら両方の問題を解決する方法はありますか?
ヴィットリオロミオ

同意します...そのような不可能な剛体衝突を解決するための最良の「正しい答え」はありません。揺らぐか、1つ以上のオブジェクトに「むしむし」を許可します。
デビッドヴァンブリンク

0

よく見ると、オブジェクトの状態は実現不可能です(または実現可能であるべきです)。

左端の赤い図形を図形R1、右端の赤い図形を図形R2とします。緑の形状をGとします。

すなわち、3つすべてのオブジェクトのサイズとジオメトリが与えられ、すべてのオブジェクトが貫通可能ではない場合:

 (1) G could not have been just directly to the left of R2, since R1 has been there 
     already. Consequently, the translation of G from left to right, penetrating R2
     could not have occurred.
 (2) G could not have been just directly to the right of R1 since R2 has been there 
     already. Consquence of which is the same as that from (1).
 (3) Had G come from the top, the movement will be blocked by both R1 and R2, given
     that their geometry and Y coordinate is the same.

要約すると、アルゴリズムがオブジェクトを1つずつ照会する場合、同時性の問題です。つまり、ある意味では、アルゴリズムはすべてのオブジェクトを同時にチェックすることになっていますが、アルゴリズムは実行を制限しますオブジェクトを1つずつ処理します...

GがR2に対してチェックされた後にR1に対してチェックされる場合、Gは法的にR1の右側にあるように見えます(Gが任意の大きさ(または距離)でベクトル<-1、-1>の方向でR1に近づくと言う場合) )、R1とGの間のチェックで許可され、以前に行われたR2とGの間のチェックを忘れるからです。

あなたができる解決策は、すべての最小変位ベクトルを配列または必要なデータ構造に収集し、すべてのオブジェクトにとって正当であると証明されるものを選択することです。

指定されたフレームで、オブジェクト(たとえばG)は1つの方向しか持つことができないことに注意してください。(ああ男、ボーイバンドのように聞こえます...)

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