Библиотека Oimo.js предоставляет гибкие средства для физического моделирования, включая управление шарнирами и их движением через объекты типа RevoluteJoint и RevoluteLimitMotor. Основной задачей RevoluteLimitMotor является ограничение и управление угловым движением соединения, позволяя точно задавать пределы вращения, скорость и силу.
Объект RevoluteLimitMotor обычно создаётся в составе RevoluteJoint, который соединяет два тела. Для инициализации используются параметры:
Пример создания:
let motor = new OIMO.RevoluteLimitMotor({
lowerLimit: -Math.PI / 4,
upperLimit: Math.PI / 4,
motorSpeed: 2.0,
maxMotorTorque: 10
});
let joint = new OIMO.RevoluteJoint(bodyA, bodyB, {
localAxis1: new OIMO.Vec3(0, 1, 0),
localAxis2: new OIMO.Vec3(0, 1, 0),
motor: motor
});
В этом примере соединение позволяет вращение между -45° и 45°, а мотор стремится к скорости 2 рад/с, ограничиваясь моментом 10 Н·м.
lowerLimit и upperLimit задают диапазон угла, в котором сустав может свободно вращаться. Значения задаются в радианах, и важно, чтобы lowerLimit ≤ upperLimit. Если угловое положение тела выходит за пределы, Oimo.js автоматически корректирует силу, чтобы удерживать тело внутри диапазона.
motor.setLimits(-Math.PI / 6, Math.PI / 3); // от -30° до +60°
Использование функции setLimits() удобно для
динамического изменения ограничений во время симуляции.
Мотор может как удерживать объект на месте, так и вращать его с заданной скоростью. Ключевые свойства:
motor.motorSpeed = 1.5; // скорость 1.5 рад/с
motor.maxMotorTorque = 20; // увеличиваем силу мотора
Для отключения мотора используется:
motor.enableMotor = false;
Если enableMotor = true, объект будет стремиться поддерживать заданную скорость внутри установленных угловых пределов.
RevoluteLimitMotor активно используется для создания сложных механических систем:
Для реалистичного моделирования рекомендуется:
Все параметры RevoluteLimitMotor можно изменять в процессе симуляции. Это позволяет создавать адаптивные системы, где угол вращения, скорость или сила мотора корректируются по событиям или взаимодействию с другими объектами.
if (bodyB.position.y > 5) {
motor.setLimits(-Math.PI/2, Math.PI/2);
motor.motorSpeed = 0.5;
}
Такой подход применяется в интерактивных симуляциях, где движение суставов зависит от состояния среды или других объектов.
RevoluteLimitMotor в Oimo.js обеспечивает точное управление вращением и позволяет моделировать широкий спектр механических систем. Гибкая настройка пределов, скорости и силы мотора делает его ключевым инструментом при разработке динамических симуляций.