是否有一个好的鲁棒算法来计算凸多边形的法向量(当然是3D)?对于三角形,这很容易:取三角形的两条边并计算叉积:
vec3 u = point[0] - point[1], v = point[0] - point[2];
vec3 n = normalize(cross(u, v));
但这种方法并不能很好地扩展到多边形。多边形的某些边可能几乎或“完全”共线(这种情况经常发生在发生 T 形连接去除的网格中),因此有必要选择一对边,给出“强”法线(两条边都是“足够长”并且它们保持“几乎垂直”的角度)。
不过,这种方法仍然不适用于所有多边形。想象一个圆盘形状的多边形。如果它被非常精细地细分,则无论圆盘的半径如何,所有边缘都将非常短并且所有连续边缘将几乎共线。同时,正常情况也有明确的定义。
一种解决方案可能是找到最大的内切三角形并计算其法线。然而,找到它的复杂性为O(n^2)
,这似乎令人望而却步。
更好的解决方案可能是使用 SVD 或特征值分解来计算法线,给定所有多边形点,而不仅仅是三个或四个。
有一个标准的算法吗?有人有好的方法吗?
如果您对三角形的公式进行因式分解,您将得到以下结果:
n ~ (p1 - p0) x (p2 - p0)
= p0 x p1 + p1 x p2 + p2 x p0
您可以将此公式推广到任意多边形:
n ~ p0 x p1 + p1 x p2 + ... + pn x p0
因此对连续边的叉积求和。这是一种稳健的算法,适用于非平面多边形。
如果您可以确定多边形是平面的,我会执行以下操作(以节省计算时间):
Repeat k times
Pick 3 random polygon vertices
Calculate the normal of the according triangle
Choose the longest normal as the polygon's normal.
您可以丢弃任何具有length <= epsilon
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)