btStaticPlaneShape — это специализированная форма коллизии в библиотеке Ammo.js, предназначенная для представления бесконечных плоскостей. Она используется для моделирования пола, стен или любых других поверхностей, которые не подвержены динамическим воздействиям и остаются статичными в симуляции. Ключевым преимуществом btStaticPlaneShape является высокая производительность, так как она не требует сложных вычислений столкновений с другими телами за пределами простой проверки проекции точек на плоскость.
Конструктор btStaticPlaneShape принимает два аргумента:
let planeShape = new Ammo.btStaticPlaneShape(new Ammo.btVector3(nx, ny, nz), constant);
btVector3(nx, ny, nz) — нормаль плоскости. Определяет
направление, “в какую сторону” ориентирована плоскость. Вектор должен
быть нормализован.constant — смещение плоскости вдоль её нормали
относительно начала координат. Плоскость будет находиться на расстоянии
constant от точки (0,0,0) в направлении
нормали.Пример создания горизонтальной плоскости на уровне y = 0:
let groundShape = new Ammo.btStaticPlaneShape(new Ammo.btVector3(0, 1, 0), 0);
Здесь нормаль (0,1,0) указывает вверх по оси Y, а
смещение равно нулю, что соответствует стандартному уровню пола.
Для добавления плоскости в физический мир необходимо создать rigid body с нулевой массой, так как масса определяет подвижность тела:
let groundMass = 0;
let groundTransform = new Ammo.btTransform();
groundTransform.setIdentity();
groundTransform.setOrigin(new Ammo.btVector3(0, 0, 0));
let motionState = new Ammo.btDefaultMotionState(groundTransform);
let localInertia = new Ammo.btVector3(0, 0, 0);
let rbInfo = new Ammo.btRigidBodyConstructionInfo(groundMass, motionState, groundShape, localInertia);
let groundBody = new Ammo.btRigidBody(rbInfo);
physicsWorld.addRigidBody(groundBody);
Объяснение ключевых моментов:
Бесконечная плоскость отлично подходит для взаимодействия с динамическими объектами, такими как сферы, коробки или капсулы. Поскольку плоскость статична, все динамические объекты будут корректно сталкиваться с ней, не проходя сквозь поверхность.
Пример падения сферы на плоскость:
let sphereShape = new Ammo.btSphereShape(1);
let sphereMass = 1;
let sphereTransform = new Ammo.btTransform();
sphereTransform.setIdentity();
sphereTransform.setOrigin(new Ammo.btVector3(0, 10, 0));
let sphereMotionState = new Ammo.btDefaultMotionState(sphereTransform);
let sphereInertia = new Ammo.btVector3(0, 0, 0);
sphereShape.calculateLocalInertia(sphereMass, sphereInertia);
let sphereRbInfo = new Ammo.btRigidBodyConstructionInfo(sphereMass, sphereMotionState, sphereShape, sphereInertia);
let sphereBody = new Ammo.btRigidBody(sphereRbInfo);
physicsWorld.addRigidBody(sphereBody);
В этом примере сфера падает под действием силы тяжести и корректно сталкивается с плоскостью, демонстрируя реалистичное поведение.
getPlaneConstant() — возвращает текущее смещение
плоскости.getPlaneNormal() — возвращает нормаль плоскости в виде
btVector3.setLocalScaling(vector) — позволяет масштабировать
плоскость для визуализации, но физическая бесконечность
сохраняется.Пример получения нормали и смещения:
let normal = groundShape.getPlaneNormal();
let constant = groundShape.getPlaneConstant();
console.log(normal.x(), normal.y(), normal.z(), constant);
Эта форма является базовым инструментом для создания устойчивых и производительных сцен с гравитацией и коллизиями в Ammo.js. Она сочетает простоту использования с высокой эффективностью и идеально подходит для большинства стандартных игровых и физически симулированных миров.