Факторы линейного и углового движения: LinearFactor, AngularFactor

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


linearFactor

linearFactor определяет, по каким осям объект может перемещаться. Это вектор с тремя компонентами (x, y, z), каждая из которых обычно имеет значение 0 или 1.

  • Компонента 0 блокирует движение по соответствующей оси.
  • Компонента 1 разрешает свободное движение.
  • Можно использовать промежуточные значения, например 0.5, для ограничения скорости перемещения в данной оси.

Пример установки linearFactor:

// Создание rigid body
let shape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));
let mass = 1;
let transform = new Ammo.btTransform();
transform.setIdentity();
transform.setOrigin(new Ammo.btVector3(0, 10, 0));
let motionState = new Ammo.btDefaultMotionState(transform);
let localInertia = new Ammo.btVector3(0, 0, 0);
shape.calculateLocalInertia(mass, localInertia);

let rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, shape, localInertia);
let body = new Ammo.btRigidBody(rbInfo);

// Разрешить движение только по оси Y
body.setLinearFactor(new Ammo.btVector3(0, 1, 0));

Эффект: тело может подниматься и опускаться по оси Y, но не смещается по X и Z, независимо от приложенных сил.


angularFactor

angularFactor управляет вращением тела вокруг каждой оси. По аналогии с linearFactor, это вектор (x, y, z).

  • Компонента 0 блокирует вращение вокруг соответствующей оси.
  • Компонента 1 разрешает вращение.
  • Применение дробных значений позволяет замедлить вращение по выбранной оси.

Пример:

// Блокировка вращения вокруг X и Z
body.setAngularFactor(new Ammo.btVector3(0, 1, 0));

Эффект: тело может вращаться только вокруг оси Y, что полезно для симуляции вертикального вращения, например, дверей или вращающихся платформ.


Взаимодействие факторов с физическим движком

  • Применение силы: Если linearFactor или angularFactor ограничивают движение по определённой оси, силы и моменты, действующие в этом направлении, будут проигнорированы.
  • Коллизии: Ограничение движения через факторы не нарушает обработку столкновений. Тело продолжает реагировать на столкновения, но будет двигаться только по разрешённым осям.
  • Гибридные ограничения: Комбинирование linearFactor и angularFactor позволяет создавать сложные кинематические системы — например, объекты, свободно вращающиеся вокруг одной оси и перемещающиеся только по двум другим.

Практические сценарии применения

  1. Ограничение движения персонажа по поверхности:

    • linearFactor = (1, 0, 1) — движение только по плоскости XZ.
    • angularFactor = (0, 1, 0) — вращение только вокруг вертикальной оси.
  2. Фиксация объектов на платформе:

    • linearFactor = (0, 0, 0) — тело не перемещается.
    • angularFactor = (0, 0, 0) — тело не вращается. Такой объект полностью кинематический, но продолжает участвовать в столкновениях.
  3. Имитация колес или роликов:

    • linearFactor = (0, 0, 1) — движение только вдоль оси Z.
    • angularFactor = (0, 1, 0) — вращение вокруг вертикальной оси для поворота колеса.

Важные нюансы

  • linearFactor и angularFactor влияют только на физический шаг, а не на программное изменение позиции или ориентации. Изменение координат вручную через setWorldTransform обходит эти ограничения.
  • Эти факторы не уменьшают силу гравитации или импульса — они просто блокируют движение по выбранной оси.
  • Использование дробных значений (0.5, 0.8) позволяет создавать эффекты частичного сопротивления, например, вязкое или направленное движение.

Резюме по синтаксису

Метод Аргумент Описание
setLinearFactor Ammo.btVector3(x, y, z) Определяет доступное линейное движение по осям
setAngularFactor Ammo.btVector3(x, y, z) Определяет доступное вращение по осям

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


Можно углубить управление через комбинирование факторов с ограничениями (constraints), создавая сложные механизмы вроде шарниров, поршней или машин с подвижными элементами. Факторы движения выступают как первичный, легковесный способ контроля свободы объекта, не создавая дополнительных связей.