2012-08-01 10 views
6

C'è un modo per determinare la dimensione e la posizione di un modello e quindi autocentrare e ridimensionare il modello in modo che sia posizionato all'origine e all'interno della vista del modello telecamera? Trovo che quando importare un modello Collada da Sketchup, se il modello non è centrato all'origine in Sketchup, non è centrato in three.js. Mentre ciò ha senso, sarebbe bello centrare automaticamente l'origine dopo l'importazione.Smart Centering e ridimensionamento dopo l'importazione del modello in three.js

Ho visto alcune discussioni nei diversi caricatori di file sull'ottenere i limiti del modello importato, ma non sono riuscito a trovare alcun riferimento su come farlo.

Il problema del ridimensionamento è meno importante, ma mi sembra che si riferisca a una funzione di limiti, motivo per cui l'ho chiesto anch'io.

EDIT:

Maggiori informazioni dopo aver giocato un po 'intorno e un paio di ricerche su Google ...

Il codice per la mia funzione di callback sul caricamento del file Collada ora assomiglia a questo:

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.... 

Questo sta generando alcuni dati interessanti sul modello. Posso ottenere una coordinata estrema globale per il modello, che presumo (probabilmente erroneamente) sarebbe vicino a un riquadro di delimitazione generale per il modello. Ma il tentativo di fare qualsiasi cosa con quelle coordinate (come la media e lo spostamento del modello nelle medie) genera risultati incoerenti.

Inoltre, sembra inefficiente dover scorrere ogni geometria per un modello, c'è un modo migliore? In caso contrario, questa logica può essere applicata ad altri caricatori?

+0

Questi dovrebbero aiutare http://stackoverflow.com/questions/14614252/how-to-fit-camera-to-object http://stackoverflow.com/questions/20059612/calculate-camera-zoom-required -per-oggetto-per-adattarsi all'altezza dello schermo http://stackoverflow.com/questions/11274358/aggiustare-camera-per-visibile-three-js-shape http://stackoverflow.com/domande/16462848/tre-JS-zoom-to-fit-larghezza-di-oggetti-ignorando altezza – gaitat

risposta

2

È possibile utilizzare THREE.Box3#setFromObject per ottenere il riquadro di delimitazione di qualsiasi Object3D, incluso un modello importato, senza dover scorrere le geometrie manualmente. Quindi potresti fare qualcosa come

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

per ottenere l'estremo riquadro di delimitazione del modello; quindi è possibile utilizzare una qualsiasi delle tecniche nelle risposte collegate alla gaitat per impostare correttamente la posizione della telecamera. Per esempio, si potrebbe seguire questa tecnica (How to Fit Camera to Object) e fare qualcosa di simile:

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); 

violino rapida: http://jsfiddle.net/p19r9re2/.

Problemi correlati