2009-04-19 5 views
5

OBBは、位置(x、y)、速度(x、y)および方向(行列)を有する。定期的な更新が行われると、OBBは互いに衝突して、成功したと見なされた移動の割合を返す必要があります。2つの移動2d指向バウンディングボックスの衝突をテストするにはどうすればよいですか?

私はGPWiki-http://gpwiki.org/index.php/Polygon_Collisionでポリゴンテストを見てきましたが、移動するオブジェクトや完全にOBB内にあるオブジェクトは考慮していません。

本のリアルタイム衝突検出は、第4章:バウンディングボリュームの3D OBBを対象としていますが、3次元でテストする方法は、2Dよりもはるかに複雑です。

+0

試してみてください:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.9172ソースコードはリクエストに応じて入手できます。 –

答えて

0

あなたは2dと言っていますが、3dはもっと複雑です。衝突検出の場合は、基本的に2つの図形が交差しているかどうかをテストする必要があります。 2Dでは、バウンディングボックスの場合、rectanglesです。アルゴリズムを使用して長方形が交差するかどうかを確認し、別のアルゴリズムが完全に含まれているかどうかを確認する必要があります(単純なアルゴリズムの3つのテスト)。 3dの場合、これらは立方体です。同じこと。このmatrixオブジェクト - オブジェクト交差点を見て、あなたが望む交差点を見つけてください。オブジェクト自体の交差がないかどうかを確認し、一方が完全に他方に含まれているかどうかを調べます。

この手順は、バウンディングボックスだけでなく、バ​​ウンディングスフィアや、凸状の境界線、ポリゴン、または完全な3Dオブジェクト内の実際のオブジェクト自体にも適用できます。最終的な結果は、オブジェクトが空間と時間を通って進むにつれて、サーフェスが衝突するかどうか、またはオブジェクトが互いに内側にあるかどうかです。粒度があまりにも粗すぎて、モデル化している状況では衝突するはずですが、それらが互いに過去に移動するようになる場合は、レイ・バインドの交差テストを追加して、オブジェクトは他のオブジェクトの境界と交差します。

+0

質問は、軸方向に整列したボックスではなく、回転できる回転ボックスのことです。 –

1

あなたは(私はいくつかの「回転」を意味すると仮定)、いくつかの任意の向きで、2のバウンディングボックス(つまり、四角形)を持っている場合は、私は、次の操作を行います。

  • (ここで、I初期位置から開始バウンディングボックスが交差していないと仮定します)、各ボックスをその速度に基づいて前方に移動します(ただし、時間の経過とともに動きを適用します)。
  • 翻訳された各バウンディングボックスのコーナーの座標を検索します。これらの4つの座標は、境界ボックスの辺を構成する4つの線分の端点を定義します。
  • バウンディングボックス#1の場合、そのラインセグメントのそれぞれとバウンディングボックス#2の4つのラインセグメントとの間の交差点をテストする。たとえば、hereのように、2つの線の交点を計算するための標準式を使用してこれを行うことができます。
  • 交差点があった場合は、交差点の座標と適用した既知の平行移動の座標を使用して成功した移動の割合を計算します。
  • 更新ごとに上記の手順を繰り返します。

EDIT:のようになります(コメントで議論されたものを組み込む)ラフ擬似コードは次のとおりです。

...test for intersections between the OBB edges... 
if any intersections are found{ 
    ...run code for when OBBs are partially overlapping... 
}else{ 
    P = line segment whose endpoints are the OBB centers; 
    ...test for intersections between P and OBB edges... 
    if P intersects edges of both OBBs{ 
     ...run code for when OBBs are not touching... 
    }else{ 
     ...run code for when one OBB is completely inside the other... 
    } 
} 
+0

私は、セグメントが交差しないので、一方のOBBが完全に他方のOBB内にある場合をカバーするとは思いません。 –

+0

はい、追加テストが必要な特別なケースです。しかし、OBBが十分に小さく移動すると、あるOBBが他のOBBに入る前に交差点が先に起こる可能性があります。 – gnovice

+1

私はこれが彼のユースケースではないかもしれないが、最初の条件が既に他のものの中にあるということであればどうでしょうか?私は彼が中心点から中心点に線を引くことができると思います。行がOBBの1つからの線と交差する場合、一方は他方の内側にあります。テストを実行して部分的な重なりを排除した後でこれを行う必要があります。それより簡単なチェックはありますか? –

