Для работы с SVG в Two.js необходимо создать экземпляр библиотеки и
привязать его к контейнеру HTML. Two.js поддерживает рендеринг на
svg, canvas и webgl, поэтому
первым шагом является выбор подходящего рендерера и создание сцены:
const elem = document.getElementById('draw-area');
const two = new Two({
width: 800,
height: 600,
type: Two.Types.svg
}).appendTo(elem);
Здесь type: Two.Types.svg указывает на использование
SVG-рендерера, который напрямую поддерживает работу с путями SVG и их
импортом.
Two.js позволяет создавать графику из существующих SVG-строк или
файлов. Основной метод для этого — Two.Utils.parseSVG,
который разбирает SVG и превращает его в объекты Two.js:
const svgString = `<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<path d="M10 10 H 90 V 90 H 10 Z" fill="none" stroke="black"/>
</svg>`;
const svgElement = new DOMParser().parseFromString(svgString, "image/svg+xml").documentElement;
const shapes = Two.Utils.parseSVG(svgElement);
parseSVG возвращает массив объектов Two.js
(Two.Path, Two.Group), которые можно добавлять
на сцену. Важно помнить, что parseSVG поддерживает только
те элементы SVG, которые напрямую соответствуют возможностям Two.js:
<path>, <polygon>,
<polyline>, <circle>,
<ellipse>, <rect>.
После импорта пути становятся объектами Two.js и могут управляться
программно. Основной класс для представления сложных контуров —
Two.Path. Он содержит массив vertices, каждый
из которых описывает точку с координатами x, y
и, при необходимости, кривизной (bezier handles).
const path = shapes[0]; // Первый элемент, например, путь
path.fill = 'rgba(255,0,0,0.5)';
path.stroke = 'black';
path.linewidth = 2;
two.add(path);
two.update();
Ключевые моменты:
Two.js автоматически интерпретирует команды SVG (M,
L, C, Q) и превращает их в массив
вершин с корректными кривизнами.
Пути SVG в Two.js можно масштабировать, вращать и перемещать через свойства объекта:
path.translation.set(50, 50); // смещение
path.rotation = Math.PI / 4; // поворот на 45°
path.scale = 1.5; // увеличение
Все преобразования применяются к локальным координатам объекта, а Two.js автоматически обновляет их в SVG-рендерере.
Two.js поддерживает анимацию через методы Two.Tween или
стандартные функции requestAnimationFrame. Для анимации
вершин можно изменять их координаты:
two.bind('upd ate', function(frameCount) {
path.vertices.forEach((v, i) => {
v.x += Math.sin(frameCount * 0.05 + i) * 0.5;
v.y += Math.cos(frameCount * 0.05 + i) * 0.5;
});
}).play();
При этом рендеринг автоматически обновляет отображение, создавая плавную анимацию движения контура.
Two.js сохраняет все визуальные свойства пути:
fill — цвет заливки.stroke — цвет контура.linewidth — толщина линии.opacity — прозрачность.cap и join — стиль окончания и соединения
линий.Эти свойства могут быть изменены динамически для создания интерактивной графики.
Для сложных SVG с несколькими элементами удобно использовать
Two.Group. Он позволяет объединять несколько путей в одну
логическую структуру и применять трансформации к всей группе:
const group = new Two.Group();
shapes.forEach(shape => group.add(shape));
group.translation.se t(100, 100);
two.add(group);
two.update();
Группы упрощают управление многоконтурными SVG и позволяют создавать иерархические анимации.
Для загрузки внешних SVG файлов обычно используют
fetch:
fetch('icon.svg')
.then(response => response.text())
.then(svgText => {
const svgElement = new DOMParser().parseFromString(svgText, "image/svg+xml").documentElement;
const shapes = Two.Utils.parseSVG(svgElement);
shapes.forEach(shape => two.add(shape));
two.update();
});
Такой подход позволяет динамически подгружать графику и работать с ней как с объектами Two.js, применяя любые трансформации и анимации.
Для более сложных анимаций можно использовать Two.Path с
включённой кривизной:
path.curved = true;
path.vertices.forEach(v => {
v.x += Math.sin(v.y * 0.1) * 2;
});
two.update();
Это позволяет плавно интерполировать точки пути и создавать эффекты “живых” линий и morphing-анимации.