В библиотеке Oimo.js классы Vec3 и
Mat3 являются фундаментальными строительными блоками для
работы с физикой, обеспечивая эффективное представление и обработку
векторов и матриц. Они используются для вычисления сил, моментов
инерции, направлений, вращений и трансформаций объектов в трёхмерном
пространстве.
Vec3 представляет трёхмерный вектор с координатами
x, y и z. Векторы
используются для описания положения, скорости, ускорения, силы и
направления.
let v1 = new OIMO.Vec3(1, 2, 3);
let v2 = new OIMO.Vec3();
v2.set(4, 5, 6);
set позволяет изменить значения
существующего вектора без создания нового объекта, что снижает нагрузку
на сборщик мусора.let v3 = new OIMO.Vec3();
v3.add(v1, v2); // v3 = v1 + v2
v3.sub(v1, v2); // v3 = v1 - v2
Методы принимают два вектора: первый — источник, второй — значение для операции. Результат записывается в вызывающий объект.
v3.mulScalar(v1, 2); // v3 = v1 * 2
let len = v1.length(); // длина вектора
v1.normalize(); // превращает вектор в единичный
Нормализация особенно важна для направления силы или оси вращения без изменения величины.
let dot = v1.dot(v2); // скалярное произведение
v3.cross(v1, v2); // векторное произведение
Скалярное произведение определяет угол между векторами, векторное — перпендикулярный вектор, часто используемый для моментов и ориентаций.
let v4 = new OIMO.Vec3();
v4.copy(v1); // копирование значений
let equal = v1.equals(v2); // проверка на равенство
Mat3 представляет 3x3 матрицу,
используемую для описания вращений и инерционных тензоров. Она особенно
полезна для вычислений с телами, у которых есть момент инерции или
которые вращаются.
let m1 = new OIMO.Mat3();
let m2 = new OIMO.Mat3();
m2.setRotationFromEuler(Math.PI / 4, 0, Math.PI / 2);
setRotationFromEuler позволяет задать матрицу
через углы Эйлера.let result = new OIMO.Mat3();
result.mul(m1, m2); // result = m1 * m2
let vOut = new OIMO.Vec3();
m1.mulVec3(vOut, v1); // vOut = m1 * v1
Это позволяет применять вращения к вектору, например для ориентации силы или направления движения.
let mT = new OIMO.Mat3();
mT.transpose(m1); // mT = m1^T
let mInv = new OIMO.Mat3();
mInv.invert(m1); // mInv = m1^-1
Транспонирование используется для преобразований координат, инверсия — для обратных вращений и вычислений моментов.
m1.identity(); // превращает матрицу в единичную
m2.copy(m1); // копирует значения
Одной из ключевых особенностей Oimo.js является тесная интеграция
векторов и матриц. Матрица вращения (Mat3) может быть
применена к вектору (Vec3) для трансформации:
let force = new OIMO.Vec3(1, 0, 0);
let rotation = new OIMO.Mat3();
rotation.setRotationFromEuler(0, Math.PI/2, 0);
let rotatedForce = new OIMO.Vec3();
rotation.mulVec3(rotatedForce, force); // force повернут на 90 градусов вокруг Y
Такое применение необходимо для расчёта направления силы в локальных координатах тела или для трансформации момента инерции.
Vec3 и Mat3 используют результат в
вызывающем объекте. Это снижает нагрузку на сборщик мусора в сценах с
множеством объектов.Классы Vec3 и Mat3 формируют ядро всех
физических вычислений в Oimo.js. Их правильное и эффективное
использование позволяет моделировать сложные взаимодействия тел,
управлять ориентацией, трансформацией и динамикой объектов в трёхмерном
пространстве.