В физическом движке Ammo.js контроль над поведением тел
достигается через комбинацию массы,
сил, моментов инерции и
факторов движения. linearFactor и
angularFactor являются ключевыми свойствами для точного
ограничения или разрешения движения объектов в конкретных
направлениях.
linearFactorlinearFactor определяет, по каким осям объект может
перемещаться. Это вектор с тремя компонентами (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, независимо от приложенных сил.
angularFactorangularFactor управляет вращением тела вокруг каждой
оси. По аналогии с linearFactor, это вектор
(x, y, z).
0 блокирует вращение вокруг
соответствующей оси.1 разрешает вращение.Пример:
// Блокировка вращения вокруг X и Z
body.setAngularFactor(new Ammo.btVector3(0, 1, 0));
Эффект: тело может вращаться только вокруг оси Y, что полезно для симуляции вертикального вращения, например, дверей или вращающихся платформ.
linearFactor или
angularFactor ограничивают движение по определённой оси,
силы и моменты, действующие в этом направлении, будут
проигнорированы.linearFactor и angularFactor позволяет
создавать сложные кинематические системы — например, объекты, свободно
вращающиеся вокруг одной оси и перемещающиеся только по двум
другим.Ограничение движения персонажа по поверхности:
linearFactor = (1, 0, 1) — движение только по плоскости
XZ.angularFactor = (0, 1, 0) — вращение только вокруг
вертикальной оси.Фиксация объектов на платформе:
linearFactor = (0, 0, 0) — тело не перемещается.angularFactor = (0, 0, 0) — тело не вращается. Такой
объект полностью кинематический, но продолжает участвовать в
столкновениях.Имитация колес или роликов:
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), создавая сложные механизмы вроде шарниров, поршней или машин с подвижными элементами. Факторы движения выступают как первичный, легковесный способ контроля свободы объекта, не создавая дополнительных связей.