Подтвердить что ты не робот

Любой способ получить ограничительную рамку из объекта three.js Object3D?

Я загружаю OBJ файл, используя Three.js и OBJLoader.js. Это возвращает объект Three.Object3D, который имеет то, что вы ожидаете от 3D-модели (вектор положения, вектор вверх...)

Что я не могу понять, так это, как получить ограничительную рамку для этого - возможно ли это?

4b9b3361

Ответ 1

Вам не нужно перебирать все дочерние объекты объекта; в библиотеке есть способ: THREE.Box3#setFromObject: посмотреть документы. Например, вы можете:

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

чтобы получить ограничивающий прямоугольник obj, включая все его дочерние элементы, и учитывать любые переводы, вращения и т.д.

Обратите внимание, что помощник BoundingBox предназначен для рисования ограничительной рамки в сцене, а не для вычисления ограничивающего прямоугольника какого-либо объекта.

Ответ 2

Если вы хотите, чтобы позиция и размер ограничительной рамки, когда объект появился в сцене, попробуйте 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 в геометрии не учитывает переводы, вращения или масштабирование, которые могут быть применены к родительской сетке и т.д., и мне было очень сложно настроить это вручную, но помощник делает это для вы.

Ответ 3

Для любой фигуры на ее объекте геометрии есть свойство boundingBox. Это свойство содержит объект THREE.Box3. Этот объект Box3 состоит из двух объектов THREE.Vector3, min и 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 + ')' );

Для более сложных форм, таких как загруженные из JSON Object files, свойство ограничивающего прямоугольника undefined по умолчанию. Он должен быть вычислен явно.

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 + ')' );
}

Ответ 4

Да, вам понадобится что-то вроде этого:

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:

Этот метод существует до того, как доступны BoundingBoxHelper() или BoxHelper()