Классы Vec3 и Mat3: операции с векторами и матрицами

В библиотеке Oimo.js классы Vec3 и Mat3 являются фундаментальными строительными блоками для работы с физикой, обеспечивая эффективное представление и обработку векторов и матриц. Они используются для вычисления сил, моментов инерции, направлений, вращений и трансформаций объектов в трёхмерном пространстве.


Класс Vec3

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

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);     // копирует значения

Взаимодействие Vec3 и Mat3

Одной из ключевых особенностей 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. Их правильное и эффективное использование позволяет моделировать сложные взаимодействия тел, управлять ориентацией, трансформацией и динамикой объектов в трёхмерном пространстве.