Ray*_*Ray 8 algorithm math geometry computational-geometry
我有2个三角形和顶点p0,p1,p2,p3.这两个三角形共享边缘.从这两个三角形我想制作一个由4个顶点给出的四面体.我使用的库要求"应该给出4个顶点,使得在从外面观察时,在图中定义四面体面的四个顶点三元组以逆时针顺序出现"
.假设两个三角形中的一个是p0,p1,p2,则将法线计算为(p1-p0)(交叉)(p2-p0).有人可以告诉我一种方法来确保满足这个条件吗?
com*_*orm 12
简短回答:
条件是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 ]
Run Code Online (Sandbox Code Playgroud)
如果特定有序点集具有负决定因素,您可以通过交换任意两个点来修复它(这将取决于行列式):
e.g., swapping p0 and p2:
det(p0, p1, p2, p3) = - det(p2, p1, p0, p3)
^ ^ ^ ^
Run Code Online (Sandbox Code Playgroud)
或者更一般地,在四个顶点的偶数和奇数排列之间切换.
如果行列式为零,则这四个点是共面的,并且不能像这样固定.
最后,代码:
使用三维矢量数学计算此行列式的相对简单的方法:
let: v1 = p1 - p0
v2 = p2 - p0
v3 = p3 - p0
norm12 = cross(v1, v2)
-> determinant = dot(norm12, v3)
Run Code Online (Sandbox Code Playgroud)
最终的决定因素也称为v1,v2和v3的"三重产物".
请注意,我犹豫是否试图从您的问题中解码确切的符号约定(即,您是否需要判定因素为正或负):您提供的措辞和图表有点令人困惑.
但是,由于您拥有原始库及其文档,因此您最有能力回答此问题.作为最后的手段,你可以尝试经验方法:尝试两个标志,并选择一个不会爆炸的标志......
| 归档时间: |
|
| 查看次数: |
2968 次 |
| 最近记录: |