2012-08-02 35 views
0

我遇到了一個問題,它試圖在加載OBJLoader之後獲取模型幾何體的邊界框。到目前爲止,我有:如何在使用ObjLoader之後計算邊界框three.js

var loader = new THREE.OBJLoader(); 
loader.load(mURL, function (object) { 

for (var i = 0, l = object.children.length; i < l; i ++) { 
    geometry = object.children[0].geometry;   
    bBox = geometry.computeBoundingBox(); 
    console.log("have a box of "+bBox); 
} 
//...rest of function 

但是,當我寫入控制檯時,bBox是未定義的。在這種情況下幾何不是正確的屬性?

回答

3

我覺得這樣的事情應該做的伎倆:

var loader = new THREE.OBJLoader(); 
loader.load(mURL, function (object) { 

    THREE.SceneUtils.traverseHierarchy(object, function (child) { 

     if (child instanceof THREE.Mesh) { 

      child.geometry.computeBoundingBox(); 

     } 

    } 

} 
+0

謝謝mrdoob。這讓我朝着正確的方向前進。我不得不在obj中進行更多的挖掘以達到幾何。看看我的答案新的答案。 – shadyhill 2012-08-03 03:48:37

+0

哎呀!更新了答案。 – mrdoob 2012-08-03 08:55:55

+0

是的,這比我的循環更有效率。再次感謝! – shadyhill 2012-08-03 19:07:53

0

基於mrdoob的遍歷功能,我能得到一個邊框有以下:

var loader = new THREE.OBJLoader(); 
loader.load(mURL, function (object) { 
    THREE.SceneUtils.traverseHierarchy(object, function(child){ 
    if(child instanceof THREE.Mesh){ 
     for (var i in child) { 
      if(i == "geometry"){ 
       var geo = child[i]; 
        geo.computeBoundingBox(); 
        var bBox = geo.boundingBox; 
       } 
      } 
     } 
     }); 
     ///rest of loading function here 
}); 
0

@ mrdoob的答案是正確的,但由於three.js API變化(從R52開始),現在應該如下所示:

var loader = new THREE.OBJLoader(); 
loader.load(mURL, function (object) { 
    object.traverse(function (child) { 
     if (child instanceof THREE.Mesh) { 
      child.geometry.computeBoundingBox(); 
     } 
    }); 
}; 
2

這個答案結合了持續three.js所

var loader = new THREE.OBJLoader(); 
loader.load(mURL, function (object) { 
object.traverse(function (child) { 
    if (child instanceof THREE.Mesh) { 
     child.geometry.computeBoundingBox(); 
     object.bBox = child.geometry.boundingBox;//<-- Actually get the variable 
    } 
}); 
}; 

最新版本現在可以通過鍵入object.bBox.max.x獲得X例如訪問網格的尺寸。