Матрица трансформации

В Phaser матрица трансформации является ключевым элементом для управления положением, масштабом, вращением и наклоном объектов сцены. Phaser использует 2D-матрицы аффинных преобразований, которые позволяют комбинировать несколько операций в одну, обеспечивая высокую производительность и точность вычислений.

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


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

Матрица трансформации в Phaser представлена в виде 3x3, но фактически для 2D-преобразований достаточно 2x3:

[a, c, tx]
[b, d, ty]
[0, 0, 1]

Где:

  • a и d — коэффициенты масштабирования по осям X и Y.
  • b и c — коэффициенты наклона (skew).
  • tx и ty — смещение (translation) по осям X и Y.

Для спрайта с позицией (x, y), масштабом (scaleX, scaleY) и поворотом rotation матрица формируется следующим образом:

a = scaleX * cos(rotation)
b = scaleX * sin(rotation)
c = -scaleY * sin(rotation)
d = scaleY * cos(rotation)
tx = x
ty = y

Эта формула объединяет одновременно трансляцию, масштабирование и вращение в одну матрицу.


Применение матрицы к объекту

Phaser предоставляет класс Phaser.GameObjects.Components.TransformMatrix, который инкапсулирует операции с матрицей:

const matrix = new Phaser.GameObjects.Components.TransformMatrix();
matrix.applyITRS(x, y, rotation, scaleX, scaleY, skewX, skewY);

Метод applyITRS автоматически рассчитывает элементы матрицы на основе позиции, вращения, масштабирования и наклона. Это позволяет избежать ручного вычисления всех коэффициентов и гарантирует корректное применение преобразований.

После вычисления матрицы её можно применить к спрайту или графическому объекту:

sprite.setTransformMatrix(matrix);

Комбинирование матриц

Одной из ключевых возможностей является умножение матриц, что позволяет объединять несколько преобразований. Если есть две матрицы M1 и M2, их объединение M = M1 * M2 обеспечивает последовательное применение обеих трансформаций.

В Phaser умножение выполняется с помощью метода multiply:

const matrixA = new Phaser.GameObjects.Components.TransformMatrix();
const matrixB = new Phaser.GameObjects.Components.TransformMatrix();
matrixA.multiply(matrixB);

Важно учитывать порядок умножения: M1 * M2 ≠ M2 * M1. При работе с иерархией объектов (контейнеры и дочерние спрайты) матрицы родителя умножаются на матрицы дочерних объектов для корректного позиционирования.


Инверсия и обратные преобразования

Иногда требуется вычислить обратную матрицу для преобразования координат из глобальной системы в локальную:

const inverse = matrix.clone().invert();

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


Применение к камере и слоям

Камеры Phaser используют матрицы для отображения сцены. Каждая камера имеет собственную матрицу проекции и матрицу трансформации, которая учитывает её позицию, масштаб и вращение.

Применение матрицы камеры к спрайтам обеспечивает правильное отображение объектов относительно видимой области сцены:

camera.setMatrix(matrix);

Для слоёв (Layer) в Tilemap матрица трансформации позволяет масштабировать или вращать весь слой одновременно, без изменения отдельных тайлов, что особенно полезно для эффектов параллакса.


Оптимизация и производительность

Использование матриц трансформации позволяет уменьшить количество вычислений при сложных графических эффектах. Вместо последовательного применения вращения, масштабирования и смещения к каждому пикселю, Phaser комбинирует все операции в одну матрицу и применяет её за один проход.

Это критически важно для игр с большим количеством объектов на сцене и динамическими анимациями.


Практические советы

  • Для простых объектов часто достаточно стандартного набора свойств (x, y, scale, rotation).
  • Для сложных эффектов, анимаций, наложения наклона и иерархий — лучше использовать TransformMatrix.
  • Всегда учитывать порядок операций: сначала масштаб, затем наклон, потом вращение и трансляция.
  • При работе с контейнерами помнить, что матрица родителя умножается на матрицу дочернего объекта.

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