Библиотека Oimo.js является лёгким и эффективным инструментом для физического моделирования твёрдых тел в браузере с использованием JavaScript. Важнейшими параметрами динамики тел в ней являются линейная скорость и угловая скорость, которые определяют движение объектов в пространстве и их вращение.
Линейная скорость описывает перемещение центра масс тела в
пространстве. В Oimo.js она представлена в виде вектора
Vec3, где каждая компонента указывает
скорость по соответствующей оси:
let linearVelocity = body.linearVelocity;
console.log(linearVelocity.x, linearVelocity.y, linearVelocity.z);
linearVelocity.x — скорость вдоль оси
X.linearVelocity.y — скорость вдоль оси
Y.linearVelocity.z — скорость вдоль оси
Z.Установка линейной скорости позволяет мгновенно изменить движение тела:
body.linearVelocity.set(5, 0, 0); // движение вправо со скоростью 5
Линейная скорость вычисляется на основе силы, приложенной к телу, и его массы. Формула из классической механики:
[ = + ]
где:
Важно учитывать, что при столкновениях и контактах с другими телами
Oimo.js автоматически обновляет
linearVelocity с учётом импульсов и
трения.
Угловая скорость описывает вращение тела вокруг его центра масс. В
Oimo.js она также представлена объектом
Vec3, где каждая компонента определяет
скорость вращения вокруг соответствующей оси:
let angularVelocity = body.angularVelocity;
console.log(angularVelocity.x, angularVelocity.y, angularVelocity.z);
angularVelocity.x — вращение вокруг
оси X.angularVelocity.y — вращение вокруг
оси Y.angularVelocity.z — вращение вокруг
оси Z.Угловая скорость может быть установлена напрямую:
body.angularVelocity.set(0, 1, 0); // вращение вокруг оси Y
Физически угловая скорость вычисляется на основе момента силы и момента инерции тела:
[ = I^{-1} t + ]
где:
Тензор инерции учитывает форму и распределение массы тела, что делает вращение реалистичным.
Линейная и угловая скорости тесно связаны через контакт с другими объектами и столкновения. Например, при катании цилиндра по поверхности центр масс получает линейное движение, а тело вращается с угловой скоростью, зависящей от радиуса и трения:
[ v = r ]
где:
В Oimo.js можно реализовать это напрямую через joint или constraint, чтобы синхронизировать вращение и перемещение тел.
console.log(body.linearVelocity.length()); // скорость движения
console.log(body.angularVelocity.length()); // скорость вращения
body.linearVelocity.add(new OIMO.Vec3(0, 5, 0)); // импульс вверх
body.angularVelocity.scale(0.5); // замедление вращения
deltaTime ≤ 1/60.Для отладки динамики удобно визуализировать скорости:
let arrowHelper = new THREE.ArrowHelper(
linearVelocity.clone().normalize(),
body.getPosition(),
linearVelocity.length(),
0xff0000
);
scene.add(arrowHelper);
Это позволяет видеть направление и величину линейной скорости. Аналогично можно построить стрелки для угловой скорости, применяя их к локальной системе координат тела.
Линейная и угловая скорости в Oimo.js формируют основу динамической симуляции. Правильное использование этих параметров обеспечивает реалистичное движение, контролируемые столкновения и точное моделирование вращения объектов.