3

我正在尝试计算二维多边形的表面法线。我正在使用 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;
}
4

2 回答 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
于 2014-12-06T03:57:46.727 回答
1

OpenGL's version is failing for some cases especially when Polygon is 2D and you providing more than 3 vertices for calculation (4 in your case). If you provide only 3 vertices it will calculate correctly (also consider to use vector product to get normal). Here is the link to Game Development Stack Exchange to the similar question with different approaches to this problem.

于 2014-12-06T00:39:21.143 回答