Класс Mesh в PixiJS предоставляет низкоуровневый доступ
к работе с вершинами, UV-координатами и индексами. На его основе
реализованы специализированные решения для типовых задач деформации
текстур: Plane, NineSlicePlane и
Rope. Эти классы позволяют управлять геометрией изображения
без ручной работы с буферами, сохраняя при этом производительность
WebGL.
Plane представляет собой прямоугольную сетку (grid),
состоящую из множества сегментов по горизонтали и вертикали. Текстура
распределяется по всей поверхности, а каждая вершина может быть смещена,
создавая эффект искажения.
Класс применяется для:
При создании Plane задаются:
verticesX);verticesY).Чем больше сегментов, тем выше детализация деформации. Однако увеличение числа вершин влияет на производительность, поскольку возрастает объём геометрических данных.
Внутренне создаются:
Каждый прямоугольный сегмент разбивается на два треугольника.
const plane = new PIXI.SimplePlane(texture, 10, 10);
Здесь формируется сетка 10×10 сегментов. Общее количество вершин
равно (10 + 1) * (10 + 1).
Вершины хранятся в массиве:
plane.geometry.getBuffer('aVertexPosition').data
Каждые две координаты соответствуют одной вершине:
[x0, y0, x1, y1, ...].
Изменение координат позволяет создавать анимации:
const vertices = plane.geometry.getBuffer('aVertexPosition').data;
for (let i = 0; i < vertices.length; i += 2) {
vertices[i + 1] += Math.sin(i + time) * 2;
}
plane.geometry.getBuffer('aVertexPosition').update();
Обновление буфера обязательно после модификации.
При масштабировании обычного спрайта происходит растяжение всей текстуры, включая углы и рамки. В интерфейсных элементах (кнопки, панели, окна) это приводит к искажению декоративных частей.
NineSlicePlane делит текстуру на 9 областей:
[ A | B | C ]
[ D | E | F ]
[ G | H | I ]
Таким образом сохраняется форма углов при изменении размеров.
const panel = new PIXI.NineSlicePlane(
texture,
leftWidth,
topHeight,
rightWidth,
bottomHeight
);
Параметры определяют размеры нерастягиваемых областей по краям текстуры.
Размер меняется обычными свойствами:
panel.width = 400;
panel.height = 200;
Геометрия автоматически пересчитывается.
NineSlicePlane является расширением
SimplePlane, но:
Rope используется для отображения текстуры вдоль набора
точек. Геометрия формируется на основе ломаной линии, а текстура
“оборачивается” вокруг неё.
Применяется для:
В основе лежит массив точек:
const points = [
new PIXI.Point(x1, y1),
new PIXI.Point(x2, y2),
...
];
Каждая точка определяет центральную линию. На основе соседних точек вычисляется:
Фактически каждая точка порождает две вершины — левую и правую относительно направления сегмента.
const rope = new PIXI.SimpleRope(texture, points);
Количество сегментов равно количеству точек минус один.
Изменение положения точек автоматически деформирует геометрию:
for (let i = 0; i < points.length; i++) {
points[i].y += Math.sin(i * 0.5 + time) * 3;
}
Пересчёт геометрии происходит внутри класса при рендеринге.
UV-координаты распределяются вдоль длины ломаной. По умолчанию:
При необходимости возможно ручное управление UV-буфером.
Ширина определяется высотой текстуры. Изменение масштаба влияет на толщину:
rope.scale.y = 0.5;
| Характеристика | Plane | NineSlicePlane | Rope |
|---|---|---|---|
| Тип деформации | Сетка | 9-сегментная сетка | Ломаная линия |
| Произвольная форма | Частично | Нет | Да |
| Подходит для UI | Нет | Да | Нет |
| Подходит для эффектов | Да | Ограниченно | Да |
| Контроль вершин | Полный | Ограниченный | Через точки |
Все три класса используют общую архитектуру Mesh:
Geometry — хранит атрибуты вершин;Buffer — передаёт данные в GPU;Shader — определяет обработку фрагментов.Основные атрибуты:
aVertexPositionaTextureCoordИзменение позиции вершин требует вызова update() у
соответствующего буфера.
При деформации важно учитывать pivot и
anchor. Неправильная установка может привести к визуальным
смещениям при изменении размеров.
Меши поддерживают интерактивность, но хит-тестирование выполняется по ограничивающему прямоугольнику, а не по фактической форме. Для точных проверок требуется кастомная логика.
Все специализированные меши совместимы с фильтрами PixiJS. Однако фильтры применяются к результирующей геометрии, что может повлиять на производительность при сложных деформациях.
Возможна замена стандартного шейдера:
const mesh = new PIXI.Mesh(geometry, customShader);
На базе Plane или Rope создаются
продвинутые эффекты, включая:
Plane, NineSlicePlane и Rope
представляют промежуточный уровень между простыми спрайтами и полностью
кастомной геометрией. Они:
Использование этих классов позволяет реализовывать сложные визуальные эффекты без написания низкоуровневого WebGL-кода, сохраняя контроль над вершинами и текстурными координатами.