RevoluteJoint — это тип шарнирного соединения,
который позволяет двум телам вращаться относительно общей оси, как
дверная петля или ось колеса. В Oimo.js данный тип соединения реализован
через объект OIMO.RevoluteJoint, который управляет
ограничениями движения и моментами сил между двумя
RigidBody.
Для создания шарнирного соединения необходимы два тела
(RigidBody) и параметры, определяющие положение и
ориентацию оси вращения:
const joint = new OIMO.RevoluteJoint({
body1: box1, // Первое тело
body2: box2, // Второе тело
position: new OIMO.Vec3(0, 1, 0), // Положение точки соединения
axis: new OIMO.Vec3(0, 1, 0), // Направление оси вращения
lowerLimit: -Math.PI/4, // Минимальный угол вращения
upperLimit: Math.PI/4, // Максимальный угол вращения
enableLimit: true // Включение ограничений углов
});
world.addJoint(joint);
Ключевые параметры:
body1, body2 — тела, которые
соединяются.position — точка в глобальных координатах, где
соединение фиксируется.axis — направление вращения. Должно быть
нормализованным.lowerLimit и upperLimit — ограничения угла
вращения.enableLimit — включение или отключение ограничений
вращения.motor и motorSpeed — опции для создания
приводного вращения.Ограничения вращения позволяют зафиксировать диапазон углов, в пределах которых тело может вращаться:
joint.enableLimit = true;
joint.lowerLimit = -Math.PI / 6; // -30 градусов
joint.upperLimit = Math.PI / 6; // 30 градусов
Двигатель (Motor) позволяет задавать скорость вращения и силу, с которой тело будет двигаться:
joint.enableMotor = true;
joint.motorSpeed = Math.PI; // Радианы в секунду
joint.maxMotorTorque = 10; // Максимальный крутящий момент
Использование двигателя полезно для имитации моторов в механизмах, например, вращающихся колес, роботов или подвижных конструкций.
После добавления RevoluteJoint в мир
(world), Oimo.js автоматически учитывает его при расчете
сил и коллизий:
function animate() {
world.step(); // Обновление физики
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
animate();
Каждое тело, связанное через шарнир, может вращаться в пределах заданных ограничений, а при активированном моторе — также управляться скоростью.
При проектировании механизма важно правильно настроить ось вращения, иначе вращение будет некорректным или соединение начнет вести себя нестабильно. Ось должна проходить через точку соединения и соответствовать ожидаемой геометрии.
axis.normalize()).RevoluteJoint с другими типами, например,
DistanceJoint для контроля положения.maxMotorTorque разумно, чтобы не возникало
чрезмерных ускорений.RevoluteJoint может комбинироваться с:
Такая комбинация позволяет строить сложные механизмы с подвижными суставами, где каждое соединение выполняет определенную функцию в конструкции.
const wheel = createWheel();
const axle = createAxle();
const wheelJoint = new OIMO.RevoluteJoint({
body1: axle,
body2: wheel,
position: wheel.position.clone(),
axis: new OIMO.Vec3(0, 0, 1),
enableMotor: true,
motorSpeed: 5,
maxMotorTorque: 20
});
world.addJoint(wheelJoint);
Здесь колесу задается вращение вокруг оси, проходящей через центр, и включен мотор для имитации привода. Такой подход часто используется в симуляции транспортных средств.