2013-09-21 96 views
0

我正在從obj文件中加載網格,然後嘗試對其進行歸一化。但是,我收到了奇怪的結果。下面是加載和中心網格代碼:在three.js中規格化網格

var manager = new THREE.LoadingManager(); 
var loader = new THREE.OBJLoader(manager); 
loader.load('http://jamesdedge.com/threejs/bunny.obj', function(object) { 
    object.traverse(function(child) { 
    if(child instanceof THREE.Mesh) 
    { 
     var geometry = child.geometry; 
     var verts = geometry.vertices; 
     var ctr = new THREE.Vector3(0.0, 0.0, 0.0); 


     for(i = 0; i < verts.length; ++i) 
     ctr.add(verts[i]); 

     ctr.divideScalar(verts.length); 

     for(i = 0; i < verts.length; ++i) 
     verts[i].sub(ctr); 
    } 
    }); 

    scene.add(object); 
}); 

此代碼應該只集中在平均頂點位置的網格,但它似乎是造成了奇效。你可以在我的網站上看到它:http://jamesdedge.com/threejs/tjs_demo.html

我不明白是什麼原因造成的,ctr變量給了我一個有效的向量,並且從所有的頂點減去一個向量只會重新定位它。

+1

請考慮使用'geometry.mergeVertices(); THREE.GeometryUtils.center(geometry);' – WestLangley

+1

提交的錯誤報告:https://github.com/mrdoob/three.js/issues/3897 three.js r.61 – WestLangley

回答

2

該模型中的許多頂點都是重複的(即,多次將相同的javascript對象包含在對象中),因此ctr會多次從這些頂點中減損。爲解決這個問題

的一種方法是在你的穿越功能開始合併頂點,即

var geometry = child.geometry; 
geometry.mergeVertices(); 

這也將使得你的代碼運行了一下,因爲它必須處理的少了很多快頂點。

+0

是的。數據文件中的2503個頂點導致網格中的14K +頂點,這些14K +頂點反覆引用相同的「Vector3」對象。我認爲這是'OBJLoader'中的一個錯誤。你所建議的是一個很好的解決方法。 – WestLangley

+0

這解決了這個問題 - 謝謝!不知道爲什麼OBJReader會這樣做 - 我之前編寫了相同的代碼,並且從未創建過重複的頂點。 –