【发布时间】:2014-05-15 07:22:50
【问题描述】:
是否有一个很好的鲁棒算法来计算凸多边形的法向量(当然是 3D 的)?对于三角形,这很简单:取三角形的两条边并计算叉积:
vec3 u = point[0] - point[1], v = point[0] - point[2];
vec3 n = normalize(cross(u, v));
但是这种方法并不能很好地扩展到多边形。多边形的某些边可能几乎或“完全”共线(这经常发生在删除 T 形接头的网格中),因此有必要选择一对边,给出“强”法线(两条边都是“足够长”并且它们保持“几乎垂直”的角度)。
不过,这种方法仍然不适用于所有多边形。想象一个圆盘形状的多边形。如果细分得非常精细,则所有边都将非常短,并且所有连续的边将几乎共线,而与圆盘的半径无关。同时,法线也非常明确。
一种解决方案可能是找到最大的内接三角形并计算其法线。但是,找到它的复杂度将达到O(n^2),这似乎令人望而却步。
更好的解决方案可能是使用 SVD 或特征值分解来计算法线,给定所有多边形点,而不仅仅是三个或四个。
对此有标准算法吗?有谁有好的方法吗?
【问题讨论】:
标签: algorithm 3d geometry numerical-methods