我有计算法线到点的代码,但它创建了一个奇怪的工件(线)。

如何修复它?如果你使用搅拌机的法线,那么就没有瑕疵了。

代码( 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]);
}发布于 2016-09-22 09:06:14
我不确定我是否理解你的算法。计算每个多边形的法线。然后对每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,11
但是AFAIK你的算法不能做到这一点。我是不是误解了它?
发布于 2016-09-25 17:49:08
叉积不返回单位长度向量。在第一个循环中,您没有对每个面的法线进行标准化。polygonNormals向量的大小不一致。
vNormal = self.vec3.cross(edgeA, edgeB);
vNormal = self.vec3.normalize(vNormal);
d.polygonNormals.push(vNormal);https://stackoverflow.com/questions/39619083
复制相似问题