Создание статических тел (масса = 0)

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

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

  1. Масса равна нулю Статическое тело создается путем задания массы равной 0. В Ammo.js это основной способ отличить неподвижные объекты от динамических. Пример:
let mass = 0; // Статическое тело
  1. Форма тела (Collision Shape) Для статических тел создаются объекты формы (btCollisionShape), которые определяют геометрию столкновений:
  • Ammo.btBoxShape(new Ammo.btVector3(width/2, height/2, depth/2)) – прямоугольный параллелепипед
  • Ammo.btSphereShape(radius) – сфера
  • Ammo.btCylinderShape(new Ammo.btVector3(radius, height/2, radius)) – цилиндр
  • Ammo.btStaticPlaneShape(new Ammo.btVector3(normalX, normalY, normalZ), constant) – плоскость

Форма не зависит от массы и используется исключительно для коллизий.

  1. Трансформация тела (Transform) Позиция и ориентация задаются объектом btTransform. Для статических тел они фиксированы и не обновляются динамикой:
let transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(x, y, z));
  1. Создание тела (RigidBody) Для статических объектов создается btRigidBodyConstructionInfo с нулевой массой и затем btRigidBody:
let localInertia = new Ammo.btVector3(0, 0, 0); // Для статических тел инерция не нужна
let motionState = new Ammo.btDefaultMotionState(transform);

let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, shape, localInertia);
let body = new Ammo.btRigidBody(rbInfo);
  1. Добавление тела в мир Статические тела включаются в физический мир (btDiscreteDynamicsWorld) так же, как динамические:
physicsWorld.addRigidBody(body);

Особенности работы с статическими телами

  • Нулевые силы и импульсы – любые попытки применить силу или импульс к статическому телу не приведут к движению.
  • Стабильность сцены – статические тела не вызывают дребезга или нестабильности при столкновениях с динамическими объектами.
  • Взаимодействие с триггерами – статические тела могут использоваться как триггерные объекты, если их тело настроено на collisionFlags = 2 (CF_STATIC_OBJECT).
  • Комбинация с динамическими телами – динамическое тело при столкновении с статическим будет реагировать корректно, отскакивая или скользя по поверхности.

Примеры использования

  1. Пол сцены
let groundShape = new Ammo.btBoxShape(new Ammo.btVector3(50, 1, 50));
let groundTransform = new Ammo.btTransform();
groundTransform.setIdentity();
groundTransform.setOrigin(new Ammo.btVector3(0, -1, 0));

let groundMotionState = new Ammo.btDefaultMotionState(groundTransform);
let groundRbInfo = new Ammo.btRigidBodyConstructionInfo(0, groundMotionState, groundShape, new Ammo.btVector3(0, 0, 0));
let groundBody = new Ammo.btRigidBody(groundRbInfo);

physicsWorld.addRigidBody(groundBody);
  1. Стена
let wallShape = new Ammo.btBoxShape(new Ammo.btVector3(0.5, 5, 10));
let wallTransform = new Ammo.btTransform();
wallTransform.setIdentity();
wallTransform.setOrigin(new Ammo.btVector3(10, 5, 0));

let wallMotionState = new Ammo.btDefaultMotionState(wallTransform);
let wallRbInfo = new Ammo.btRigidBodyConstructionInfo(0, wallMotionState, wallShape, new Ammo.btVector3(0, 0, 0));
let wallBody = new Ammo.btRigidBody(wallRbInfo);

physicsWorld.addRigidBody(wallBody);

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

  • Для неподвижных массивных объектов рекомендуется использовать btStaticPlaneShape или простые формы (Box, Sphere), чтобы уменьшить вычислительную нагрузку на физический движок.
  • Статические тела не требуют вычисления инерции, что ускоряет шаг симуляции.
  • При больших сценах с множеством неподвижных объектов их можно объединять в compound shape, чтобы сократить количество тел в мире.

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