三角面网格的四面体定向

9
我有两个三角形,其中每个三角形都有顶点p0,p1,p2,p3。这两个三角形共享一条边。我想从这两个三角形中制作一个四面体,由四个顶点定义。我使用的库要求“四个顶点应该被给予这样的方式,即在从外部查看时,定义四面体面的四个顶点三元组以逆时针顺序出现在绘图中”。 假设其中一个三角形是p0,p1,p2,我计算法向量为(p1-p0) (cross) (p2-p0)。请问有人能告诉我如何确保满足此条件吗?drawing

3
很遗憾你费尽心思提供了一张非常清晰的图表,但在问题的文本中却使用了错误的顶点标签。我第一次阅读时非常困惑。 - High Performance Mark
1
通常情况下,您需要其他方法来决定外部 - 这通常来自网格算法(如Marching Cubes等)。 - Martin Beckett
如果两个三角形的法线计算方式与描述中提到的相同,那么我是否可以只选择一个面(法线指向的面)并将其视为前面或后面? - Ray
简短的回答是:是的,只要您按照一致的顺序考虑这些要点。 - comingstorm
1个回答

15

简短回答:

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

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


更严谨地说:

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

或者更一般地说,切换四个顶点的偶置换和奇置换
如果行列式为零,则这四个点共面,并且不能像这样固定。

最后,代码如下:

使用3D向量数学相对简单地计算此行列式的方法:

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

最终决定因素也被称为v1、v2和v3的“三重积”。请注意,我犹豫不决地尝试从您的问题中解码确切的符号约定(即您是否需要行列式为正或负):您提供的措辞和图表有点令人困惑。由于您拥有原始库及其文档,因此您是回答此问题的最佳人选。作为最后的手段,您可以尝试经验法:尝试两种符号,并选择不会崩溃的符号...

非常感谢您的澄清答案。它像魔法一样奏效了。 - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接