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?

32
demandé sur larryq 2013-03-19 10:27:15

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.

54
répondu caseygrun 2017-11-28 10:19:02

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.

24
répondu ammulder 2014-05-09 01:45:49

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 + ')' );
}
16
répondu Jodes 2014-06-20 13:17:53

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

11
répondu gaitat 2015-03-25 23:36:34