Для работы с анимацией трансформаций в Two.js необходимо создать сцену, настроить рендерер и определить область рисования. Обычно используется следующий шаблон:
const elem = document.getElementById('draw-shapes');
const two = new Two({ width: 800, height: 600 }).appendTo(elem);
width и height определяют размеры
канвы.appendTo добавляет элемент
<canvas> или <svg> в DOM. Two.js
поддерживает оба формата.После создания сцены можно добавлять объекты, такие
как Two.Rectangle, Two.Circle или
Two.Polygon.
Каждый объект в Two.js имеет позицию, масштаб, угол поворота и цветовые свойства:
const rect = two.makeRectangle(400, 300, 200, 100);
rect.fill = '#3498db';
rect.stroke = '#2980b9';
rect.linewidth = 4;
makeRectangle(x, y, width, height) создаёт
прямоугольник с центром в (x, y).fill, stroke и
linewidth отвечают за заливку и контур.rect.rotation задаёт угол поворота в радианах.rect.scale может быть числом (одинаково по осям) или
объектом { x, y }.Two.bind('upd ate', ...)Two.js предоставляет встроенный механизм анимации через событие
update. Оно вызывается на каждом кадре рендера.
two.bind('update', function(frameCount, timeDelta) {
rect.rotation += 0.01; // постоянное вращение
rect.scale = 1 + 0.5 * Math.sin(frameCount * 0.05); // пульсация
}).play();
frameCount — номер текущего кадра.timeDelta — время в секундах с предыдущего кадра.play() запускает анимацию.Для перемещения объектов используется свойство
translation:
rect.translation.x += 2; // движение вправо
rect.translation.y = 300 + 50 * Math.sin(frameCount * 0.1); // вертикальная синусоида
translation — объект { x, y }.Масштаб объекта управляется через scale:
rect.scale = 1 + 0.3 * Math.sin(frameCount * 0.1); // пульсация масштаба
rect.scale = { x: 1.2, y: 0.8 }.Вращение задаётся свойством rotation:
rect.rotation += 0.02; // плавное вращение
translation.Для вращения вокруг другой точки можно использовать комбинацию
translation и pivot:
rect.pivot.se t(50, 50); // смещает центр вращения на 50 пикселей
Комбинация смещения, масштабирования и вращения создаёт сложные анимации:
two.bind('update', function(frameCount) {
rect.translation.x = 400 + 100 * Math.cos(frameCount * 0.02);
rect.translation.y = 300 + 50 * Math.sin(frameCount * 0.05);
rect.scale = 1 + 0.3 * Math.sin(frameCount * 0.03);
rect.rotation += 0.01;
}).play();
Свойства fill и stroke можно изменять
динамически:
rect.fill = `rgb(${Math.floor(128 + 127 * Math.sin(frameCount * 0.05))}, 100, 200)`;
rect.opacity = 0.5 + 0.5 * Math.sin(frameCount * 0.03);
opacity варьируется от 0 до 1.Two.js позволяет создавать кастомные формы через
Two.Path:
const path = two.makePath(100, 100, 200, 50, 300, 100, true);
path.fill = 'none';
path.stroke = '#e74c3c';
path.linewidth = 3;
two.bind('update', function(frameCount) {
path.vertices.forEach((v, i) => {
v.y += 5 * Math.sin(frameCount * 0.05 + i);
});
}).play();
vertices — массив точек фигуры.Two.js поддерживает группы объектов через
Two.Group:
const group = two.makeGroup(rect, path);
group.translation.x = 100;
group.rotation = 0.1;
Two.js не использует отдельный таймер — анимация синхронизирована с
requestAnimationFrame. Для контроля
скорости и плавности удобно
использовать множители частоты синусоид или timeDelta:
two.bind('update', function(frameCount, timeDelta) {
rect.rotation += 0.5 * timeDelta; // независимо от FPS
});
timeDelta учитывает реальное время между кадрами.timeDelta для независимой от FPS
скорости.Эти техники позволяют строить сложные, визуально привлекательные анимации в Two.js, комбинируя движение, масштаб, вращение и визуальные эффекты.