После инициализации библиотеки Ammo.js создаётся объект, содержащий полный набор классов и функций физического движка Bullet Physics, транспилированного в WebAssembly/JavaScript. Этот объект выступает как пространственно именованный контейнер, внутри которого можно работать с физическими телами, формами, мировыми объектами и различными вспомогательными инструментами.
btVector3, btQuaternion Эти классы обеспечивают базовые математические структуры:
setValue(x, y, z), length(),
normalize(), op_add, op_sub.setValue(x, y, z, w),
setRotation(axis, angle), normalize().btCollisionShape и наследники Физическая форма объекта, определяющая его столкновения. Основные варианты:
btVector3 с половинными размерами.btRigidBody и btRigidBodyConstructionInfo Центральный класс, описывающий физическое тело:
btRigidBodyConstructionInfo(mass, motionState, shape, localInertia)
— объект конфигурации тела.btRigidBody — создаётся на основе конфигурации и
содержит состояние тела, методы применения силы
(applyForce, applyTorque), контроля позиции и
скорости.btDefaultMotionState Класс для управления положением и ориентацией тела в мире. Поддерживает:
getWorldTransform, setWorldTransform.btDiscreteDynamicsWorld и btSequentialImpulseConstraintSolver Центральный объект мира, управляющий симуляцией:
stepSimulation(deltaTime).Констрейнты (Constraints) Позволяют создавать физические связи между телами:
addConstraint в динамическом мире.Дополнительные инструменты
calculateLocalInertia,
getCenterOfMassTransform).После загрузки Ammo() создаётся объект, в котором все
классы располагаются как свойства:
Ammo().then(function(AmmoLib) {
let vector = new AmmoLib.btVector3(1, 2, 3);
let shape = new AmmoLib.btBoxShape(new AmmoLib.btVector3(1,1,1));
});
Структура условно делится на уровни:
btVector3,
btQuaternion, btTransform,
btMatrix3x3.btCollisionShape и
наследники.btRigidBody,
btRigidBodyConstructionInfo,
btDefaultMotionState.btDiscreteDynamicsWorld,
решатели, диспетчеры, broadphase.Каждый уровень связан с предыдущим: тела используют формы и математику, мир управляет телами и их взаимодействием.
Ammo.js использует WebAssembly, поэтому объекты не удаляются
автоматически сборщиком мусора. Для освобождения памяти
необходимо вызывать delete:
let vector = new Ammo.btVector3(1, 2, 3);
// Использование
vector.delete(); // освобождение памяти
Это правило распространяется на все объекты, кроме промисов и
объектов ядра Ammo().
btDiscreteDynamicsWorld) с решателем и
диспетчером.btBoxShape,
btSphereShape и др.).btRigidBody) с motionState и
формой.addRigidBody.stepSimulation.getWorldTransform
из motionState.Каждый компонент имеет взаимосвязи: изменение формы тела автоматически корректирует расчёт инерции, а применение силы через тело обновляет трансформацию motionState для визуализации.
Эта структура обеспечивает точное воспроизведение физики Bullet в браузере, позволяя строить как простые, так и сложные динамические сцены с телами, ограничениями и столкновениями.