【问题标题】:Calculate normal vector of a polygon - Newells Method计算多边形的法线向量 - Newells 方法
【发布时间】:2014-12-06 00:00:32
【问题描述】:

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

【问题讨论】:

    标签: javascript opengl normals vectormath


    【解决方案1】:

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

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

    这个多边形没有明确的法线,因为它在中间改变了方向,并折叠了自己。

    如果交换最后两个顶点:

    p = [[0, 0, 0]
         [1, 0, 0]
         [1, 0, 1]
         [0, 0, 1]]
    

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

    3 ---- 2
    |      |
    |      |
    |      |
    0 ---- 1
    

    【讨论】:

      【解决方案2】:

      OpenGL 的版本在某些情况下会失败,尤其是当多边形是 2D 并且您提供超过 3 个顶点进行计算(在您的情况下为 4 个)时。如果您只提供 3 个顶点,它将正确计算(也可以考虑使用矢量积来获得法线)。 这是link to Game Development Stack Exchange 对类似问题的不同处理方法。

      【讨论】:

        猜你喜欢
        • 2014-05-15
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-06
        • 2012-11-10
        • 1970-01-01
        相关资源
        最近更新 更多