Работа с физическим движком Ammo.js начинается с правильного выбора формы для объектов сцены. Форма определяет, как движок будет рассчитывать столкновения, инерцию и поведение объекта при взаимодействии с другими телами. Выбор формы напрямую влияет на производительность и точность симуляции.
btBoxShape Используется для объектов с прямоугольной геометрией. Идеальна для стен, ящиков, платформ.
btSphereShape Оптимальна для круглых объектов: мячей, планет, шариков.
btCylinderShape / btCapsuleShape Используется для объектов цилиндрической формы, капсул. Часто применяется для персонажей в играх.
btConvexHullShape Позволяет создавать сложные формы на основе вершин.
btBvhTriangleMeshShape Используется для статических мешей, таких как ландшафт или сложные декорации.
Статика или динамика объекта
Точность столкновений
Производительность
Назначение объекта в сцене
После выбора типа формы важно корректно задать размеры и смещение. Для btBoxShape и btSphereShape размеры определяются явно, а для btConvexHullShape необходимо правильно построить массив вершин с учётом центра тяжести. Центр тяжести влияет на физические свойства: неправильное смещение приведёт к неестественному поведению объекта при столкновениях.
Пример создания box shape:
const halfExtents = new Ammo.btVector3(1, 2, 3);
const boxShape = new Ammo.btBoxShape(halfExtents);
Пример создания sphere shape:
const radius = 1.5;
const sphereShape = new Ammo.btSphereShape(radius);
Для convex hull необходимо добавлять вершины по одной:
const hullShape = new Ammo.btConvexHullShape();
vertices.forEach(v => hullShape.addPoint(new Ammo.btVector3(v.x, v.y, v.z)));
В некоторых случаях требуется составная форма, чтобы точнее
моделировать объект. Ammo.js поддерживает
btCompoundShape, позволяющий объединять несколько форм в
одну. Каждая форма добавляется с собственным смещением и ориентацией,
что позволяет создавать сложные объекты, сохраняя высокую
производительность.
const compound = new Ammo.btCompoundShape();
const box = new Ammo.btBoxShape(new Ammo.btVector3(1,1,1));
const sphere = new Ammo.btSphereShape(0.5);
const transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(0,2,0));
compound.addChildShape(transform, box);
compound.addChildShape(transform, sphere);
Правильный выбор формы — ключ к стабильной, производительной и реалистичной физике в сцене.