2016-09-21 138 views
0

我有代碼來計算點的法線,但它會創建一個奇怪的工件(線)。 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]); 
} 
+0

更一般地說,我會避免極地球體 - 由於小的會聚三角形,它們總是在極點周圍存在狡猾的問題。這與你的問題沒有關係,但isospheres不太容易出現問題。 – solidpixel

回答

0

如果您不是第一次你和零之前頂點法線。如果正常數組中已有值,則總和將不正確。

添加此之前打個電話總結法線

對不起,我不使用你正在使用的lib,不知道正常的VEC 3的結構,所以只能用你給什麼工作,所以我零通過減,將是最好的只是設置爲零

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; 
} 
0

我不知道我理解你的算法。你計算每個多邊形的法線。然後你總結每3個多邊形。然後你正常化。如何與您的頂點

每3個多邊形的總和。如果它與周圍的球再裹上如果我們想象一個網格中的典型的極性球有隻環繞球體這樣

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

然後看着頂點B,我們需要平均多邊形的法線1,2,3,6,7,8和A,我們需要0,1,5,6,10,11算法沒有這樣做。我誤解了嗎?

0

交叉產品不返回單位長度向量。你沒有在你的第一個循環中對每面法線進行歸一化。 polygonNormals向量具有不一致的大小。

vNormal = self.vec3.cross(edgeA, edgeB); 
    vNormal = self.vec3.normalize(vNormal); 
    d.polygonNormals.push(vNormal);