btSphereShape

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

Создание и инициализация

Для создания сферы необходимо передать радиус в конструктор:

let radius = 2.0;
let sphereShape = new Ammo.btSphereShape(radius);

Ключевые моменты:

  • Радиус задаётся в единицах сцены (обычно в метрах, если используется система SI).
  • Сфера автоматически центрируется в начале локальной системы координат тела.

Свойства и методы

btSphereShape наследует основные методы от базового класса btCollisionShape. Наиболее часто используемые методы включают:

  • getRadius() — возвращает текущий радиус сферы.
  • setMargin(margin) — задаёт так называемое “соприкосновение” (collision margin), важное для точности симуляции столкновений.
  • calculateLocalInertia(mass, inertia) — вычисляет момент инерции для сферы с заданной массой.
  • getBoundingSphere(center, radius) — возвращает параметры ограждающей сферы, что полезно для оптимизации.

Пример вычисления момента инерции:

let mass = 5;
let localInertia = new Ammo.btVector3(0, 0, 0);
sphereShape.calculateLocalInertia(mass, localInertia);

Этот вектор localInertia потом используется при создании btRigidBody.

Использование с btRigidBody

Сфера обычно применяется в качестве формы для динамических тел (btRigidBody). Пример создания тел с физикой:

let startTransform = new Ammo.btTransform();
startTransform.setIdentity();
startTransform.setOrigin(new Ammo.btVector3(0, 10, 0));

let mass = 1;
let localInertia = new Ammo.btVector3(0, 0, 0);
sphereShape.calculateLocalInertia(mass, localInertia);

let motionState = new Ammo.btDefaultMotionState(startTransform);
let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, sphereShape, localInertia);
let rigidBody = new Ammo.btRigidBody(rbInfo);

physicsWorld.addRigidBody(rigidBody);

Особенности:

  • Сферические тела отлично подходят для симуляции мячей, планет, пуль или любых объектов с равномерной массой.
  • Форма позволяет максимально простое и быстрое вычисление столкновений по сравнению с составными или сложными мешами.
  • В связке с btSphereShape удобно использовать стандартные силы, такие как гравитация и импульсы.

Оптимизация

  • Для высокопроизводительных симуляций необходимо учитывать collision margin. Значение по умолчанию обычно 0.04, уменьшение увеличивает точность, но снижает стабильность.
  • Не стоит использовать сферу с огромным количеством мелких деталей — для сложных объектов лучше комбинировать несколько примитивов (btCompoundShape), в том числе сфер, для упрощения расчета столкновений.

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

  • Игровая физика: мячи, шары, снаряды, персонажи с округлой формой.
  • Симуляции: молекулы, планеты, частицы.
  • Оптимизация столкновений: как базовая форма для составных тел в btCompoundShape.

Примечания

  • Изменение радиуса после создания формы возможно через setUnscaledRadius(), однако это редко используется в реальном времени из-за необходимости перерасчета инерции и коллизий.
  • Для корректной работы динамики важно учитывать массу, центр тяжести и локальные инерционные свойства.

btSphereShape в Ammo.js является фундаментальным строительным блоком для симуляции сферических тел, обеспечивая сочетание простоты, точности и высокой производительности.