0

私は「分離軸テスト」についてたくさん読んできましたが、すべての投稿や記事から、それらはすべて 3D ではなく 2D の衝突に関するものであることがわかりました。3D 空間の「分離平面定理」のようなものだと聞きましたが、この方法が 2D バージョンとどのように異なるかについての情報がどこにあるかは不明です。

三角形が Axis-Aligned Bounding Box (AABB) と交差しているかどうかを計算しようとしているので、SAT を使用する必要があります。交差点がどこで発生したかを知る必要はありません。交差点が発生したかどうかはブール値の結果だけです。

SAT の実装における私の主な試みは、実装の試みにあります。

SAT を変更する必要がある場合、3D 空間で正常に実装するには何を変更する必要がありますか? 現時点では、Christer Ericson の著書Real-Time Collision Detectionによると、13 の軸をテストする必要があります。SAT を変更する必要がある場合は、3 番目の軸が関係しているため、テストする軸がさらにあると思います。

  1. AABB の 3 つの面の法線
  2. 三角形からの 1 つの面の法線
  3. 両方からのエッジの組み合わせの外積によって与えられる 9 つの軸

SAT を変更する必要があるかどうかを理解し、変更する場所とその理由を突き止める必要があります。変更が必要ない場合、どこが間違っていますか? ありがとう!

4

1 に答える 1

1

さまざまな投稿、記事、論文 (そのうちの最良のリソースはこの記事でした) を読んだ後、3D 衝突検出のために SAT を変更する必要がないことがわかりました。

私の実装にはまだいくつかの問題がありますが、AABB (キューブ) の場合、x、y、および z 軸に対応する 3 つの表面法線をテストする必要があると言えます。三角形の場合、各エッジに 1 つ、サーフェスに 1 つの 4 つの法線が必要なようです (三角形の法線についてはまだテストが必要なので、完全にはわかりません。1 つの法線で試してみたところ、80% の動作が得られました。 )。

AABB (立方体) の場合、法線は、サーフェスの 2 つの垂直エッジを取得し、それらの 2 つのエッジの外積を取得することによって計算されます。

// Surface 1/3 (x, y, z - one surface for each)
Vector3d edge1 = new Vector3d();
Vector3d edge2 = new Vector3d();
Vector3d normal1 = new Vector3d();
// Get the edges, the two edges must be perpendicular to one another.
edge1.sub( point0, point1 );
edge2.sub( point0, point4 );
normal1.cross( edge1, edge2 );
normal1.normalize();

三角形のサーフェス法線も同様に計算されます。

その後、SAT は AABB と三角形の投影を取得し、AABB 軸 (法線) でそれらをテストします。次に、これが三角形の軸 (法線) で繰り返され、テストのいずれかがギャップを検出した場合、衝突はありません。

于 2012-09-08T01:00:44.563 に答える