我有两个三角形,其中每个三角形都有顶点p0,p1,p2,p3。这两个三角形共享一条边。我想从这两个三角形中制作一个四面体,由四个顶点定义。我使用的库要求“四个顶点应该被给予这样的方式,即在从外部查看时,定义四面体面的四个顶点三元组以逆时针顺序出现在绘图中”。 假设其中一个三角形是p0,p1,p2,我计算法向量为(p1-p0) (cross) (p2-p0)。请问有人能告诉我如何确保满足此条件吗?
![drawing](https://istack.dev59.com/leuXm.webp)
简短回答:
条件是p3
必须在由(p0,p1,p2)
确定的平面的正确侧。
因此,在计算此平面的法线后,您需要通过取点积dot(normal, p3-p0)
来确定从(例如)p0
到p3
的向量是否指向法线的相同方向或相反方向。
更严谨地说:
您需要找到由四个点的齐次坐标形成的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)