修复计算法线的算法

时间:2016-09-21 14:12:50

标签: javascript algorithm opengl-es webgl

我有代码来计算该点的法线,但它会创建一个奇怪的工件(线条)。 my normals

如何解决? 如果使用搅拌机的法线,则没有任何文物 blender 代码(javascript):

for (var i = 0; i < d.polygons.length; i++) {
    var ind0 = d.polygons[i][0];
    var ind1 = d.polygons[i][1];
    var ind2 = d.polygons[i][2];
    var v1 = d.vertex[ind0];
    var v2 = d.vertex[ind1];
    var v3 = d.vertex[ind2];
    var vVector1 = self.vec3.minus(v2, v3);
    var vVector2 = self.vec3.minus(v1, v3);
    var vNormal;
    if (values.invertNormals === true) {
        vNormal = self.vec3.cross(vVector2, vVector1);
    } else {
        vNormal = self.vec3.cross(vVector1, vVector2);
    }
    d.polygonNormals.push(vNormal);
}
for (var k = 0; k < d.polygons.length; k++) {
    for (var i = 0; i < 3; i++) {
        d.normals[d.polygons[k][i]] = self.vec3.sum(d.normals[d.polygons[k][i]], d.polygonNormals[k]);
    };
}
for (var i = 0; i < d.vertex.length; i++) {
    d.normals[i] = self.vec3.normalize(d.normals[i]);
}

3 个答案:

答案 0 :(得分:0)

如果在求和之前不首先将顶点法线归零。如果正常数组中有值,则总和将不正确。

添加这个为你加上法线

对不起,我没有使用你正在使用的lib,也不知道正常vec3的结构,所以只能使用你给出的,所以我通过减去零,最好只是为了设为零

for (var i = 0; i < d.vertex.length; i++) {
    // Only use the following line or the three after if vec3 is x,y,z
    d.normals[i] = self.vec3.minus(d.normals[i],d.normals[i]);
    // or guessing at normal structure
    d.normals[i].x = 0;
    d.normals[i].y = 0;
    d.normals[i].z = 0;
}

答案 1 :(得分:0)

我不确定我理解你的算法。您为每个多边形计算法线。然后你总计每3个多边形。然后你规范化。每个3个多边形的总和如何与您的顶点相关

如果它是一个典型的极地球体,球体缠绕在球体周围,那么如果我们想象只有一个网格3x2包裹在球体上,就像这样

+-----+-----+-----+
|    /|    /|    /|
|0  / |2  / |4  / |
|  /  |  /  |  /  |
| /  1| /  3| /  5|
|/    |/    |/    |
A-----B-----C-----D
|    /|    /|    /|
|6  / |8  / |10 / |
|  /  |  /  |  /  |
| /  7| /  9| / 11|
|/    |/    |/    |
+-----+-----+-----+

然后观察顶点B,我们需要平均多边形1,2,3,6,7,8的法线,对于A,我们需要0,1,5,6,10,1

但AFAIK你的算法不是这样做的。我误解了吗?

答案 2 :(得分:0)

交叉产品不会返回单位长度向量。您没有在第一个循环中规范化每个法线法线。 polygonNormals 向量的大小不一致。

a