Любой способ получить ограничительную рамку из объекта three.js Object3D?
Я загружаю OBJ файл, используя Three.js и OBJLoader.js. Это возвращает объект Three.Object3D, который имеет то, что вы ожидаете от 3D-модели (вектор положения, вектор вверх...)
Что я не могу понять, так это, как получить ограничительную рамку для этого - возможно ли это?
Ответы
Ответ 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()