2015-11-27 22 views
5

THREE.Box3.setFromObject(*object*) restituisce valori errati. Il modo migliore per mostrarti è mostrarti come lavoro:setFromObject (mesh) restituisce valori errati, a volte

Creo 2 mesh dai vertici. Il primo con la funzione triangle(), l'altra con trapezoidForm().

var triangle = function (base, height) { 

    return [ 
     new THREE.Vector2(0, -height/2), 
     new THREE.Vector2(-base/2, height/2), 
     new THREE.Vector2(base/2, height/2) 
    ]; 
} 
var trapezoidForm = function (base, upperBase, height) { 

    return [ 

     new THREE.Vector2(-base/2, height/2), 
     new THREE.Vector2(-upperBase/2, -height/2), 
     new THREE.Vector2(upperBase/2, -height/2), 
     new THREE.Vector2(base/2, height/2), 
    ]; 

} 

Io uso il valore restituito per creare la mia maglia:

var material = new THREE.MeshPhongMaterial({ color: 0x666666, /*specular: 0x101010*//*, shininess: 200*/ }); 
var shape  = new THREE.Shape(vertices); 
var mesh  = new THREE.Mesh(new THREE.ShapeGeometry(shape), material); 

e l'uso che per metterlo in scena, e di creare una BoundingBox:

mesh.position.set(posX, 0, posZ); 
mesh.rotation.set(-Math.PI/2, 0, 0); 
boundingBox.setFromObject(mesh); 

Ora, voglio trovare il centro delle mie 2 forme. Abbastanza facile: prendo il boundingbox e lo calcifico. Come questo:

var centerX = (boundingBox.max.x + boundingBox.min.x) * 0.5; 
var centerZ = (boundingBox.max.z + boundingBox.min.z) * 0.5; 

Qui è dove le cose vanno male: per il triangolo, calcola il posto giusto, ma per il trapezio, si scombina.

Di seguito è riportato uno schermo di stampa della console. I primi 3 vertici sono per il triangolo, seguito dal boundingbox. I prossimi 4 sono per il trapezio, con di nuovo il riquadro di delimitazione. Per i vertici: il primo numero è X-coord, il secondo è Z-coord.

Console log, showing the problem

risultato desiderato: 2 ° BoundingBox dovrebbe restituire qualcosa del genere:

max: X: 200 
    Z: 200 

min: X: -200 
    Z: -100 

Immagine che mostra lo stato attuale (triangolo ha il segno meno nel mezzo, trapezoidale no):

state of situation

risposta

0

Alla fine ho trovato la soluzione:

devo creare il mio boundingBox prima di riposizionare o ruotarla:

//Boundingbox 
boundingBox.setFromObject(mesh); 

mesh.position.set(posX, 0, posZ); 
mesh.rotation.set(-Math.PI/2, 0, 0); 

invece di:

mesh.position.set(posX, 0, posZ); 
mesh.rotation.set(-Math.PI/2, 0, 0); 
//Boundingbox 
boundingBox.setFromObject(mesh); 

il motivo per cui il triangolo non ha causato problemi, perché era reso su 0,0.