首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算法线的Fix算法

计算法线的Fix算法
EN

Stack Overflow用户
提问于 2016-09-21 22:12:50
回答 2查看 99关注 0票数 0

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

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

代码( javascript):

代码语言: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]);
}
EN

回答 2

Stack Overflow用户

发布于 2016-09-22 09:06:14

我不确定我是否理解你的算法。计算每个多边形的法线。然后对每3个多边形求和。然后你将其正常化。每3个多边形的总和与顶点之间的关系如何?

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

代码语言:javascript
复制
+-----+-----+-----+
|    /|    /|    /|
|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你的算法不能做到这一点。我是不是误解了它?

票数 0
EN

Stack Overflow用户

发布于 2016-09-25 17:49:08

叉积不返回单位长度向量。在第一个循环中,您没有对每个面的法线进行标准化。polygonNormals向量的大小不一致。

代码语言:javascript
复制
    vNormal = self.vec3.cross(edgeA, edgeB);
    vNormal = self.vec3.normalize(vNormal);
    d.polygonNormals.push(vNormal);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39619083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档