Класс 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 используется система координат, где:
Умножение матриц — это важная операция для комбинирования различных
преобразований. Например, при комбинировании двух преобразований:
сначала вращение, затем смещение, необходимо перемножить соответствующие
матрицы. В 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 предоставляет множество методов для создания стандартных матриц преобразований. Рассмотрим несколько из них:
var translationMat = new pc.Mat4().setTranslate(2, 3, 4);
Этот метод создаёт матрицу, которая сдвигает объект на заданные координаты (2, 3, 4).
var rotationMat = new pc.Mat4().setRotateX(Math.PI / 4);
Этот метод создаёт матрицу, которая выполняет вращение объекта вокруг оси X на 45 градусов. Аналогично можно создавать вращения вокруг осей Y и Z.
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-пространстве и создавать
динамичные сцены с точными преобразованиями.