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);
Ось вращения задается с помощью параметров 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);
Пределы угла позволяют симулировать физически реалистичные движения, предотвращая чрезмерное вращение и перекручивание соединений.
HingeConstraint поддерживает встроенный мотор, который позволяет управлять вращением через угловую скорость и максимальный крутящий момент:
// Включаем мотор
hinge.enableMotor();
hinge.setMotorSpeed(Math.PI); // радианы в секунду
hinge.setMotorMaxForce(1000); // максимальный крутящий момент
Мотор полезен для создания приводов, роботов или дверей с автоматическим открыванием. Cannon.js рассчитывает силу мотора на каждом шаге симуляции с учётом массы и инерции тел.
axisA и
axisB) перед запуском симуляции.HingeConstraint можно комбинировать с другими ограничениями, такими
как PointToPointConstraint или
DistanceConstraint, для создания сложных механических
систем. Например, соединение рычага с двумя шарнирами и фиксированным
направляющим ограничением позволяет моделировать робота с суставами.
Использование HingeConstraint обеспечивает контролируемую степень свободы и реалистичное физическое поведение вращающихся соединений, делая Cannon.js мощным инструментом для создания интерактивных 3D-моделей и симуляций механики.