btCapsuleShape, btCylinderShape, btConeShape

btCapsuleShape представляет собой капсулу — цилиндр с полусферическими окончаниями на концах. В физическом моделировании она широко используется для создания коллизий персонажей, особенно гуманоидов, благодаря плавным краям, которые предотвращают застревание в углах.

Создание капсулы:

let radius = 1.0; // радиус полусфер
let height = 2.0; // высота цилиндрической части
let capsuleShape = new Ammo.btCapsuleShape(radius, height);

Параметры:

  • radius — радиус сферических концов капсулы.
  • height — высота цилиндрической части (без учета полусфер).

Оси ориентации: Ammo.js поддерживает три ориентации капсулы: X, Y и Z. По умолчанию капсула ориентирована вдоль оси Y. Для других осей используются специализированные классы: btCapsuleShapeX, btCapsuleShapeZ.

Особенности использования:

  • Идеально для персонажей, так как при движении по наклонной поверхности коллизии проходят плавно.
  • Уменьшает вероятность «зацепов» о углы по сравнению с простым btBoxShape.
  • Масса и физическая инерция рассчитываются корректно для динамических тел.

btCylinderShape

btCylinderShape создаёт цилиндрическую форму для коллизий. Цилиндры полезны для объектов с прямыми боковыми стенками, например, колонн, бочек или транспортных средств.

Создание цилиндра:

let halfExtents = new Ammo.btVector3(1, 2, 1); // половинные размеры по X, Y, Z
let cylinderShape = new Ammo.btCylinderShape(halfExtents);
  • halfExtents — объект btVector3, задающий половинные размеры цилиндра по каждой оси.

Ориентация цилиндра: По умолчанию цилиндр ориентирован вдоль оси Y. Для других осей применяются:

  • btCylinderShapeX — вдоль X.
  • btCylinderShapeZ — вдоль Z.

Особенности:

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

btConeShape

btConeShape создаёт конус с круглым основанием и вершиной. Используется для объектов типа пирамид с закруглённым основанием, например, дорожных конусов или стрел, направленных вверх.

Создание конуса:

let radius = 1.0; // радиус основания
let height = 2.0; // высота конуса
let coneShape = new Ammo.btConeShape(radius, height);
  • radius — радиус основания конуса.
  • height — высота от основания до вершины.

Ориентация конуса: По умолчанию конус ориентирован вдоль оси Y. Также доступны:

  • btConeShapeX — вдоль X.
  • btConeShapeZ — вдоль Z.

Особенности:

  • Конусы имеют характерное скользкое поведение на наклонных поверхностях.
  • Используются для создания направленных физических объектов или ограничений, где важна острая вершина.
  • Точное взаимодействие с другими телами требует корректного расчёта центр масс и момента инерции.

Общие принципы использования форм в Ammo.js

  1. Масштабирование: Все формы задаются в единицах движка, поэтому важно поддерживать согласованную систему координат.
  2. Комбинирование форм: btCompoundShape позволяет объединять несколько простых форм (капсула + цилиндр + конус) для сложных объектов.
  3. Физические свойства: Форма определяет только коллизию, но не массу — масса и момент инерции задаются через btRigidBody.
  4. Оптимизация: Простые формы (капсула, цилиндр, конус) более производительны по сравнению с треугольными мешами (btBvhTriangleMeshShape).

Примеры совместного использования

Создание динамического тела с капсулой для персонажа:

let capsule = new Ammo.btCapsuleShape(0.5, 1.5);
let mass = 75;
let localInertia = new Ammo.btVector3(0, 0, 0);
capsule.calculateLocalInertia(mass, localInertia);

let startTransform = new Ammo.btTransform();
startTransform.setIdentity();
startTransform.setOrigin(new Ammo.btVector3(0, 10, 0));

let motionState = new Ammo.btDefaultMotionState(startTransform);
let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, capsule, localInertia);
let body = new Ammo.btRigidBody(rbInfo);

Использование цилиндров для объектов окружения:

let cylinder = new Ammo.btCylinderShape(new Ammo.btVector3(1, 2, 1));
let staticBody = new Ammo.btRigidBody(new Ammo.btRigidBodyConstructionInfo(0, new Ammo.btDefaultMotionState(), cylinder));

Конусы для специализированных столкновений:

let cone = new Ammo.btConeShape(0.5, 1.0);
let dynamicCone = new Ammo.btRigidBody(new Ammo.btRigidBodyConstructionInfo(10, new Ammo.btDefaultMotionState(), cone));

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