GenericJoint в библиотеке Oimo.js предоставляет гибкий
способ соединения двух тел с произвольной конфигурацией ограничений на
их движение. Ключевым аспектом является управление степенями
свободы (DoF, Degrees of Freedom) в каждой оси, как линейной,
так и угловой. Эти ограничения позволяют создавать как полностью
зафиксированные соединения, так и частично подвижные механизмы.
Каждая степень свободы может быть:
В GenericJoint эти степени свободы задаются через
свойства:
linearLowerLimit и linearUpperLimit —
минимальные и максимальные смещения вдоль осей X, Y, Z.angularLowerLimit и angularUpperLimit —
минимальные и максимальные угловые отклонения вокруг осей X, Y, Z.Пример конфигурации:
const joint = new OIMO.GenericJoint(bodyA, bodyB, {
position: [0, 1, 0],
rotation: [0, 0, 0],
linearLowerLimit: [0, 0, 0], // X, Y, Z
linearUpperLimit: [0, 0, 0], // блокировка перемещений
angularLowerLimit: [-Math.PI/4, 0, 0], // минимальный угол вокруг X
angularUpperLimit: [Math.PI/4, 0, 0] // максимальный угол вокруг X
});
В этом примере все линейные движения заблокированы, а вращение разрешено только вокруг оси X в диапазоне ±45°.
Внутри GenericJoint используется матрица допуска
(constraint matrix), которая определяет, какие движения
разрешены, а какие ограничены. Она состоит из 6 компонент для каждой из
осей:
Каждая компонента может быть представлена числом:
0 — зафиксировано1 — свободноМатрица позволяет библиотеке эффективно вычислять силы, необходимые для соблюдения ограничений при симуляции.
Линейные ограничения:
joint.linearLowerLimit = [0, 0, 0];
joint.linearUpperLimit = [0, 0, 0];
joint.linearLowerLimit = [-Infinity, 0, 0];
joint.linearUpperLimit = [Infinity, 0, 0];
Угловые ограничения:
joint.angularLowerLimit = [0, 0, 0];
joint.angularUpperLimit = [0, 0, 0];
joint.angularLowerLimit = [-Math.PI/6, -Math.PI/6, -Math.PI/6];
joint.angularUpperLimit = [Math.PI/6, Math.PI/6, Math.PI/6];
Полностью зафиксированный шарнир (rigid connection): Все линейные и угловые ограничения совпадают по верхней и нижней границе, создавая жёсткое соединение.
Шарнир с одной осью вращения (hinge-like): Линейные степени свободы зафиксированы, только одна угловая ось свободна:
joint.angularLowerLimit = [0, -Infinity, 0];
joint.angularUpperLimit = [0, Infinity, 0];
joint.linearLowerLimit = [-Infinity, 0, 0];
joint.linearUpperLimit = [Infinity, 0, 0];
joint.angularLowerLimit = [0, 0, 0];
joint.angularUpperLimit = [0, 0, 0];
Oimo.js позволяет динамически изменять ограничения после создания соединения, изменяя матрицу допуска. Это позволяет реализовать механизмы с переменной жесткостью или режимами работы:
// Разблокировать вращение вокруг Z
joint.angularLowerLimit[2] = -Math.PI/2;
joint.angularUpperLimit[2] = Math.PI/2;
// Заблокировать движение по Y
joint.linearLowerLimit[1] = 0;
joint.linearUpperLimit[1] = 0;
При каждом обновлении матрицы библиотека пересчитывает силы, применяемые к телам, чтобы соблюсти новые ограничения без нарушения физической стабильности сцены.
GenericJoint в Oimo.js — инструмент тонкой настройки
кинематики, который через точное управление степенями свободы позволяет
создавать как полностью жесткие соединения, так и сложные механизмы с
ограниченными движениями.