计算多边形的法向量 - Newells方法

时间:2014-12-06 00:00:33

标签: javascript opengl normals vectormath

我试图计算2D多边形的曲面法线。我正在使用OpenGL wiki中的Newell方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_Surface_Normal根据我的理解,法线应该在y方向,但它总是返回[0,0,0]。 y值在第二次迭代时变为-1,在第四次迭代时变为零。

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 个答案:

答案 0 :(得分:4)

您正在使用退化多边形进行测试。如果你在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 :(得分:1)

OpenGL的版本在某些情况下失败,特别是当Polygon是2D并且您提供了3个以上的顶点进行计算时(在您的情况下为4)。如果您只提供3个顶点,它将正确计算(也考虑使用矢量积来获得正常)。 以下是针对此问题的不同方法的类似问题的link to Game Development Stack Exchange