Класс pc.Mat4: матрица трансформации, умножение, инверсия

Класс pc.Mat4 представляет собой четырёхмерную матрицу 4x4 в библиотеке PlayCanvas, которая используется для работы с преобразованиями в 3D-пространстве. Такие матрицы играют ключевую роль в вычислениях, связанных с позиционированием, вращением, масштабированием и перспективой объектов в 3D-графике. В PlayCanvas pc.Mat4 является основной единицей, с помощью которой реализуются преобразования объектов сцены.

Структура матрицы

Матрица 4x4 имеет следующий вид:

| m00  m01  m02  m03 |
| m10  m11  m12  m13 |
| m20  m21  m22  m23 |
| m30  m31  m32  m33 |

Значения матрицы могут быть использованы для хранения различных типов преобразований: смещения, вращения, масштабирования и перспективы. Важно отметить, что в PlayCanvas используется система координат, где:

  • Ось X ориентирована вправо.
  • Ось Y — вверх.
  • Ось Z — вглубь экрана (от наблюдателя).

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

Умножение матриц

Умножение матриц — это важная операция для комбинирования различных преобразований. Например, при комбинировании двух преобразований: сначала вращение, затем смещение, необходимо перемножить соответствующие матрицы. В PlayCanvas умножение матриц выполняется через метод mul().

Рассмотрим пример:

var mat1 = new pc.Mat4();
var mat2 = new pc.Mat4();

// Устанавливаем значения матриц
mat1.set(
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    2, 3, 4, 1
);

mat2.set(
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    5, 6, 7, 1
);

// Умножаем матрицы
var result = mat1.mul(mat2);

В результате операции умножения получится новая матрица, которая будет представлять собой комбинированное преобразование.

Матрицы можно умножать как справа, так и слева, в зависимости от того, какое преобразование нужно применить первым. Умножение матриц важно в контексте цепочек преобразований, где каждое последующее преобразование зависит от предыдущего.

Инверсия матрицы

Инверсия матрицы позволяет отменить её преобразование. Например, если матрица выполняет смещение, то её инверсия вернёт объект в исходную позицию. Для этого в PlayCanvas используется метод invert().

Пример инверсии:

var mat = new pc.Mat4();
mat.set(
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    2, 3, 4, 1
);

var inverseMat = mat.clone().invert();

Метод invert() возвращает новую матрицу, которая является инверсией исходной. Инвертирование матрицы важно, например, для вычисления обратных трансформаций или в задачах, где необходимо восстановить объект в исходном положении после нескольких применённых преобразований.

Преобразования с использованием матрицы

Для удобства работы с матрицами PlayCanvas предоставляет множество методов для создания стандартных матриц преобразований. Рассмотрим несколько из них:

  • Преобразование перемещения (translation)
var translationMat = new pc.Mat4().setTranslate(2, 3, 4);

Этот метод создаёт матрицу, которая сдвигает объект на заданные координаты (2, 3, 4).

  • Преобразование вращения (rotation)
var rotationMat = new pc.Mat4().setRotateX(Math.PI / 4);

Этот метод создаёт матрицу, которая выполняет вращение объекта вокруг оси X на 45 градусов. Аналогично можно создавать вращения вокруг осей Y и Z.

  • Преобразование масштаба (scaling)
var scalingMat = new pc.Mat4().setScale(2, 2, 2);

Создаётся матрица масштаба, которая увеличивает объект в два раза по всем осям.

Преобразование вектора с использованием матрицы

Для применения матрицы к вектору используется метод transformVector(). Этот метод позволяет выполнить трансформацию (например, перемещение или вращение) для трёхмерного вектора с помощью матрицы.

Пример использования:

var mat = new pc.Mat4();
mat.setTranslate(1, 2, 3);

var vec = new pc.Vec3(4, 5, 6);
mat.transformVector(vec);

console.log(vec); // Выведет преобразованный вектор

Здесь вектор (4, 5, 6) будет преобразован с использованием матрицы трансляции, что означает, что его новые координаты будут равны (5, 7, 9).

Преобразования для камеры

Матрицы часто используются для создания видов камеры в 3D-сценах. В PlayCanvas для этого используются матрицы вида и проекции. Матрица вида описывает расположение камеры относительно мира, а матрица проекции — как 3D-объекты отображаются на 2D-экран.

Пример создания матрицы вида:

var viewMat = new pc.Mat4().lookAt(cameraPosition, targetPosition, upVector);

Здесь метод lookAt() создаёт матрицу вида, где камера расположена в точке cameraPosition, смотрит на точку targetPosition, а вектор upVector указывает, что будет являться верхом для камеры.

Для создания матрицы проекции используется метод perspective(), который принимает параметры, определяющие угол поля зрения, соотношение сторон и ближнюю и дальнюю плоскости отсечения:

var projectionMat = new pc.Mat4().perspective(45, aspectRatio, 0.1, 1000);

Заключение

Класс pc.Mat4 является важнейшим инструментом для работы с 3D-преобразованиями в PlayCanvas. Его возможности охватывают широкий спектр операций, таких как умножение, инверсия и создание стандартных матриц для трансляции, вращения и масштаба. Освоение этих операций позволяет эффективно управлять объектами в 3D-пространстве и создавать динамичные сцены с точными преобразованиями.