多边形的法向量计算 - 纽维尔方法

4
我想计算一个二维多边形的表面法线。我正在使用OpenGL Wiki上Newell方法来计算表面法线。从我的理解来看,法向量应该是指向y轴方向的,但它总是返回[0, 0, 0]。在第二次迭代时,y值会变为-1,第四次迭代时又会变回0。 https://www.opengl.org/wiki/Calculating_a_Surface_Normal
p = [[0, 0, 0]
    [1, 0, 0]
    [0, 0, 1]
    [1, 0, 1]]

function calcNormal(p) {
    var normal = [0, 0, 0];
    for(var i = 0; i < p.length; i++) {
        var j = (i + 1) % (p.length);       
        normal[0] += (p[i][1] - p[j][1]) * (p[i][2] + p[j][2]);
        normal[1] += (p[i][2] - p[j][2]) * (p[i][0] + p[j][0]);
        normal[2] += (p[i][0] - p[j][0]) * (p[i][1] + p[j][1]);
    }
    return normal;
}
2个回答

5

您正在使用退化的多边形进行测试。如果在xz平面上绘制它,并将顶点从0到3编号,它应该如下所示:

2 ---- 3
 \    /
  \  /
   \/
   /\
  /  \
 /    \
0 ---- 1

这个多边形没有一个明确定义的法向量,因为它在中间改变方向并且折叠了起来。
如果你交换最后两个顶点:
p = [[0, 0, 0]
     [1, 0, 0]
     [1, 0, 1]
     [0, 0, 1]]

它会看起来像这样,你应该会得到更有意义的结果:
3 ---- 2
|      |
|      |
|      |
0 ---- 1

1

OpenGL的版本在某些情况下会出现问题,特别是当多边形为2D且提供了超过3个顶点进行计算时(在您的情况下为4个)。如果只提供3个顶点,则会正确计算(还要考虑使用向量积来获取法向量)。 这里是Game Development Stack Exchange链接,其中包含不同方法解决此问题的类似问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接