9

2 つの三角形と頂点 p0、p1、p2、p3 があります。これらの 2 つの三角形はエッジを共有しています。これらの 2 つの三角形から、4 つの頂点によって与えられる四面体を作成します。私が使用しているライブラリでは、「図面で四面体の面を定義する 4 つの頂点トリプルが、外側から見たときに反時計回りの順序で表示されるように、4 つの頂点を指定する必要があります」図. 2 つの三角形の 1 つが p0、p1、p2 であると仮定すると、法線は (p1-p0) (交差) (p2-p0) として計算されます。この条件が確実に満たされるようにする方法を教えてください。

4

1 に答える 1

15

簡潔な答え:

条件は、p3によって決定される平面の正しい側になければならないということ(p0, p1, p2)です。

p0したがって、この平面の法線を計算した後、(たとえば)から へのベクトルp3が法線と同じ方向を向いているか、それとも反対の方向を向いているかを、内積 をとって判断する必要がありますdot(normal, p3-p0)


より数学的に言えば:

4 つの点の同次座標によって形成される 4x4 行列の行列式を見つける必要があります。条件が満たされるかどうかは、行列式の符号によって決まります。適切な符号は、使用される正確な規則によって異なりますが、理想的には正でなければなりません。

require:
  0 < det(p0, p1, p2, p3)

  == det [ p0.x p0.y p0.z 1 ]
         [ p1.x p1.y p1.z 1 ]
         [ p2.x p2.y p2.z 1 ]
         [ p3.x p3.y p3.z 1 ]

特定の順序付けられたポイントのセットに負の行列式がある場合は、任意の 2 つのポイントを交換することで修正できます (行列式が無効になります)。

e.g., swapping p0 and p2:

det(p0, p1, p2, p3) = - det(p2, p1, p0, p3)
     ^       ^               ^       ^

または、より一般的には、4 つの頂点の偶数順列と奇数順列を切り替えます。

行列式がゼロの場合、4 つの点は同一平面上にあり、このように固定することはできません。


最後に、コード:

この行列式を 3 次元ベクトル演算で計算する比較的簡単な方法は次のとおりです。

let:  v1 = p1 - p0
      v2 = p2 - p0
      v3 = p3 - p0
      norm12 = cross(v1, v2)
   -> determinant = dot(norm12, v3)

最終的な行列式は、v1、v2、および v3 の「三重積」としても知られています。

あなたの質問から正確な符号規則 (つまり、行列式を正にする必要があるか負にする必要があるか) を解読しようとするのをためらっていることに注意してください。

ただし、元のライブラリとそのドキュメントがあるため、この質問に答えるのに最適な立場にあります。最後の手段として、経験的な方法を試すことができます。両方の兆候を試して、爆発しない方を選択してください...

于 2012-05-16T22:44:01.500 に答える