Пользовательские пути (custom paths) — ключевой инструмент для построения произвольной графики в библиотеке Two.js. В отличие от стандартных примитивов (прямоугольников, окружностей, линий), пути позволяют создавать сложные формы с точным контролем над каждой вершиной и кривой.
В основе лежит объект Two.Path, который представляет
собой последовательность точек (vertices), соединённых
линиями или кривыми Безье.
Объект пути создаётся с использованием массива вершин:
const path = new Two.Path([
new Two.Anchor(0, 0),
new Two.Anchor(100, 0),
new Two.Anchor(100, 100),
new Two.Anchor(0, 100)
], true);
Ключевые параметры:
массив vertices — точки пути
второй аргумент (true) — замкнутость пути
(closed)
дополнительные свойства:
fill — цвет заливкиstroke — цвет обводкиlinewidth — толщина линииКаждая точка пути — это объект Two.Anchor. Он может
представлять как обычную точку, так и управляющую точку для кривых.
const anchor = new Two.Anchor(x, y, lx, ly, rx, ry, command);
Параметры:
x, y — координаты точкиlx, ly — левая контрольная точка (для
кривой)rx, ry — правая контрольная точкаcommand — тип сегмента (move,
line, curve)Каждая вершина может иметь команду, определяющую способ соединения:
Two.Commands.move — перемещение без рисованияTwo.Commands.line — прямая линияTwo.Commands.curve — кривая БезьеTwo.Commands.close — замыкание путиПример:
const path = new Two.Path([
new Two.Anchor(0, 0, null, null, null, null, Two.Commands.move),
new Two.Anchor(100, 0, null, null, null, null, Two.Commands.line),
new Two.Anchor(100, 100, 80, 20, 120, 80, Two.Commands.curve)
], false);
Для создания плавных линий используются кубические кривые Безье. Управление осуществляется через контрольные точки.
const curved = new Two.Path([
new Two.Anchor(0, 0),
new Two.Anchor(100, 100, 50, 0, 150, 100)
], false);
curved.vertices[1].command = Two.Commands.curve;
Особенности:
Путь может быть:
closed = true) — последняя
точка соединяется с первойclosed = false)path.closed = true;
Замкнутые пути используются для заливки фигур, открытые — для линий и контуров.
Вершины можно изменять после создания:
path.vertices[0].x = 50;
path.vertices[0].y = 50;
path._flagVertices = true;
Флаг _flagVertices сообщает системе о необходимости
обновления геометрии.
path.vertices.push(new Two.Anchor(200, 200));
path.vertices.splice(1, 1);
path._flagVertices = true;
Это позволяет динамически изменять форму, например, при анимации.
Two.js может автоматически рассчитывать кривые между точками:
path.curved = true;
При этом:
Для отключения автоматического сглаживания:
path.curved = false;
После этого каждая вершина должна иметь явно заданный
command.
Любой путь поддерживает стандартные трансформации:
path.translation.set(200, 200);
path.rotation = Math.PI / 4;
path.scale = 1.5;
Каждый сегмент — это связь между двумя вершинами. Управление осуществляется через:
path.vertices[i].command = Two.Commands.line;
Изменение типа сегмента позволяет динамически менять форму.
Пример создания произвольной фигуры:
const shape = new Two.Path([
new Two.Anchor(0, 0, null, null, null, null, Two.Commands.move),
new Two.Anchor(50, -100, null, null, null, null, Two.Commands.line),
new Two.Anchor(100, 0, 75, -50, 125, -50, Two.Commands.curve),
new Two.Anchor(0, 0, null, null, null, null, Two.Commands.close)
], true);
shape.fill = 'orange';
shape.stroke = 'black';
shape.linewidth = 2;
Пути удобно использовать для анимаций:
two.bind('upd ate', function(frameCount) {
path.vertices.forEach((v, i) => {
v.y += Math.sin(frameCount * 0.05 + i) * 0.5;
});
path._flagVertices = true;
});
При работе с большим количеством путей важно учитывать:
_flagVerticescurved вместо ручных кривых (при
возможности)Пути можно применять как маски:
shape.mask = anotherPath;
Это позволяет создавать сложные визуальные эффекты.
path.opacity = 0.5;
path.dashes = [5, 3];
path.linecap = 'round';
path.linejoin = 'bevel';
Несколько путей можно объединять в группы:
const group = two.makeGroup(path1, path2);
group.translation.se t(100, 100);
Two.js использует флаги (_flag*) для отслеживания
изменений:
_flagVertices_flagFill_flagStrokeЭто позволяет минимизировать перерасчёт сцены.
Пути можно комбинировать с:
Для высокоточной графики важно:
Пути можно сохранять:
const data = JSON.stringify(path.vertices);
И восстанавливать:
const vertices = JSON.parse(data).map(v => new Two.Anchor(v.x, v.y));
const newPath = new Two.Path(vertices);
Two.js может импортировать SVG, преобразуя его в пути:
two.load('shape.svg', function(group) {
two.add(group);
});
Каждый SVG-путь превращается в Two.Path, что позволяет
редактировать его программно.
Пути отрисовываются в порядке добавления:
path1.addTo(two);
path2.addTo(two);
Позднее добавленные элементы находятся выше.
Для сложных форм используется комбинация:
Это делает Two.Path универсальным инструментом для любой
2D-графики.