有没有一个好的强大算法来计算凸多边形的法向量(当然是在三维空间中)?对于三角形,很容易:只需要取两条边,计算它们的叉积即可:
vec3 u = point[0] - point[1], v = point[0] - point[2];
vec3 n = normalize(cross(u, v));
但是,这种方法在多边形中并不适用。多边形的某些边缘可能几乎或者“完全”共线(在进行T型交点移除时经常会发生这种情况),因此需要选择一对边缘,并生成一个“强”的法向量(两个边缘都足够长,它们之间的夹角“几乎垂直”)。
然而,即使采用这种方法,对于某些多边形仍然无法奏效。想象一下一个圆盘形状的多边形。如果它被精细地细分,所有的边缘都会非常短,所有相邻的边缘都几乎共线,而其半径大小则无关紧要。同时,法向量是非常明确的。
一种解决方案是找到最大内接三角形,并计算其法向量。然而,找到它的复杂度为O(n^2),似乎是不可行的。
更好的解决方案可能是使用SVD或特征值分解来计算法向量,给定所有多边形顶点,而不仅仅是三个或四个点。
是否有标准算法可以解决这个问题?有没有好的方法可以实现呢?
nx += cur.y * next.z - next.y * cur.z - next.y * next.z + cur.y * cur.z
。前两个加数来自于叉积。后两个是额外的。因此,每个顶点为自身添加了y * z
并为下一个顶点减去了y * z
。如果对所有顶点执行此操作,则附加项将被抵消,您将获得叉积的总和。 - Nico Schertler