2015-08-17 8 views
7

Sto usando il seguente codice per ridimensionare e centrare un oggetto compresso msgpack caricato usando ObjectLoader e non funziona. Penso che il mio oggetto abbia una rotazione su di esso, e quindi causa strani comportamenti. Su alcuni oggetti, si centra con successo, ma su altri il centraggio è sfalsato e anche il ridimensionamento non è corretto.Come centrare e ridimensionare l'oggetto threejs

In questo frammento, il risultato è la scena da ObjectLoader. Il mio pensiero era che l'oggetto non fosse molto ben formato, ma non ne sono sicuro. Volevo che la tabella sull'immagine o qualsiasi altro utente inserisse la mesh in cima alla griglia, centrata e ridimensionata in modo che la dimensione massima fosse di 1 unità.

Ogni misure quadrati 0.25, l'asse sono a 0,0,0 http://i.stack.imgur.com/fkKYC.png

// result is a threejs scene   
    var geometry = result.children[0].geometry; 
    var mesh = result.children[0]; 
    geometry.computeBoundingBox(); 
    var middle = new THREE.Vector3(); 
    middle.x  = (geometry.boundingBox.max.x + geometry.boundingBox.min.x)/2; 
    middle.y  = -geometry.boundingBox.min.y; 
    middle.z  = (geometry.boundingBox.max.z + geometry.boundingBox.min.z)/2; 
    middle.negate(); 
    mesh.position.copy(middle); 
    // scales the mesh up to maxsize 
    var maxSize = 1; 
    // gets the biggest axis 
    var maxVal = geometry.boundingBox.max.x - geometry.boundingBox.min.x; 
    if (maxVal < geometry.boundingBox.max.y - geometry.boundingBox.min.y) { 
     maxVal = geometry.boundingBox.max.y - geometry.boundingBox.min.y; 
    } 
    if (maxVal < geometry.boundingBox.max.z - geometry.boundingBox.min.z) { 
     maxVal = geometry.boundingBox.max.z - geometry.boundingBox.min.z; 
    // scales the current size proportional to the maxval, times maxsize 
    mesh.scale.divideScalar(maxVal * maxSize); 

    self.scene.add(result); 
+0

Il riquadro di selezione è il quadrato rosso attorno all'oggetto. –

risposta

5

Invece di chiamare geometry.computeBoundingBox(); chiamata geometry.center(); allora non è necessario il middle.x o middle.z e si può chiamare mesh.translateY() piuttosto che giocherellare con middle per tutto

+0

E come faccio a sapere il parametro per translateY dal momento che l'oggetto viene caricato dall'utente? Dovrei usare anche il riquadro di delimitazione e usare la middle.y? –

+0

'.center()' imposterà già il riquadro di selezione per te, quindi è solo aritmetica semplice a quel punto. – bjorke