Как получить размеры 3d-объекта с произвольным набором mesh-ей в Three.js?
При разработке приложений на Three.js зачастую возникает ситуация, когда на сцену помещается 3d object с набором потомков. Особенностью 3d-объекта является то, что у него отсутствует свойство геометрии с методом computeBoundingBox()
, который позволяет получить границы параллелепипеда (координаты max
и min
), в которые заключен объект. Тех, кто только начинает работать с Three.js, может заинтересовать вопрос, каким образом вычислить размеры такого объекта?
Есть простой способ. Для этого следует всего лишь создать объект с помощью конструктора THREE.Box3()
и воспользоваться методом setFromObject()
, в который передать наш 3d-объект, напичканный разнообразными мешами. Теперь у нас есть граничные координаты max
и min
, соответственно вычисление размеров уже дело арифметики.
var getBoundaryGeometry = function(obj) {
var modelBoundingBox;
modelBoundingBox = new THREE.Box3().setFromObject(obj);
modelBoundingBox.size = {};
modelBoundingBox.size.x = modelBoundingBox.max.x - modelBoundingBox.min.x;
modelBoundingBox.size.y = modelBoundingBox.max.y - modelBoundingBox.min.y;
modelBoundingBox.size.z = modelBoundingBox.max.z - modelBoundingBox.min.z;
return modelBoundingBox;
};
Как видите данный способ занимает всего пару строк. Хотя справедливости ради следует заметить, что можно и вручную сделать все те же самые действия, перебрав в цикле всех потомков 3d-объекта. При этом необходимо последовательно вызывать метод computeBoundingBox()
свойства geometry
каждого потомка и сравнением вычислять наиболее отдаленные вершины max
и min
.
В приведенном ниже примере на сцену добавлен 3d-объект с 10 рандомно спозиционированными кубами. При инициализации вычисляются размеры объекта, которые пишутся в блок в правом верхнем углу. При этом также происходит вращение вокруг оси y, поэтому размеры параллелепипеда, расположенного вдоль координатных осей и включающего в себя все кубы, изменяются. С помощью кнопки «Обновить» можно обновить размеры.
Добавить комментарий