three.js

¿Alguna forma de obtener un cuadro delimitador desde un Object3D three.js?



(4)

Para cualquier forma, en su objeto de geometría, hay una propiedad boundingBox . Esta propiedad contiene un objeto THREE.Box3 . Este objeto Box3 consta de dos objetos THREE.Vector3 , min y max .

var geometry = new THREE.CylinderGeometry(...); var material = new THREE.LineBasicMaterial(...); var mesh = new THREE.Mesh(geometry, material); var boundingBox = mesh.geometry.boundingBox.clone(); alert(''bounding box coordinates: '' + ''('' + boundingBox.min.x + '', '' + boundingBox.min.y + '', '' + boundingBox.min.z + ''), '' + ''('' + boundingBox.max.x + '', '' + boundingBox.max.y + '', '' + boundingBox.max.z + '')'' );

Para las formas más complejas, como las cargadas desde los archivos de objetos JSON , la propiedad del cuadro delimitador no está definida de manera predeterminada. Debe ser calculado explícitamente.

var loader = new THREE.ObjectLoader(); loader.load(imagePath, function(object){ geometry = object.children[0].children[0].geometry; // substitute the path to your geometry geometry.computeBoundingBox(); // otherwise geometry.boundingBox will be undefined var boundingBox = geometry.boundingBox.clone(); alert(''bounding box coordinates: '' + ''('' + boundingBox.min.x + '', '' + boundingBox.min.y + '', '' + boundingBox.min.z + ''), '' + ''('' + boundingBox.max.x + '', '' + boundingBox.max.y + '', '' + boundingBox.max.z + '')'' ); }

Estoy cargando un archivo OBJ usando Three.js y OBJLoader.js. Esto devuelve un objeto Three.Object3D, que tiene lo que se esperaría de un modelo 3D (vector de posición, vector ascendente ...)

Lo que no puedo descifrar es cómo conseguir un cuadro delimitador. ¿Es esto posible?


Sí, necesitarías algo como esto:

if (object instanceof THREE.Object3D) { object.traverse (function (mesh) { if (mesh instanceof THREE.Mesh) { mesh.geometry.computeBoundingBox (); var bBox = mesh.geometry.boundingBox; // compute overall bbox minX = Math.min (minX, bBox.min.x); minY = Math.min (minY, bBox.min.y); minZ = Math.min (minZ, bBox.min.z); maxX = Math.max (maxX, bBox.max.x); maxY = Math.max (maxY, bBox.max.y); maxZ = Math.max (maxZ, bBox.max.z); } }); var bBox_min = new THREE.Vector3 (minX, minY, minZ); var bBox_max = new THREE.Vector3 (maxX, maxY, maxZ); var bBox_new = new THREE.Box3 (bBox_min, bBox_max); scene.add (object); }

EDITAR:

Este método es antes de que BoundingBoxHelper() o BoxHelper() estuvieran disponibles


Si desea la posición y el tamaño del cuadro delimitador a medida que el objeto aparece en la escena , intente BoundingBoxHelper:

var helper = new THREE.BoundingBoxHelper(someObject3D, 0xff0000); helper.update(); // If you want a visible bounding box scene.add(helper); // If you just want the numbers console.log(helper.box.min); console.log(helper.box.max);

El .boundingBox en la geometría no tiene en cuenta las traducciones, rotaciones o escalas que se pueden aplicar a la malla principal, etc., y me resultó muy difícil ajustarlo manualmente, pero el ayudante lo hace por usted.


No necesita iterar sobre todos los elementos secundarios del objeto; hay un método en la biblioteca para hacer esto: THREE.Box3#setFromObject : ver los documentos . Por ejemplo, puedes hacer:

var bbox = new THREE.Box3().setFromObject(obj);

para obtener el cuadro delimitador de obj , incluidos todos sus hijos, y la contabilidad de las traducciones, rotaciones, etc.

Tenga en cuenta que el ayudante BoundingBox está destinado a dibujar un cuadro delimitador en la escena, no solo para calcular el cuadro delimitador de algún objeto.