В физическом движке Ammo.js статические тела представляют объекты с нулевой массой. Такие тела не подвержены динамическому воздействию сил, гравитации и столкновений с другими динамическими телами не изменяют их состояния. Они используются для пола, стен, препятствий и других неподвижных объектов сцены.
0. В Ammo.js это основной способ
отличить неподвижные объекты от динамических. Пример:let mass = 0; // Статическое тело
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)
– плоскостьФорма не зависит от массы и используется исключительно для коллизий.
btTransform. Для статических тел они
фиксированы и не обновляются динамикой:let transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(x, y, z));
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);
btDiscreteDynamicsWorld) так же, как
динамические:physicsWorld.addRigidBody(body);
collisionFlags = 2 (CF_STATIC_OBJECT).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);
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), чтобы уменьшить вычислительную
нагрузку на физический движок.Статические тела в Ammo.js — фундаментальная часть построения физически корректных сцен, обеспечивающая стабильность взаимодействия динамических объектов с окружающей средой. Их правильная конфигурация позволяет создавать полы, стены, платформы и другие элементы сцены без лишних затрат на вычисления.