2つのポイントセットが与えられた場合
((x1,y1,z1),(x2,y2,z2),(x3,y3,z3)) および
((p1,q1,r1),(p2,q2,r2),(p3,q3,r3)) はそれぞれ 3D 空間で三角形を形成します。
これらの三角形が交差するかどうかをどうやって調べますか?
この問題の明らかな解決法の 1 つは、各三角形によって形成される平面の方程式を見つけることです。平面が平行であれば、それらは交差しません。
それ以外の場合は、これらの平面の法線ベクトルを使用して、これらの平面の交差によって形成される線の方程式を見つけます。
ここで、この線が両方の三角形の領域内にある場合、これら 2 つの三角形は交差しますが、そうでない場合は交差しません。
trianglesIntersect(Triangle T1, Triangle T2)
{
if(trianglesOnParallelPlanes(T1, T2))
{
return false
}
Line L1 = lineFromPlanes(planeFromTriangle(T1), planeFromTriangle(T2))
if(lineOnTriangle(T1, L1) AND lineOnTriangle(T2, L1))
{
return true
}
return false
}
上記の関数の書き方はわかっているので、trianglesIntersect の他のどのような実装を検討すべきでしょうか?
この問題を解決するより高速なアルゴリズムはありますか?
ベストアンサー1
訪問この幾何学的交差アルゴリズムの表提供元リアルタイムレンダリング三角形/三角形の交差の項目を見て、例えばChrister Ericsonの参考文献に従ってください。リアルタイム衝突検出、172ページ。(この本は強くお勧めです。)
基本的な考え方は単純明快です。2 つの三角形が交差する場合、一方の三角形の 2 つの辺がもう一方の三角形と交差するか (下の図の左側の構成)、各三角形の 1 つの辺がもう一方の三角形と交差します (右側の構成)。
したがって、線分と三角形の交差テストを 6 回実行し、これらの構成のいずれかが見つかるかどうかを確認します。
さて、線分/三角形の交差テストをどうやって行うのかと疑問に思うでしょう。簡単です。この幾何学的交差アルゴリズムの表線分(光線)/三角形の交差のエントリを確認し、参照に従ってください...
(上で概説した簡単なテストでは、共面三角形を正しく処理できないことに注意してください。多くのアプリケーションでは、これは問題になりません。たとえば、三角形のメッシュ間の衝突を検出する場合、共面の場合はあいまいなので、どの結果が返されるかは問題になりません。ただし、アプリケーションが例外の1つである場合は、それを特別なケースとしてチェックするか、Ericsonで他の方法を読む必要があります。たとえば、分離軸法、またはトーマス・モラーの区間重複法。