ConeTwistConstraint — это тип ограничения (constraint) в
библиотеке Cannon.js, позволяющий моделировать
соединение двух тел с возможностью вращения вокруг нескольких осей с
ограничениями по углам. Его часто используют для имитации шарниров,
суставов, позвоночника или подвесных систем, где одно тело может
наклоняться и крутиться относительно другого, но с ограничениями.
В отличие от HingeConstraint, которое ограничивает
вращение по одной оси, ConeTwistConstraint обеспечивает
более сложное движение: конусное ограничение наклона и
торсионное ограничение вращения.
Создание ограничения требует указания двух тел, точек крепления и параметров вращения. Основной синтаксис:
const constraint = new CANNON.ConeTwistConstraint(bodyA, bodyB, {
pivotA: new CANNON.Vec3(x1, y1, z1),
pivotB: new CANNON.Vec3(x2, y2, z2),
axisA: new CANNON.Vec3(ax1, ay1, az1),
axisB: new CANNON.Vec3(ax2, ay2, az2),
angle: maxConeAngle,
twistAngle: maxTwistAngle,
collideConnected: false
});
world.addConstraint(constraint);
Пояснения параметров:
bodyA, bodyB — тела, между которыми
создаётся соединение.pivotA, pivotB — точки крепления на каждом
теле, задаются в локальных координатах.axisA, axisB — локальные оси, относительно
которых происходит вращение.angle — максимальный угол наклона (в радианах)
конусного ограничения.twistAngle — максимальный угол вращения вокруг
собственной оси (торсионное ограничение).collideConnected — если true, тела будут
сталкиваться друг с другом.Ключевой аспект ConeTwistConstraint — конусное
ограничение. Оно задаёт угол, в пределах которого одно тело
может отклоняться от оси другого.
constraint.angle = Math.PI / 4; // 45 градусов
Особенности:
Торсионное ограничение ограничивает вращение вокруг оси соединения:
constraint.twistAngle = Math.PI / 6; // 30 градусов
Параметры axisA и axisB определяют
ориентацию ограничения в локальных системах координат тел.
Пример:
const axis = new CANNON.Vec3(0, 1, 0); // ось Y
constraint.axisA.copy(axis);
constraint.axisB.copy(axis);
ConeTwistConstraint предоставляет методы для
динамической настройки:
enableMotor() — включает мотор вращения.setMotorTarget(targetQuaternion) — задаёт желаемое
вращение.disableMotor() — отключает мотор.Пример использования мотора для контроля положения тела:
constraint.enableMotor();
constraint.setMotorTarget(new CANNON.Quaternion().setFromAxisAngle(new CANNON.Vec3(0,1,0), Math.PI/2));
Мотор может быть полезен для анимации персонажей или робототехнических моделей.
После создания ограничения его необходимо добавить в мир физики:
world.addConstraint(constraint);
maxForce:constraint.maxForce = 1e5;
1. Шарнир плеча:
const shoulder = new CANNON.ConeTwistConstraint(torso, arm, {
pivotA: new CANNON.Vec3(0,1,0),
pivotB: new CANNON.Vec3(0,-0.5,0),
axisA: new CANNON.Vec3(0,1,0),
axisB: new CANNON.Vec3(0,1,0),
angle: Math.PI/4,
twistAngle: Math.PI/8
});
world.addConstraint(shoulder);
2. Имитация подвесной системы:
const pendulum = new CANNON.ConeTwistConstraint(anchor, bob, {
pivotA: new CANNON.Vec3(0,0,0),
pivotB: new CANNON.Vec3(0,1,0),
axisA: new CANNON.Vec3(0,1,0),
axisB: new CANNON.Vec3(0,1,0),
angle: Math.PI/6
});
world.addConstraint(pendulum);
ConeTwistConstraint только для ключевых
соединений, так как расчёт конусных ограничений более затратен, чем
HingeConstraint.ConeTwistConstraint в Cannon.js
позволяет создавать реалистичные суставные соединения с гибкой
настройкой конусного и торсионного ограничения. Правильная установка
pivot, axis и углов обеспечивает стабильную и предсказуемую симуляцию
сложных механических или биомеханических систем.