N'importe quel moyen d'obtenir une boîte de trois.js Object3D?
je charge un fichier OBJ en utilisant trois.js et OBJLoader.js. Ceci renvoie à une de Trois.Objet Object3D, qui a ce que vous attendez d'un modèle 3D (vecteur de position, vecteur Ascendant)...)
ce que je ne peux pas comprendre c'est comment obtenir une boîte de bounding pour elle-- est-ce possible?
4 réponses
Vous n'avez pas besoin de parcourir tous les enfants de l'objet; il y a une méthode dans la bibliothèque pour faire ceci: THREE.Box3#setFromObject
:voir la doc. Par exemple, vous pouvez faire:
var bbox = new THREE.Box3().setFromObject(obj);
pour obtenir la boîte englobante de l'
notez que le BoundingBox
helper est destiné à dessiner une boîte de délimitation dans la scène, pas pour simplement calculer la boîte de délimitation d'un objet.
si vous voulez la position et la taille de la boîte limite comme l'objet apparaît dans la scène, essayez de le 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);
.boundingBox
sur la géométrie ne tient pas compte des traductions, des rotations, ou de la mise à l'échelle qui peuvent être appliquées au maillage parent et ainsi de suite. et j'ai trouvé très difficile de régler ça manuellement, mais l'assistant le fait pour vous.
pour n'importe quelle forme, sur son objet de géométrie, il y a un boundingBox
propriété. Cette propriété possède un THREE.Box3
objet. Ce Box3
objet se compose de deux THREE.Vector3
objets min
et 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 + ')' );
pour les formes plus complexes, comme celles chargées de Objet JSON fichiers, la propriété bounding box n'est pas définie par défaut. Il doit être calculé explicitement.
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 + ')' );
}
Oui, vous aurait besoin de quelque chose comme ceci:
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);
}
EDIT:
Cette méthode est avant BoundingBoxHelper()
ou BoxHelper()
étaient