Составные тела со смещёнными центрами масс

Ammo.js предоставляет мощный инструмент для моделирования физики твёрдых тел в браузере на основе движка Bullet Physics. Одной из наиболее сложных и интересных задач является создание составных тел со смещёнными центрами масс. Такие тела позволяют моделировать объекты с нестандартной геометрией, где центр масс не совпадает с геометрическим центром, что критически важно для реалистичной симуляции поведения при вращении и столкновениях.


Основные принципы

В Bullet Physics (и, соответственно, в Ammo.js) физическое тело определяется двумя ключевыми параметрами:

  1. Форма коллизии (btCollisionShape) – геометрическое описание тела, которое участвует в расчетах столкновений.
  2. Масса и инерционный тензор – определяют динамику движения и реакцию на силы и моменты.

Для составного тела с смещённым центром масс используются составные формы (btCompoundShape). Каждая подформа может быть смещена относительно локальной системы координат составного тела. Итоговый центр масс определяется автоматическим вычислением на основе масс и положений всех подформ.


Создание составного тела

  1. Инициализация Ammo.js
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));
});
  1. Создание составной формы
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, что позволяет моделировать объекты любой сложности.


Примеры применения

  1. Корабли и автомобили – центр масс смещается вниз для увеличения устойчивости.
  2. Механические манипуляторы – смещение массы помогает учитывать реальные моменты инерции рычагов и суставов.
  3. Игровые персонажи и объекты – сложные конструкции с распределённой массой, например, робот с грузами на руках.

Рекомендации по оптимизации

  • Минимизировать количество подформ, чтобы ускорить расчёт столкновений.
  • Использовать простые формы (btBoxShape, btSphereShape, btCylinderShape) вместо сложных мешей, когда возможно.
  • Проверять вычисленный центр масс с помощью визуализации, например, через трёхмерный маркер.

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