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

Gra*_*ser 3 javascript opengl vectormath normals

我正在尝试计算 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;
}
Run Code Online (Sandbox Code Playgroud)

Ret*_*adi 5

您正在使用退化多边形进行测试。如果在 xz 平面中绘制它,顶点编号为 0 到 3,则如下所示:

2 ---- 3
 \    /
  \  /
   \/
   /\
  /  \
 /    \
0 ---- 1
Run Code Online (Sandbox Code Playgroud)

这个多边形没有明确定义的法线,因为它在中间改变方向,并折叠起来。

如果交换最后两个顶点:

p = [[0, 0, 0]
     [1, 0, 0]
     [1, 0, 1]
     [0, 0, 1]]
Run Code Online (Sandbox Code Playgroud)

它看起来像这样,你应该得到更有意义的结果:

3 ---- 2
|      |
|      |
|      |
0 ---- 1
Run Code Online (Sandbox Code Playgroud)