В библиотеке Three.js ограничивающие объёмы играют ключевую роль в оптимизации сцены и обработке столкновений. Наиболее часто используются Box3 и Sphere, представляющие собой осесимметричные ограничивающие коробки и сферы соответственно. Они позволяют быстро определять пересечения объектов, проверять видимость и управлять пространственными отношениями между элементами сцены.
Box3 описывает трёхмерный прямоугольный параллелепипед с осями, параллельными осям координат. Основные свойства и методы:
const box = new THREE.Box3();
box.min.set(-1, -1, -1);
box.max.set(1, 1, 1);
THREE.Vector3,
представляющий минимальные координаты (x, y, z) коробки.THREE.Vector3,
представляющий максимальные координаты коробки.const box = new THREE.Box3();
box.setFromObject(mesh);
const center = new THREE.Vector3(0, 0, 0);
const size = new THREE.Vector3(2, 2, 2);
const box = new THREE.Box3().setFromCenterAndSize(center, size);
const center = new THREE.Vector3();
box.getCenter(center);
const size = new THREE.Vector3();
box.getSize(size);
box.expandByPoint(new THREE.Vector3(2, 3, 1));
const inside = box.containsPoint(new THREE.Vector3(0.5, 0.5, 0.5));
const box2 = new THREE.Box3(new THREE.Vector3(-0.5, -0.5, -0.5), new THREE.Vector3(0.5, 0.5, 0.5));
const intersects = box.intersectsBox(box2);
box.union(box2);
Box3 часто используется для:
Sphere описывает сферу с центром и радиусом, идеально подходящую для объектов с приблизительно сферической формой. Основные свойства:
const sphere = new THREE.Sphere();
sphere.center.set(0, 0, 0);
sphere.radius = 1;
THREE.Vector3 центра
сферы.const points = [new THREE.Vector3(1, 0, 0), new THREE.Vector3(0, 1, 0)];
const sphere = new THREE.Sphere().setFromPoints(points);
const inside = sphere.containsPoint(new THREE.Vector3(0.5, 0, 0));
const distance = sphere.distanceToPoint(new THREE.Vector3(2, 0, 0));
const sphere2 = new THREE.Sphere(new THREE.Vector3(1, 1, 1), 1);
const intersects = sphere.intersectsSphere(sphere2);
sphere.expandByPoint(new THREE.Vector3(2, 0, 0));
const closest = new THREE.Vector3();
sphere.clampPoint(new THREE.Vector3(2, 0, 0), closest);
| Свойство | Box3 | Sphere |
|---|---|---|
| Форма | Ось-параллельный параллелепипед | Сфера |
| Проверка точек | Быстро через containsPoint |
Быстро через containsPoint |
| Проверка пересечений | intersectsBox |
intersectsSphere |
| Применение | Объекты с прямоугольной геометрией, сцена, фрустрация | Сферические или округлые объекты, столкновения, радиусные зоны |
| Вычисление объёма | Через getSize |
Через radius и формулы объёма |
Определение видимости камеры:
const frustum = new THREE.Frustum();
const cameraViewProjectionMatrix = new THREE.Matrix4();
camera.updateMatrixWorld();
camera.matrixWorldInverse.copy(camera.matrixWorld).invert();
cameraViewProjectionMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
frustum.setFromProjectionMatrix(cameraViewProjectionMatrix);
if (frustum.intersectsBox(box)) {
// объект видим
}
Столкновения объектов:
if (box1.intersectsBox(box2)) {
// обработка столкновения
}
if (sphere1.intersectsSphere(sphere2)) {
// обработка столкновения сфер
}
Оптимизация сцены:
Box3 и Sphere позволяют отсеивать объекты, находящиеся вне видимой области, и ускорять рендеринг при больших количествах объектов, комбинируя их с пространственными структурами вроде Octree или BVH.
Box3 и Sphere можно создавать напрямую из объектов:
const geometry = new THREE.BoxGeometry(1, 2, 3);
const mesh = new THREE.Mesh(geometry, material);
const boundingBox = new THREE.Box3().setFromObject(mesh);
const boundingSphere = new THREE.Sphere().setFromPoints(geometry.attributes.position.array.map((v, i) => new THREE.Vector3(
geometry.attributes.position.array[i*3],
geometry.attributes.position.array[i*3 + 1],
geometry.attributes.position.array[i*3 + 2]
)));
Для геометрий BufferGeometry Three.js также предоставляет метод computeBoundingBox() и computeBoundingSphere(), которые автоматически вычисляют ограничения:
geometry.computeBoundingBox();
geometry.computeBoundingSphere();
Эти методы сохраняют результаты в свойствах
geometry.boundingBox и
geometry.boundingSphere, что удобно для быстрой проверки
столкновений и оптимизации рендеринга.
Box3 и Sphere являются фундаментальными инструментами при работе с трехмерными сценами, обеспечивая эффективное управление пространственными отношениями объектов, ускоряя проверку столкновений и облегчая интеграцию с камерами и физическими системами. Они служат основой для создания более сложных алгоритмов пространственного анализа и оптимизации.