我有2个三角形和顶点p0,p1,p2,p3。这两个三角形共享一条边。从这两个三角形中,我想制作一个由4个顶点给出的四面体。我使用的库要求“应该给4个顶点,以便从外部观察时,定义图形中四面体面的四个顶点三元组按逆时针顺序出现”。假设两个三角形之一是p0,p1,p2,我将法线计算为(p1-p0)(叉)(p2-p0)。有人可以告诉我一种确保满足此条件的方法吗?
最佳答案
简短答案:
条件是p3
必须位于(p0, p1, p2)
确定的平面的正确一侧。
因此,在计算了该平面的法线之后,您需要通过获取点积p0
来确定从(例如)p3
到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之间切换。
如果行列式为零,则这四个点是共面的,因此无法固定。
最后,代码:
使用3-d向量数学来计算此行列式的一种相对简单的方法:
let: v1 = p1 - p0
v2 = p2 - p0
v3 = p3 - p0
norm12 = cross(v1, v2)
-> determinant = dot(norm12, v3)
最终的决定因素也称为v1,v2和v3的“三乘积”。
请注意,我犹豫要尝试从您的问题中解码确切的符号约定(即,您是否需要行列式是正数还是负数):您提供的措辞和图表令人困惑。
但是,由于您拥有原始库及其文档,因此您可以最好地回答这个问题。作为最后的选择,您可以尝试经验的方法:尝试两个标志,然后选择不会爆炸的标志...
关于algorithm - 三角形网格的四面体取向,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10612829/