В Three.js коллайдеры используются для определения столкновений объектов в 3D-пространстве. Они не обязательно должны визуализироваться, но служат для вычислений пересечений, проверок столкновений, физического моделирования и управления взаимодействием объектов. Основные типы коллайдеров — Box, Sphere, Capsule и Trimesh. Каждый из них имеет свои особенности применения и ограничения.
BoxCollider представляет собой осесимметричный параллелепипед, задаваемый размерами по трём осям: X, Y и Z. Он эффективен для объектов с прямоугольной формой или для грубой аппроксимации сложной геометрии.
Создание BoxCollider:
import * as THREE from 'three';
// размеры по осям
const width = 2;
const height = 3;
const depth = 1;
const boxGeometry = new THREE.BoxGeometry(width, height, depth);
const boxMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true });
const boxMesh = new THREE.Mesh(boxGeometry, boxMaterial);
// для коллизий обычно используется THREE.Box3
const boxCollider = new THREE.Box3().setFromObject(boxMesh);
Ключевые моменты:
SphereCollider задаётся центром и радиусом. Он хорошо подходит для сферических объектов или приближений сложных форм, где допустима некоторая погрешность.
Создание SphereCollider:
const sphereRadius = 1.5;
const sphereGeometry = new THREE.SphereGeometry(sphereRadius, 16, 16);
const sphereMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true });
const sphereMesh = new THREE.Mesh(sphereGeometry, sphereMaterial);
// коллайдер как THREE.Sphere
const sphereCollider = new THREE.Sphere();
sphereCollider.set(sphereMesh.position, sphereRadius);
Ключевые моменты:
CapsuleCollider — это цилиндр с полусферами на концах, который часто используется для персонажей в играх и симуляциях. Он обеспечивает естественное столкновение при перемещении по поверхности и предотвращает застревание в углах.
Создание CapsuleCollider:
const capsuleRadius = 0.5;
const capsuleHeight = 2.0;
const capsuleCollider = {
start: new THREE.Vector3(0, 0, 0),
end: new THREE.Vector3(0, capsuleHeight, 0),
radius: capsuleRadius
};
Ключевые моменты:
TrimeshCollider создаётся на основе геометрии объекта и представляет собой набор треугольников. Он обеспечивает максимально точное столкновение, повторяя форму объекта, но требует значительных вычислительных ресурсов.
Создание TrimeshCollider:
import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
const geometry = someMesh.geometry;
geometry.computeBoundingBox(); // обязательно для корректной работы
// коллайдер на основе треугольной сетки
const vertices = geometry.attributes.position.array;
const indices = geometry.index ? geometry.index.array : null;
// интеграция с физическим движком, например, cannon.js:
// const shape = new CANNON.Trimesh(vertices, indices);
Ключевые моменты:
| Тип коллайдера | Производительность | Точность | Основное применение |
|---|---|---|---|
| Box | Очень высокая | Низкая/средняя | Простые объекты, грубая аппроксимация |
| Sphere | Очень высокая | Средняя | Сферические объекты, персонажи |
| Capsule | Средняя | Средняя | Персонажи, коллайдеры камер |
| Trimesh | Низкая | Очень высокая | Сложная геометрия, точные столкновения |