是否有一个好的鲁棒算法来计算凸多边形的法向量(当然是3D)?对于三角形,很容易:一个需要两个三角形的边缘,并计算叉积:健壮的多边形正常计算
vec3 u = point[0] - point[1], v = point[0] - point[2];
vec3 n = normalize(cross(u, v));
但这种方法并没有真正延伸至多边形非常好。多边形的某些边可以近似或“精确”共线(这通常发生在发生T形结消除的网格中),因此有必要选择一对边,从而给出“强”法线(两边都是“足够长”并且它们保持“几乎垂直”的角度)。
虽然这种方法仍然不适用于所有多边形。想象一下光盘形状的多边形。如果它被细分得很细,所有的边缘都会很短,所有的连续边缘几乎是共线的,无论光盘的半径如何。同时,正常情况非常明确。
一个解决方案可能是找到最大的内切三角形并计算其正常值。但是,找到它会有O(n^2)
的复杂性,这看起来很难。
一个更好的解决方案可以是使用SVD或特征值分解来计算法线,给定所有多边形点,而不仅仅是三个或四个。
这是否有一个标准算法?任何人都有这样做的好方法?
你有没有考虑光盘的例子?我不认为它非常强大,因为连续边的交叉积在那里相当小。但是,否则,谢谢,我想这大多数时候会更好。 –
稳健性来自总和。 –
此外,使用epsilon保证该方法不具有数值稳健性。考虑有一个网格,其中有狭窄的多边形。如果阈值很高,那些多边形将不会有正常。如果它太低,算法可能会接受稍微不平坦的边缘或其他次优边缘对,即使在具有正常定义好的多边形的情况下也会产生不精确的法线。 –