Ammo.js предоставляет мощный инструмент для моделирования физики твёрдых тел в браузере на основе движка Bullet Physics. Одной из наиболее сложных и интересных задач является создание составных тел со смещёнными центрами масс. Такие тела позволяют моделировать объекты с нестандартной геометрией, где центр масс не совпадает с геометрическим центром, что критически важно для реалистичной симуляции поведения при вращении и столкновениях.
В Bullet Physics (и, соответственно, в Ammo.js) физическое тело определяется двумя ключевыми параметрами:
btCollisionShape) –
геометрическое описание тела, которое участвует в расчетах
столкновений.Для составного тела с смещённым центром масс используются
составные формы (btCompoundShape). Каждая
подформа может быть смещена относительно локальной системы координат
составного тела. Итоговый центр масс определяется автоматическим
вычислением на основе масс и положений всех подформ.
Ammo().then(() => {
// физический мир
let collisionConfiguration = new Ammo.btDefaultCollisionConfiguration();
let dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);
let broadphase = new Ammo.btDbvtBroadphase();
let solver = new Ammo.btSequentialImpulseConstraintSolver();
let physicsWorld = new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
physicsWorld.setGravity(new Ammo.btVector3(0, -9.8, 0));
});
let compoundShape = new Ammo.btCompoundShape();
// Первая подформа: куб
let boxShape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));
let boxTransform = new Ammo.btTransform();
boxTransform.setIdentity();
boxTransform.setOrigin(new Ammo.btVector3(0, 1, 0)); // смещение от центра состава
compoundShape.addChildShape(boxTransform, boxShape);
// Вторая подформа: сфера
let sphereShape = new Ammo.btSphereShape(0.5);
let sphereTransform = new Ammo.btTransform();
sphereTransform.setIdentity();
sphereTransform.setOrigin(new Ammo.btVector3(2, 0, 0));
compoundShape.addChildShape(sphereTransform, sphereShape);
В этом примере куб и сфера составляют единое тело, при этом центр
масс смещён к более массивной подформе. btCompoundShape
автоматически вычисляет общий центр масс.
Масса и инерция составного тела определяют его поведение при вращении и столкновениях. Ammo.js требует расчёта локального тензора инерции для правильной симуляции.
let mass = 5;
let localInertia = new Ammo.btVector3(0, 0, 0);
compoundShape.calculateLocalInertia(mass, localInertia);
let startTransform = new Ammo.btTransform();
startTransform.setIdentity();
startTransform.setOrigin(new Ammo.btVector3(0, 5, 0));
let motionState = new Ammo.btDefaultMotionState(startTransform);
let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, compoundShape, localInertia);
let rigidBody = new Ammo.btRigidBody(rbInfo);
physicsWorld.addRigidBody(rigidBody);
calculateLocalInertia учитывает смещение всех подформ и
формирует корректный тензор, который определяет, как тело будет
вращаться при действии сил и моментов.
Смещение центра масс влияет на поведение объекта:
В btCompoundShape смещения подформ задаются через
btTransform, что позволяет моделировать объекты любой
сложности.
btBoxShape,
btSphereShape, btCylinderShape) вместо сложных
мешей, когда возможно.Составные тела со смещёнными центрами масс обеспечивают высокую реалистичность физических симуляций, позволяя точно моделировать динамику сложных объектов и их взаимодействие с окружением.