PointToPointConstraint — это тип ограничения в
библиотеке Cannon.js, позволяющий соединять два тела в одной точке,
создавая эффект шарнира. Он особенно полезен для имитации подвесок,
соединений между объектами и простых механических систем, где важна
свобода вращения вокруг точки соединения, но при этом запрещены
смещения.
Конструктор PointToPointConstraint имеет следующий
синтаксис:
new CANNON.PointToPointConstraint(bodyA, pivotA, bodyB, pivotB, maxForce);
Параметры:
CANNON.Body), к
которому прикрепляется шарнир.bodyA, где будет крепление (CANNON.Vec3).bodyA.bodyB, соответствующая точке соединения.Пример создания шарнира между двумя кубами:
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 и имеет уникальные методы:
Шарнир удерживает тела так, что выбранные точки на обоих телах совпадают в пространстве. При этом:
Физически это моделируется через вычисление
импульсов, направленных на устранение расхождения точек
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 можно комбинировать с:
Эта комбинация позволяет строить сложные механизмы с многоступенчатой кинематикой.
pivotA и pivotB в
локальных координатах тел, чтобы избежать неожиданных смещений.world.step(dt)) повышает точность.PointToPointConstraint обеспечивает простое и гибкое
средство для моделирования шарнирных соединений, позволяя создавать
реалистичное движение механизмов и гибких структур в среде
Cannon.js.