btCapsuleShape представляет собой капсулу — цилиндр с
полусферическими окончаниями на концах. В физическом моделировании она
широко используется для создания коллизий персонажей, особенно
гуманоидов, благодаря плавным краям, которые предотвращают застревание в
углах.
Создание капсулы:
let radius = 1.0; // радиус полусфер
let height = 2.0; // высота цилиндрической части
let capsuleShape = new Ammo.btCapsuleShape(radius, height);
Параметры:
Оси ориентации: Ammo.js поддерживает три ориентации
капсулы: X, Y и Z. По умолчанию капсула ориентирована вдоль оси Y. Для
других осей используются специализированные классы:
btCapsuleShapeX, btCapsuleShapeZ.
Особенности использования:
btBoxShape.btCylinderShape создаёт цилиндрическую форму для
коллизий. Цилиндры полезны для объектов с прямыми боковыми стенками,
например, колонн, бочек или транспортных средств.
Создание цилиндра:
let halfExtents = new Ammo.btVector3(1, 2, 1); // половинные размеры по X, Y, Z
let cylinderShape = new Ammo.btCylinderShape(halfExtents);
btVector3,
задающий половинные размеры цилиндра по каждой оси.Ориентация цилиндра: По умолчанию цилиндр ориентирован вдоль оси Y. Для других осей применяются:
btCylinderShapeX — вдоль X.btCylinderShapeZ — вдоль Z.Особенности:
btConeShape создаёт конус с круглым основанием и
вершиной. Используется для объектов типа пирамид с закруглённым
основанием, например, дорожных конусов или стрел, направленных
вверх.
Создание конуса:
let radius = 1.0; // радиус основания
let height = 2.0; // высота конуса
let coneShape = new Ammo.btConeShape(radius, height);
Ориентация конуса: По умолчанию конус ориентирован вдоль оси Y. Также доступны:
btConeShapeX — вдоль X.btConeShapeZ — вдоль Z.Особенности:
btCompoundShape
позволяет объединять несколько простых форм (капсула + цилиндр + конус)
для сложных объектов.btRigidBody.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-сценах, сочетая удобство и реалистичное поведение объектов.