我有代码来计算该点的法线,但它会创建一个奇怪的工件(线条)。
如何解决? 如果使用搅拌机的法线,则没有任何文物 代码(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]);
}
答案 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