2016-09-21 13 views
0

ポイントの法線を計算するコードがありますが、奇妙なアーティファクト(線)が作成されています。 my normals法線を計算するアルゴリズムを修正しました

どのように修正するのですか?

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

はあなたがいない最初のあなたの和の前に頂点法線をゼロなら:あなたはブレンダーの通常使用している場合 は、その後、何の成果物 blender コード(ジャバスクリプト)はありません。通常の配列に値がある場合、その合計は正しくありません。

あなたは法線

申し訳ありませんが、私はこれだけあなたが与えられたもので作業することができ、使用しているのlibを使用していないと正常なvec3の構造を知らないを合計beforこれを追加、私はゼロマイナスを経て、私は私はあなたのアルゴリズムを理解していないだけで、ゼロ

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が必要です

AFAIKアルゴリズムはそれをしていません。私はそれを誤解していますか?

0

クロス積は単位長ベクトルを返しません。最初のループで顔ごとの法線を正規化していませんでした。 polygonNormalsベクトルのサイズが一貫しません。

vNormal = self.vec3.cross(edgeA, edgeB); 
    vNormal = self.vec3.normalize(vNormal); 
    d.polygonNormals.push(vNormal); 
関連する問題