Коллайдеры: box, sphere, capsule, trimesh

В Three.js коллайдеры используются для определения столкновений объектов в 3D-пространстве. Они не обязательно должны визуализироваться, но служат для вычислений пересечений, проверок столкновений, физического моделирования и управления взаимодействием объектов. Основные типы коллайдеров — Box, Sphere, Capsule и Trimesh. Каждый из них имеет свои особенности применения и ограничения.


Box Collider

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);

Ключевые моменты:

  • Подходит для объектов с чётко выраженными гранями.
  • Очень быстрый для вычислений столкновений.
  • Ограничен прямоугольной формой, не учитывает углубления или выпуклости объекта.

Sphere Collider

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);

Ключевые моменты:

  • Очень быстрый для вычислений столкновений благодаря простоте формы.
  • Радиус можно динамически изменять для эффекта «растущей» или «сжимающейся» сферы.
  • Не подходит для объектов с острыми гранями или длинными выступами.

Capsule Collider

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
};

Ключевые моменты:

  • Идеально подходит для персонажей, пеших объектов, камер.
  • Обеспечивает плавное скольжение по поверхности.
  • Более сложен для расчёта столкновений, чем Box или Sphere, особенно при пересечении с произвольными полигонами.

Trimesh Collider

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 Низкая Очень высокая Сложная геометрия, точные столкновения

Практические рекомендации

  • Для статичных объектов часто достаточно Box или Sphere.
  • Для персонажей и подвижных объектов лучше использовать Capsule, чтобы избежать застреваний в углах.
  • Trimesh оправдан только для сложных моделей, где критична точность столкновения.
  • Комбинирование нескольких коллайдеров одного объекта часто улучшает баланс между производительностью и точностью.