HingeConstraint: ось вращения и пределы угла

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

const hinge = new CANNON.HingeConstraint(bodyA, bodyB, {
    pivotA: new CANNON.Vec3(0, 1, 0),
    axisA: new CANNON.Vec3(0, 0, 1),
    pivotB: new CANNON.Vec3(0, -1, 0),
    axisB: new CANNON.Vec3(0, 0, 1),
    collideConnected: false
});
world.addConstraint(hinge);
  • bodyA и bodyB — тела, которые соединяются ограничением.
  • pivotA/pivotB — точки приложения ограничения в локальных координатах тел.
  • axisA/axisB — локальные оси вращения. Они определяют направление, вокруг которого будут вращаться тела.
  • collideConnected — определяет, могут ли соединённые тела сталкиваться друг с другом.

Настройка оси вращения

Ось вращения задается с помощью параметров axisA и axisB. Они должны быть нормализованными векторами, иначе поведение ограничения будет некорректным. Cannon.js автоматически синхронизирует оси между телами, что позволяет корректно рассчитывать моменты силы и угловые скорости.

hinge.axisA.set(0, 0, 1);
hinge.axisB.set(0, 0, 1);

Для изменения оси вращения после создания можно использовать метод setAxis:

hinge.setAxis(new CANNON.Vec3(1, 0, 0));

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

Ограничение углового диапазона

HingeConstraint поддерживает установку предела угла вращения через метод setLimits. Это позволяет создавать соединения с ограниченной амплитудой, например, двери, которые открываются только на 90 градусов.

// Устанавливаем пределы вращения: от -90 до 90 градусов
hinge.setLimits(-Math.PI / 2, Math.PI / 2, 0.9, 0.3);
  • min — минимальный угол вращения относительно исходного положения.
  • max — максимальный угол вращения.
  • bias — коэффициент коррекции для уменьшения проскальзывания при приближении к пределам.
  • relaxation — коэффициент сглаживания ограничения, влияет на жесткость ограничителя.

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

Использование мотора для вращения

HingeConstraint поддерживает встроенный мотор, который позволяет управлять вращением через угловую скорость и максимальный крутящий момент:

// Включаем мотор
hinge.enableMotor();
hinge.setMotorSpeed(Math.PI); // радианы в секунду
hinge.setMotorMaxForce(1000); // максимальный крутящий момент

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

Применение HingeConstraint в практике

  1. Двери и ворота: установка одного тела неподвижно (стена), второго с массой и габаритами двери. Настройка оси вращения по петлям. Ограничение угла предотвращает переворачивание.
  2. Колёса: вращение вокруг оси колеса, установка моторной скорости для движения транспортного средства.
  3. Механические рычаги: соединение двух рычагов с ограничением углового диапазона для имитации шарниров и суставов.

Советы по оптимизации

  • Для стабильной симуляции лучше избегать слишком маленькой массы одного тела относительно другого — разница более чем в 100 раз может вызвать нестабильность.
  • Тело с мотором лучше иметь умеренную массу и распределение инерции, иначе мотор может «прыгать» при больших нагрузках.
  • Всегда проверять нормализацию осей (axisA и axisB) перед запуском симуляции.

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

HingeConstraint можно комбинировать с другими ограничениями, такими как PointToPointConstraint или DistanceConstraint, для создания сложных механических систем. Например, соединение рычага с двумя шарнирами и фиксированным направляющим ограничением позволяет моделировать робота с суставами.


Использование HingeConstraint обеспечивает контролируемую степень свободы и реалистичное физическое поведение вращающихся соединений, делая Cannon.js мощным инструментом для создания интерактивных 3D-моделей и симуляций механики.