btMatrix3x3: работа с матрицами вращения

btMatrix3x3 — это класс библиотеки Ammo.js, предназначенный для представления 3×3 матриц вращения в трёхмерной физике. В 3D-пространстве он используется для описания ориентации объектов, преобразований координат и вычисления углов Эйлера или кватернионов. Каждый объект btMatrix3x3 хранит девять чисел в формате строки из трёх векторов (столбцов или строк, в зависимости от использования).

Ключевыми свойствами матрицы являются:

  • Строки и столбцы — три вектора btVector3, определяющие оси локальной системы координат.
  • Орто-нормированность — каждая ось перпендикулярна другим, а длина вектора равна единице.
  • Методы преобразования — позволяют конвертировать матрицу в кватернион, углы Эйлера или применять к вектору.

Создание и инициализация

let m = new Ammo.btMatrix3x3();

По умолчанию создаётся единичная матрица. Возможна инициализация через три вектора:

let xAxis = new Ammo.btVector3(1, 0, 0);
let yAxis = new Ammo.btVector3(0, 1, 0);
let zAxis = new Ammo.btVector3(0, 0, 1);
let m = new Ammo.btMatrix3x3(xAxis, yAxis, zAxis);

Можно также задать элементы напрямую:

let m = new Ammo.btMatrix3x3();
m.setValue(1,0,0, 0,1,0, 0,0,1); // строки матрицы

Метод setValue принимает элементы построчно: (m00, m01, m02, m10, m11, m12, m20, m21, m22).

Основные методы класса

setEulerYPR(yaw, pitch, roll)

Устанавливает ориентацию матрицы через углы Эйлера:

  • Yaw — вращение вокруг оси Y
  • Pitch — вращение вокруг оси X
  • Roll — вращение вокруг оси Z
let m = new Ammo.btMatrix3x3();
m.setEulerYPR(Math.PI/2, 0, 0); // поворот на 90° вокруг оси Y

setRotation(q)

Устанавливает матрицу на основе кватерниона btQuaternion:

let q = new Ammo.btQuaternion(0, 1, 0, 0); // пример кватерниона
let m = new Ammo.btMatrix3x3();
m.setRotation(q);

getRotation(q)

Конвертирует текущую матрицу в кватернион:

let q = new Ammo.btQuaternion();
m.getRotation(q);

getRow(index, row)

Возвращает строку матрицы как btVector3:

let row = new Ammo.btVector3();
m.getRow(0, row); // первая строка

setIdentity()

Возвращает матрицу в единичное состояние:

m.setIdentity();

Умножение матриц и преобразование векторов

mult

Умножение матрицы на вектор:

let v = new Ammo.btVector3(1, 2, 3);
let result = new Ammo.btVector3();
m.mult(v, result); // result = m * v

Умножение матрицы на другую матрицу в btMatrix3x3 выполняется через конструктор:

let m2 = new Ammo.btMatrix3x3();
let combined = new Ammo.btMatrix3x3();
Ammo.btMatrix3x3.multiply(m, m2, combined);

transpose

Транспонирование матрицы:

let mT = new Ammo.btMatrix3x3(m);
mT.transpose();

Транспонированная матрица используется для обратных преобразований, например, при переходе из мировых координат в локальные.

Применение в физическом движке

btMatrix3x3 широко используется в:

  • btTransform — матрица вращения совместно с позицией объекта.
  • btRigidBody — определяет ориентацию тела в пространстве.
  • Расчётах столкновений — преобразует векторы в локальную систему коллайдера.

Пример комбинирования с btTransform:

let transform = new Ammo.btTransform();
transform.setOrigin(new Ammo.btVector3(0, 5, 0));
transform.setBasis(m); // применяем матрицу вращения

Взаимодействие с углами Эйлера и кватернионами

btMatrix3x3 выступает мостом между различными способами представления ориентации:

  • Кватернион → Матрица → Вектор
  • Углы Эйлера → Матрица → btTransform

Методы setEulerYPR, setRotation, getRotation позволяют конвертировать ориентацию между системами без потери точности.

Оптимизация и рекомендации

  • Для частых вычислений лучше переиспользовать существующие объекты btVector3 и btMatrix3x3, чтобы избежать лишних аллокаций памяти.
  • Орто-нормированность матрицы следует проверять при сложных последовательных преобразованиях, так как накопление ошибок может нарушить физическую корректность.
  • Для вращений больших тел в симуляции рекомендуется использовать кватернионы как промежуточное представление, а btMatrix3x3 использовать для вычислений с векторами и btTransform.

Практическое применение

В игровых и симуляционных проектах btMatrix3x3 позволяет:

  • Поворачивать тела без потери ориентации
  • Преобразовывать направления силы в локальные координаты
  • Создавать анимации физически корректного вращения
  • Совмещать матрицы вращения для сложных кинематических цепочек

Использование btMatrix3x3 обеспечивает гибкость при работе с вращениями и делает интеграцию с физическим движком более интуитивной и эффективной.