我试图计算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;
}
答案 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。