В физическом движке Oimo.js верёвки и цепи моделируются не как
отдельные примитивы, а как последовательности твёрдых тел, соединённых
ограничениями (constraints). Каждый сегмент является полноценным
RigidBody, а их совместная работа обеспечивается системой
связей, ограничивающих относительное движение.
Ключевая идея:
Физически корректное поведение достигается за счёт итеративного решателя ограничений, встроенного в Oimo.js.
Для построения связанных систем используются следующие ограничения:
Поддерживает фиксированную дистанцию между двумя телами. Применяется для:
Принцип работы — удержание заданного расстояния между якорными точками тел.
Позволяет телам вращаться вокруг одной оси. Используется для:
Шарнир сохраняет общую точку соединения, но допускает вращение.
Позволяет свободное вращение во всех направлениях вокруг точки крепления. Применяется для:
Верёвка состоит из:
Каждый сегмент — динамическое тело:
const body = world.add({
type: 'box',
size: [0.2, 0.2, 0.5],
pos: [0, 5 - i * 0.5, 0],
move: true,
density: 1
});
Ключевые параметры:
move: true — тело динамическое.density влияет на массу.Используется RevoluteJoint или
BallAndSocketJoint:
world.add({
type: 'jointBall',
body1: segments[i],
body2: segments[i+1],
pos1: [0, -0.25, 0],
pos2: [0, 0.25, 0]
});
Таким образом создаётся последовательная цепочка.
Цепь отличается от верёвки большей жёсткостью и ограничением углов вращения.
Для RevoluteJoint можно задать пределы:
limit: [ -Math.PI / 4, Math.PI / 4 ]
Это предотвращает:
Для реалистичной цепи:
Первый сегмент соединяется со статическим телом:
const anchor = world.add({
type: 'box',
size: [0.1, 0.1, 0.1],
pos: [0, 5, 0],
move: false
});
Далее создаётся шарнир между anchor и первым
сегментом.
Верёвка может быть соединена с движущимся объектом — например, грузом:
world.add({
type: 'jointBall',
body1: lastSegment,
body2: heavyBox,
pos1: [0, -0.25, 0],
pos2: [0, 0.5, 0]
});
Так формируется подвес.
Связанные системы особенно чувствительны к параметрам симуляции.
В настройках мира:
world = new OIMO.World({
iterations: 12
});
Увеличение числа итераций:
Чем больше сегментов:
Оптимальный баланс достигается экспериментально.
Для предотвращения вибраций:
linearDamping: 0.1,
angularDamping: 0.1
Слишком малое демпфирование приводит к дрожанию цепи.
DistanceJoint позволяет задать пружинные параметры:
spring: [frequency, damping]
Параметры:
frequency — жёсткость;damping — затухание.Так создаётся эффект эластичного троса.
По умолчанию сегменты могут сталкиваться друг с другом. Это приводит к:
Отключение внутренних коллизий выполняется через фильтры групп:
collisionMask: 2,
collisionGroup: 1
Сегменты одной группы можно исключить из взаимных столкновений.
Верёвки часто применяются для:
Конструкция моста:
Каждая доска соединяется с цепями через шарниры, образуя гибкую платформу.
Связанные тела — одна из самых тяжёлых задач для движка.
Факторы нагрузки:
Оптимизация достигается:
Oimo.js отвечает только за физику. Отрисовка выполняется через сторонний рендерер, например Three.js.
Каждому сегменту физического тела соответствует визуальный меш. В цикле обновления:
mesh.position.copy(body.getPosition());
mesh.quaternion.copy(body.getQuaternion());
Физическая модель и графическая сцена должны синхронизироваться на каждом шаге симуляции.
Иногда вместо множества тел используется:
DistanceJoint между двумя точками;Преимущества:
Недостаток — отсутствие реальной физики провисания и столкновений.
Связанные тела в Oimo.js позволяют строить сложные динамические конструкции — от простого подвеса до механических систем с десятками звеньев. Правильная настройка ограничений, масс и параметров симуляции определяет реалистичность поведения верёвок и цепей в трёхмерной среде.