4

は2つの指向バウンディングボックス間衝突判定をテストするために、私は軸を分離する使用したいです定理(SAT)。実際には、任意の2つの凸形状の間の衝突検出にSATを使用することができます。このテクニックは理解するのが非常に複雑ではなく、妥当なパフォーマンスを備えています。 定理は簡単に3Dに拡張できます。

EDIT:

アルゴリズムは、決定しようとし、2つのオブジェクト間の平面に適合することが可能です。そのような面が存在する場合、オブジェクトは分離され、交差できません。

オブジェクトが分離されているかどうかを判断するには、飛行機のnormalにオブジェクトを投影し、間隔を比較してそれらが重なっているかどうかを確認するだけです。

したがって、明らかに、2つの分離されたオブジェクトの間に収まる無数のプレーンがあります。しかし、飛行機のいくつかをテストするだけで済むことが証明されています。

ボックスの場合、テストされる分離平面は、両方のボックスの軸に等しい法線の平面であることがわかります。したがって、2つのボックスでは、合計で4つの分離平面をテストする必要があります。 4つの飛行機のうち、ボックスを分離する分離平面を見つけたら、ボックスが交差できないことを知っていて、衝突なしフラグを返します。

4つの飛行機がボックスを分離できない場合は、ボックスが交差していて衝突が発生している必要があります。

+0

これはもう少し説明するのに役立つと思いますか?私が定理を正しく読んでいるならば、回転した各辺に垂直な軸を生成し、その軸にOBBを投影し、重なりをテストする必要があります。右? –

+0

興味深いアルゴリズムのように聞こえます。詳細が良いでしょう。 =) – gnovice

+0

あなたは、ボックスのすべての頂点が分離軸の同じ側にあることを確認するだけです。私は、ここでこれをより完全に説明する質問が既にあることを知っています。 http://stackoverflow.com/questions/115426/algorithm-to-detect-intersection-of-two-rectangles – BigSandwich

2

もう一つの提案(封じ込めをカバーし、私は安価だと思う):

チェック#1の4つの頂点のいずれかが第2位の内側にある場合、#2の4つの頂点のいずれかが内部にある場合は、次にチェック#1。ここで私はそのことについてお勧めしたいと思います:

チェックしている#1の頂点をvとし、#2の4つの頂点をv1 ... v4とします。 逆回転すべての5つの頂点を#2の向きで回転します。 (方程式の向きが左乗算であると仮定して、Mを転置:M^T uでuを乗じる)が軸合わせされているので、すぐにv 'が含まれているかどうかを確認することができます。

#2-stopの内側に#1頂点がある場合、交差点があります。そうでなければ - 続行します。

サイズが固定されている場合は、各ボックスに回転していないコピーを格納することができます(おそらく、それらを比較して可能な包含物をただちに排除して3つの潜在的なテストを保存することができます?)しかし、あなたが箱の対のガゼリオンにそれを適用しない限り、このテストはそのままで十分安くなければならない。

動きについては、あなたが望むほど深くなることができます - 「連続的な衝突」を見て、あなた自身で見てください。 (私は特にStephane Redonの素晴らしい作品を覚えています)。私は全面的に、このような面白いことはしていないと心から考えています。あなたが本当に非常に速く動いている場合は、タイムステップを細分化し、各位置/方向のサブ反復で衝突チェックを実行できます。

(編集:)それについての別の議論right hereがあり、いい言及があります。

+0

+1を編集します。最初の答えは-1と思っていましたが、編集があなたを救ったと思います:)私は、誰かがこの質問を複写物として閉じなければならないと思う。 –

+0

私はまだ私の提案の後ろに立っています。なぜ-1? –

+0

ちょうど明確にするために、私はあなたにdownvoteしなかった。答えは非常に難しかった(私があなたが言っていることを見てもそれを読んだ後では意味をなさない)が、頂点を逆回転させる方法を説明したりリンクしたりしなかった。また、「4つの頂点のいずれかがある場合」を意味しましたか? –

0

プレーン上のすべてのオブジェクトを追跡するために、おそらくクォッドツリー(wikipediaを参照)を実装する必要があります。私は残念ながら衝突検出のためのものを実装したことはありませんでしたが、他のpeopleがクワッドツリーを使って同様のシナリオを作成できたようです。

関連する問題