三角网格的四面体方向

时间:2012-05-16 05:58:53

标签: algorithm math geometry computational-geometry

我有2个三角形和顶点p0,p1,p2,p3。这两个三角形共享边缘。从这两个三角形我想制作一个由4个顶点给出的四面体。我使用的库要求“应该给出4个顶点,使得在从外部”drawing查看时,图形中定义四面体面的四个顶点三元组以逆时针顺序出现。假设两个三角形中的一个是p0,p1,p2,则将法线计算为(p1-p0)(交叉)(p2-p0)。有人可以告诉我一种方法来确保满足这个条件吗?

1 个答案:

答案 0 :(得分:12)

简短回答:

条件是p3必须位于由(p0, p1, p2)确定的平面的正确一侧。

因此,在计算此平面的法线之后,您需要确定从(例如)p0p3的向量是否指向法线的相同方向,或相反的方向,通过点积dot(normal, p3-p0)


从数学角度讲:

您需要找到由四个点的齐次坐标形成的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 ]

如果某个特定有序点集具有负决定因素,您可以通过交换任意两个点(这将否定行列式)来修复它:

e.g., swapping p0 and p2:

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

或者更一般地说,在四个顶点的even and odd permutations之间切换。

如果行列式为零,则这四个点是共面的,不能像这样固定。


最后,代码:

使用三维矢量数学计算此行列式的一种相对简单的方法:

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

最终决定因素也被称为v1,v2和v3的“三重产品”。

请注意,我犹豫是否尝试从您的问题中解码确切的符号约定(即,您是否需要判定因素为正或负):您提供的措辞和图表有点令人困惑。

由于您拥有原始库及其文档,因此您最有能力回答此问题。作为最后的手段,你可以尝试经验方法:尝试两个标志,并选择一个不会爆炸的标志......