Для работы с Two.js первым шагом является создание экземпляра движка и привязка его к HTML-контейнеру. Основной объект Two создается с помощью конструктора, который принимает объект конфигурации:
const elem = document.getElementById('draw-area');
const two = new Two({
width: 800,
height: 600,
type: Two.Types.svg // или Two.Types.canvas, Two.Types.webgl
}).appendTo(elem);
Ключевые параметры:
width и height – размеры области
рендеринга.type – тип рендеринга: svg,
canvas или webgl.appendTo привязывает canvas/SVG к конкретному
элементу DOM.После этого объект Two.js готов к созданию графических объектов и анимации.
Основная идея Two.js заключается в том, что логика создания графики и рендеринг могут быть разделены. Для этого рекомендуется использовать следующие слои:
Пример структуры:
const model = {
circles: [
{ x: 100, y: 100, radius: 50, color: '#FF0000' },
{ x: 300, y: 150, radius: 75, color: '#00FF00' }
]
};
const view = model.circles.map(data => {
return two.makeCircle(data.x, data.y, data.radius).fill = data.color;
});
two.update();
Здесь данные полностью отделены от визуального представления, что позволяет легко обновлять сцену без пересоздания всей графики.
Two.js поддерживает группы (Two.Group), которые позволяют объединять объекты и управлять ими как единым целым. Это особенно полезно для сложных сцен.
const group = two.makeGroup();
const circle1 = two.makeCircle(50, 50, 30);
const circle2 = two.makeCircle(150, 50, 30);
group.add(circle1, circle2);
group.translation.set(200, 100); // смещение всей группы
Преимущества групп:
Two.js использует метод bind для создания анимаций через
рендеринг кадр за кадром. Разделение логики анимации и рендеринга
помогает поддерживать чистый код.
two.bind('update', function(frameCount, timeDelta) {
model.circles.forEach((data, i) => {
data.x += 0.5;
view[i].translation.x = data.x;
});
}).play();
Особенности подхода:
update на каждом
кадре, что гарантирует плавное движение.Разделение функций рендеринга позволяет держать код чистым и
модульным. Например, можно создать функцию renderCircle,
которая отвечает только за визуализацию данных:
function renderCircle(data) {
const circle = two.makeCircle(data.x, data.y, data.radius);
circle.fill = data.color;
return circle;
}
const view = model.circles.map(renderCircle);
Такой подход упрощает:
Two.js позволяет привязывать обработчики событий к объектам, сохраняя разделение между логикой данных и визуальной частью:
view.forEach((circle, i) => {
circle._renderer.elem.addEventListener('click', () => {
model.circles[i].color = '#0000FF';
circle.fill = model.circles[i].color;
two.update();
});
});
Здесь события изменяют только модель, а визуальное представление синхронизируется отдельно. Это повышает гибкость и масштабируемость проектов.
Для больших проектов рекомендуется:
two.bind('update', ...) и
обновлять только необходимые объекты.Пример организации:
/model
circles.js
/view
circlesView.js
/controller
animationController.js
Такой подход обеспечивает масштабируемость и поддерживаемость, особенно при работе с интерактивной анимацией и сложными сценами.