AABB-AABB衝突、どちらの顔に当たる?


7

オブジェクトが衝突したときにスライドできるようにするには、次のことを行う必要があります。

  • 彼らが衝突するAABBのどの面を知っています。
  • その面の法線を計算します。
  • 法線を返し、プレイヤーの速度に適用するインパルスを計算します。

質問

2つのAABBが衝突していることを知りながら、衝突したAABBの面を計算するにはどうすればよいですか?1つはプレーヤーで、もう1つはワールドオブジェクトです。

これは次のようになります(白で囲まれた問題の衝突)。

問題衝突

ご協力ありがとうございました。

回答:


2

AABBの各平面を他のAABBと比較してください。平面が他のオブジェクトのAABBと交差するが、反対側の平面は交差しない場合、その平面が衝突に関与していることがわかります。対向する両方の面が他のAABBと交差する場合、オブジェクトはその軸に沿って他の面内に完全にあり、衝突の方向は不明確/未定義です。

実際には、これらはAABBが衝突するかどうかを決定するために使用されるチェックと同じです。したがって、追加のコストをほとんどかけずに、AABB衝突チェックを実行するときにどの面が衝突するかを決定できるはずです。

例を見ると、次のことがわかります。

  • 球のyz +平面はプリズムと交差しますが、yz-は交差しません。球yz +が衝突します。同様に、プリズムのyzが衝突します。
  • プリズムxy-とxy +の両方が球のxy-とxy +内にあります。プリズムは完全にz方向の球内にあります。衝突があいまいです。
  • プリズムxz-とxz +の両方が球のxz-とxy +の中にあります。プリズムは完全にy方向の球内にあります。衝突があいまいです。

したがって、この例では、球体yz +とプリズムyz-の間の衝突を検出します。

すべての面の法線は明白である必要があります(yz +は(1,0,0)、yz-は(-1,0,0)、xz-は(0、-1,0)...)クワッドには、反時計回りの順序で頂点(a、b、c、d)があり、(ba).cross(cb)で法線を計算できます

この問題は、複数の衝突が発生する可能性があることに注意してください。配置によっては、3つの軸すべてに衝突が発生する可能性があります。この「あいまいさ」はかなり固有のものであり、どのようにそれを解決するかは本当にあなた次第です。個々の法線の平均を取るだけかもしれません。各平面で交差する領域を見つけ、最大の領域に対応する法線を選択するか、領域を使用して法線の平均に重みを付けることができます。各軸に沿って侵入深度を見つけ、最も浅い(または最も深い)侵入に対応する法線を選択できます。等


それは簡単ではありませんか?ipeetに感謝します。別の長い日、私がそれをコード化するのに数週間かかる..
PeeS

@PeeS-これはおそらく何度も行われたことだと思います。おそらく、他の人がどのようにそれを実装したかについて、周りを見回すべきでしょう。
Richard Marskell-Drackir、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.