PointToPointConstraint: шарнир

PointToPointConstraint — это тип ограничения в библиотеке Cannon.js, позволяющий соединять два тела в одной точке, создавая эффект шарнира. Он особенно полезен для имитации подвесок, соединений между объектами и простых механических систем, где важна свобода вращения вокруг точки соединения, но при этом запрещены смещения.


Создание PointToPointConstraint

Конструктор PointToPointConstraint имеет следующий синтаксис:

new CANNON.PointToPointConstraint(bodyA, pivotA, bodyB, pivotB, maxForce);

Параметры:

  • bodyA — первое тело (CANNON.Body), к которому прикрепляется шарнир.
  • pivotA — точка в локальных координатах bodyA, где будет крепление (CANNON.Vec3).
  • bodyB — второе тело, которое соединяется с bodyA.
  • pivotB — точка в локальных координатах bodyB, соответствующая точке соединения.
  • maxForce (опционально, по умолчанию 1e6) — максимальная сила, с которой ограничение удерживает тела.

Пример создания шарнира между двумя кубами:

const pivotA = new CANNON.Vec3(0, 1, 0);
const pivotB = new CANNON.Vec3(0, -1, 0);
const constraint = new CANNON.PointToPointConstraint(cubeA, pivotA, cubeB, pivotB);
world.addConstraint(constraint);

В этом примере кубы соединяются так, что верхняя точка cubeB совпадает с нижней точкой cubeA.


Свойства и методы

PointToPointConstraint наследует общие свойства CANNON.Constraint и имеет уникальные методы:

  • update() — вычисляет силы и корректирует положения тел в соответствии с ограничением. Обычно вызывается автоматически при шаге симуляции.
  • enable() / disable() — включение или отключение ограничения без его удаления из мира.
  • pivotA / pivotB — точки крепления в локальных координатах тел. Можно динамически менять, чтобы моделировать подвижные соединения.

Принципы работы

Шарнир удерживает тела так, что выбранные точки на обоих телах совпадают в пространстве. При этом:

  • Свобода вращения сохраняется. Тела могут вращаться относительно точки соединения во всех направлениях.
  • Перемещения ограничены. Любое смещение точек в пространстве компенсируется силами ограничения.
  • Силы ограничения распределяются между телами, воздействуя на их линейную и угловую скорость.

Физически это моделируется через вычисление импульсов, направленных на устранение расхождения точек pivotA и pivotB на каждом шаге симуляции.


Применение

Подвески и маятники

Соединение грузика и стержня в маятнике реализуется через PointToPointConstraint. Выбираются точки на грузике и конце стержня, после чего создается свободный шарнир, который позволяет телам вращаться.

const rod = new CANNON.Body({ mass: 2, shape: new CANNON.Box(new CANNON.Vec3(0.1, 1, 0.1)) });
const weight = new CANNON.Body({ mass: 1, shape: new CANNON.Sphere(0.2) });

const pivotRod = new CANNON.Vec3(0, -1, 0);
const pivotWeight = new CANNON.Vec3(0, 0, 0);

const hinge = new CANNON.PointToPointConstraint(rod, pivotRod, weight, pivotWeight);
world.addConstraint(hinge);

Соединение частей механизма

Для моделирования простых робототехнических конструкций можно соединять несколько тел через шарниры, чтобы обеспечить подвижность сочленений без сложной кинематики.

Симуляция гибких объектов

Если создать цепочку из множества тел, соединённых PointToPointConstraint, получится эффект гибкой верёвки или цепи.


Настройка силы ограничения

Параметр maxForce влияет на стабильность симуляции. Слишком маленькая сила приведёт к «провисанию» соединения, слишком большая — к рывкам. Обычно подбирается экспериментально в зависимости от массы тел и масштаба сцены:

const hinge = new CANNON.PointToPointConstraint(bodyA, pivotA, bodyB, pivotB, 1e5);

Особенности и ограничения

  • PointToPointConstraint не ограничивает вращение, поэтому для фиксированного угла требуется HingeConstraint или LockConstraint.
  • Ограничения могут создавать численные нестабильности при высоких массах или малых шагах интеграции. В этом случае стоит уменьшить шаг симуляции или увеличить maxForce.
  • Поворотные силы распределяются автоматически, но визуальная привязка в графике может требовать отдельной корректировки позиции объектов, если используется сторонний рендеринг.

Взаимодействие с другими типами ограничений

PointToPointConstraint можно комбинировать с:

  • DistanceConstraint — для поддержания расстояния между другими точками тела.
  • HingeConstraint — если требуется ограничение вращения вокруг одной оси.
  • LockConstraint — для полного закрепления тел друг к другу при необходимости.

Эта комбинация позволяет строить сложные механизмы с многоступенчатой кинематикой.


Рекомендации по использованию

  • Всегда указывать pivotA и pivotB в локальных координатах тел, чтобы избежать неожиданных смещений.
  • Для визуализации соединений удобно использовать линии или небольшие объекты в точках крепления.
  • Проверять стабильность при высокой скорости объектов или больших массах; в таких случаях уменьшение времени шага симуляции (world.step(dt)) повышает точность.

PointToPointConstraint обеспечивает простое и гибкое средство для моделирования шарнирных соединений, позволяя создавать реалистичное движение механизмов и гибких структур в среде Cannon.js.