Two.js — это библиотека для рисования 2D-графики с использованием WebGL, Canvas и SVG. Одним из ключевых аспектов управления объектами в Two.js является применение матричных преобразований для перемещения, масштабирования и вращения фигур. Two.js использует собственную систему матриц, основанную на аффинных преобразованиях 3x3, где каждая трансформация задаётся через матрицу:
[ ]
Здесь (a, b, c, d) отвечают за масштабирование, вращение
и наклон, а (e, f) — за смещение (translation).
Каждый объект Two.js (например, Two.Path,
Two.Rectangle, Two.Circle) имеет свойства
translation, rotation,
scale, skew. Под капотом эти свойства
формируют матрицу преобразования, которая применяется
при рендеринге.
Пример явного создания и применения матрицы:
const two = new Two({ width: 500, height: 500 }).appendTo(document.body);
const rect = two.makeRectangle(100, 100, 80, 50);
rect.fill = '#3498db';
rect.noStroke();
// Создание матрицы для вращения на 45 градусов и смещения
const angle = Math.PI / 4;
const matrix = new Two.Matrix()
.identity()
.translate(200, 150)
.rotate(angle);
rect.matrix = matrix;
two.update();
Здесь матрица сначала создаётся пустой (identity()),
затем применяются смещение (translate) и поворот
(rotate). Присвоение rect.matrix заменяет
внутреннюю матрицу объекта.
В матричных преобразованиях порядок имеет решающее значение. Например:
translate → rotaterotate → translateРезультат будет разным, так как матрицы умножаются слева направо. Two.js использует постмультипликацию: новая матрица умножается на текущую.
const matrix = new Two.Matrix()
.rotate(Math.PI / 4)
.translate(100, 50);
В этом случае объект сначала вращается, а затем перемещается, что отличается от обратного порядка.
Масштабирование (scale) и
наклон (skew) также реализуются через
матрицы. Two.js предоставляет методы:
matrix.scale(sx, sy) — масштаб по осям X и Ymatrix.skew(sx, sy) — наклон по углам в радианахrect.matrix.scale(1.5, 0.5);
rect.matrix.skew(0.2, 0);
two.update();
Масштабирование изменяет размер фигуры относительно её локального центра, а наклон искажает её пропорции. Совмещение этих операций с вращением позволяет создавать сложные визуальные эффекты.
Для сложных сцен часто нужно объединять матрицы. Two.js позволяет
умножать матрицы через метод multiply():
const translateMatrix = new Two.Matrix().translate(100, 50);
const rotateMatrix = new Two.Matrix().rotate(Math.PI / 6);
const combinedMatrix = translateMatrix.multiply(rotateMatrix);
rect.matrix = combinedMatrix;
two.update();
Важно: метод multiply не изменяет
исходную матрицу, а возвращает новую. Для последовательных
преобразований используется цепочка методов translate(),
rotate(), scale() на одной матрице.
Two.js поддерживает группы через
Two.Group. Все дочерние элементы наследуют матрицу
родителя. Например:
const group = two.makeGroup();
group.translation.set(200, 200);
group.rotation = Math.PI / 8;
const circle = two.makeCircle(0, 0, 50);
const triangle = two.makePolygon(0, 0, 40, 3);
group.add(circle, triangle);
two.update();
В этом примере и круг, и треугольник смещаются и вращаются вместе с группой, без изменения их локальных координат.
Каждый объект имеет свойство matrix типа
Two.Matrix. Можно прочитать значения
a, b, c, d, e, f и использовать их для:
const m = rect.matrix;
console.log(m.a, m.b, m.c, m.d, m.e, m.f);
Матричные операции дают точный контроль над анимацией. Можно создавать непрерывное вращение, масштабирование или комбинированные эффекты:
two.bind('update', function(frameCount, timeDelta) {
rect.matrix.rotate(0.01);
rect.matrix.scale(1 + 0.005 * Math.sin(frameCount * 0.1));
}).play();
Использование матрицы напрямую позволяет обойти ограничения
стандартных свойств rotation, translation и
scale и создавать более гибкие анимации.
Two.js предоставляет методы apply и inverse
для матриц, позволяя трансформировать отдельные точки:
const point = new Two.Vector(10, 20);
const transformed = rect.matrix.multiply(point); // применить матрицу
const original = rect.matrix.inverse().multiply(transformed); // вернуть в локальные координаты
Эта техника полезна при обработке столкновений, кликов мыши и интерактивных сцен.
Матричные операции в Two.js обеспечивают полный контроль над позиционированием и трансформацией объектов, позволяя строить динамичные и сложные 2D-сцены.