Капсула: CapsuleGeometry

Oimo.js — это легковесный физический движок для Javascript, обеспечивающий реалистичное моделирование твердых тел в 3D-пространстве. Он работает на основе интеграции Ньютона и вычисляет столкновения, силы, трение и инерцию объектов в реальном времени. Центральными элементами являются тела (RigidBody) и их геометрии (Geometry), которые задают форму и физические свойства объекта. Среди разнообразных геометрий выделяется капсула (CapsuleGeometry), которая сочетает цилиндр и полусферы на концах, идеально подходящая для моделирования персонажей, сферических объектов и объектов с плавными краями.

CapsuleGeometry: структура и параметры

CapsuleGeometry представляет собой сочетание цилиндра и двух полусфер на концах, формируя удлиненную сферическую форму. В Oimo.js капсула задается с помощью трех основных параметров:

  1. radius — радиус полусфер и цилиндрической части. Определяет ширину капсулы.
  2. height — длина цилиндрической части между полусферами. Общая длина капсулы равна height + 2 * radius.
  3. axis — направление продольной оси капсулы (x, y или z), определяющее ориентацию объекта в пространстве.

Пример создания капсулы:

import * as OIMO from "oimo";

const world = new OIMO.World({
    timestep: 1/60,
    gravity: [0, -9.8, 0],
    iterations: 8
});

const capsuleShape = new OIMO.CapsuleGeometry({
    radius: 0.5,
    height: 2,
    axis: "y"
});

const capsuleBody = new OIMO.RigidBody({
    type: "dynamic",
    position: [0, 5, 0],
    shapes: [capsuleShape]
});

world.addRigidBody(capsuleBody);

Особенности взаимодействия капсулы с физическим миром

  • Столкновения: Капсула обеспечивает более гладкое скольжение по поверхностям по сравнению с коробками или полигонами, благодаря закругленным концам. Это делает её оптимальной для персонажей в платформерах или симуляциях, где требуется минимизация застреваний.
  • Физическая стабильность: Капсульные тела более устойчивы при вращениях и наклонах, так как полусферы на концах уменьшают вероятность «зацепления» за другие объекты.
  • Производительность: CapsuleGeometry требует меньше вычислений для столкновений, чем сложные меш-геометрии, что важно для динамичных сцен.

Управление положением и вращением

Капсульное тело, как и любое тело в Oimo.js, обладает позицией, ориентацией и скоростью. Для управления можно использовать методы setPosition, setRotation и свойства linearVelocity, angularVelocity. Например:

// Перемещение капсулы
capsuleBody.setPosition([2, 10, 0]);

// Задание скорости
capsuleBody.linearVelocity = [0, -5, 0];
capsuleBody.angularVelocity = [0, 1, 0];

Ось капсулы (axis) не изменяет физическую ориентацию автоматически при вращении; необходимо использовать матрицы вращения или кватернионы для сложных движений.

Коллизии и слои столкновений

Oimo.js позволяет задавать маски столкновений и слои, что полезно для игр и симуляций. Например, капсула персонажа может взаимодействовать только с землей и врагами, игнорируя другие капсулы или объекты интерфейса:

capsuleBody.shapes[0].collisionGroup = 1; // группа персонажей
capsuleBody.shapes[0].collisionMask = 2 | 4; // взаимодействует с землей (2) и врагами (4)

Интеграция с визуализацией

CapsuleGeometry обычно не используется напрямую для рендеринга, так как это физическая геометрия. Для визуализации создается отдельный 3D-меш, синхронизируемый с положением и вращением тела:

// Three.js пример
const geometry = new THREE.CapsuleGeometry(0.5, 2, 8, 16);
const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

// В каждом кадре
mesh.position.copy(capsuleBody.getPosition());
mesh.quaternion.copy(capsuleBody.getQuaternion());

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

  • Использовать CapsuleGeometry для персонажей или объектов с высоким аспектом (длинные и тонкие), чтобы минимизировать застревания.
  • Избегать слишком маленького radius относительно height, так как это может вызвать нестабильные столкновения.
  • Для динамических объектов с вращением лучше выбирать ось капсулы вдоль направления движения, чтобы обеспечить более естественное поведение.

CapsuleGeometry в Oimo.js сочетает простоту, стабильность и производительность, делая её незаменимой для физически корректного моделирования человеческих фигур, спортивного инвентаря и игровых объектов с закругленными концами.