2012-08-01 107 views
6

有沒有一種方法可以確定模型的大小和位置,然後自動居中和縮放模型,使其位於原點和視圖內相機?我發現,當我從Sketchup導入Collada模型時,如果模型未在Sketchup的原點處居中,則它不會以three.js爲中心。雖然這是有道理的,但是在導入之後自動中心起源會很好。在three.js模型導入後的智能居中和縮放

我在不同的文件加載器中看到了一些關於獲取導入模型邊界的討論,但我一直無法找到任何有關如何做到這一點的參考。

縮放問題並不重要,但我覺得它與邊界函數有關,這也是我問它的原因。

編輯:

各處走走,多了一些谷歌搜索後打更多信息...

對現在加載COLLADA文件,我的回調函數的代碼如下所示:

loader.load(mURL, function colladaReady(collada) { 

dae = collada.scene; 
skin = collada.skins[ 0 ]; 

dae.scale.x = dae.scale.y = dae.scale.z = 1; 
dae.updateMatrix(); 

//set arbitrary min and max for comparison    
var minX = 100000; 
var minY = 100000; 
var minZ = 100000; 
var maxX = 0; 
var maxY = 0; 
var maxZ = 0; 

var geometries = collada.dae.geometries;    
for(var propName in geometries){ 
if(geometries.hasOwnProperty(propName) && geometries[propName].mesh){ 
    dae.geometry = geometries[propName].mesh.geometry3js; 
    dae.geometry.computeBoundingBox(); 
    bBox = dae.geometry.boundingBox; 
    if(bBox.min.x < minX) minX = bBox.min.x; 
    if(bBox.min.y < minY) minY = bBox.min.x; 
    if(bBox.min.z < minZ) minZ = bBox.min.z; 
    if(bBox.max.x > maxX) maxX = bBox.max.x; 
    if(bBox.max.y > maxY) maxY = bBox.max.x; 
    if(bBox.max.z > maxZ) maxZ = bBox.max.z; 
} 
} 
//rest of function.... 

這產生了一些關於模型的有趣數據。我可以得到模型的整體極座標,我假設(可能不正確)會接近模型的整體邊界框。但試圖用這些座標來做任何事情(如平均和將模型移動到平均值)會產生不一致的結果。

另外,循環遍歷模型的每個幾何看起來效率不高,有沒有更好的方法?如果不是,這個邏輯能否應用於其他裝載機?

+0

這些應該有幫助 http://stackoverflow.com/questions/14614252/how-to-fit-camera-to-object http://stackoverflow.com/questions/20059612/calculate-camera-zoom-required -for-object-to-fit-in-screen-height http://stackoverflow.com/questions/11274358/adjusting-camera-for-visible-three-js-shape http://stackoverflow.com /問題/ 16462848 /三JS-放大到合適寬度的對象 - - 忽略高度 – gaitat 2014-08-13 00:08:11

回答

2

您可以使用THREE.Box3#setFromObject來獲取任何Object3D的邊界框,包括導入的模型,而無需自己遍歷幾何。所以你可以做點像

var bBox = new THREE.Box3().setFromObject(collada.scene); 

得到模型的極限邊界框;那麼你可以使用gaitat鏈接的答案中的任何技術來正確設置相機位置。舉例來說,你可以按照這個技術(How to Fit Camera to Object),並做一些事情,如:

var height = bBox.size().y; 
var dist = height/(2 * Math.tan(f * Math.PI/360)); 
var pos = collada.scene.position; 
camera.position.set(pos.x, pos.y, dist * 1.1); // fudge factor so you can see the boundaries 
camera.lookAt(pos); 

快速小提琴:http://jsfiddle.net/p19r9re2/