В Oimo.js суставы представляют собой объекты, которые соединяют два тела, обеспечивая ограниченное движение между ними. Суставы могут быть различного типа: шарнирные (ball joint), осевые (hinge joint), пружинные (spring joint) и др. Они управляют как линейной, так и угловой кинематикой соединённых тел, позволяя моделировать механические системы, роботов и сложные физические сцены.
Каждый сустав создаётся через конструктор OIMO.Joint,
которому передаются параметры: тела, точки крепления, тип ограничения и
дополнительные настройки (например, ограничения угла или силы). После
добавления в мир (world.addJoint(joint)), сустав начинает
влиять на симуляцию.
Пример создания шарнирного сустава между двумя телами:
let joint = new OIMO.Joint({
type: "ball",
body1: bodyA,
body2: bodyB,
pos1: bodyA.getPosition(),
pos2: bodyB.getPosition(),
collision: false
});
world.addJoint(joint);
Удаление сустава необходимо, когда соединение между телами больше не
требуется, либо для динамического изменения структуры механизма. В
Oimo.js управление суставами построено через методы самого мира
(OIMO.World) и объекты суставов
(OIMO.Joint).
Ключевой метод —
world.removeJoint(joint), который удаляет
указанный сустав из мира и прекращает его влияние на соединённые тела.
Важно учитывать, что после удаления сустав перестаёт участвовать в
расчётах симуляции, но ссылки на объект остаются в памяти, если они
сохранены в переменных. Для корректного управления памятью стоит
обнулять такие ссылки:
world.removeJoint(joint);
joint = null;
Это предотвращает утечки памяти при создании и удалении большого числа суставов в динамических сценах.
Синхронизация с телами: при удалении сустава
тела остаются в мире, но теряют ограничения движения, ранее наложенные
суставом. Если нужно удалить и тела, необходимо отдельно вызывать
world.removeRigidBody(body).
Массив joints в мире: Oimo.js хранит все суставы
мира в массиве world.joints. Метод removeJoint
автоматически исключает сустав из этого массива. Для ручной проверки
состояния можно использовать:
console.log(world.joints.includes(joint)); // false после удаления
let jointsCopy = world.joints.slice();
jointsCopy.forEach(j => world.removeJoint(j));
joint.sleep()) или удалён. Проверка
активности предотвращает ошибки при попытке удалить уже несуществующий
сустав:if (world.joints.includes(joint)) {
world.removeJoint(joint);
}
В сложных сценах с большим количеством суставов удаление объектов должно сопровождаться управлением ссылками и очищением ресурсов. Для каждой переменной, содержащей сустав, следует обнулять ссылку после удаления, что позволяет сборщику мусора освободить память:
world.removeJoint(joint);
joint.body1 = null;
joint.body2 = null;
joint = null;
Для динамических сцен, где создаются и удаляются сотни суставов, рекомендуется использовать пул объектов для повторного использования суставов, снижая нагрузку на сборщик мусора и ускоряя работу симуляции.
Удаление сустава в Oimo.js — простая операция через
world.removeJoint(joint), но требует внимания к состоянию
тел, ссылкам на объекты и массивам суставов. Правильное удаление
суставов обеспечивает корректное поведение симуляции, предотвращает
утечки памяти и позволяет гибко управлять физической сценой.
Эта практика является основой для построения динамически изменяемых механических систем и сложных интерактивных симуляций в браузере с использованием Oimo.js.