2015-08-17 14 views
7

Ich verwende den folgenden Code, um ein mit dem ObjectLoader geladenes komprimiertes msgpack-Objekt zu skalieren und zu zentrieren, und es funktioniert nicht. Ich denke, dass mein Objekt eine Drehung darauf hat und dadurch seltsames Verhalten verursacht. Bei einigen Objekten zentriert es sich erfolgreich, bei anderen hingegen ist die Zentrierung ausgeglichen, und auch die Skalierung ist nicht richtig.So zentrieren und skalieren Sie Objekt threejs

In diesem Snippet ist das Ergebnis die Szene aus dem ObjectLoader. Mein Gedanke war, dass das Objekt nicht sehr gut geformt war, aber ich bin mir nicht sicher. Ich wollte, dass die Tabelle auf dem Bild oder ein anderes vom Benutzer eingegebenes Netz oben auf dem Raster liegt, zentriert und skaliert ist, so dass die maximale Größe 1 Einheit beträgt.

Jedes Flächenmaß 0,25, ist die Achse bei 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

Die Bounding Box ist das rote Quadrat um das Objekt. –

Antwort

5

Statt geometry.computeBoundingBox(); Aufruf Aufruf geometry.center(); dann die Sie nicht brauchen middle.x oder middle.z und Sie können mesh.translateY() nur eher nennen als Hantieren mit middle überhaupt

+0

Und woher kenne ich den Parameter für translateY, da das Objekt vom Benutzer hochgeladen wurde? Ich müsste dafür auch die Bounding Box benutzen und die middle.y benutzen? –

+0

'.center()' wird bereits die Bounding Box für Sie festlegen, so dass es zu diesem Zeitpunkt einfach nur arithmetisch ist. – bjorke