Маскирование (clipping) в библиотеке Two.js позволяет ограничивать область отображения одних графических объектов с помощью других. Это ключевой инструмент для создания сложных визуальных эффектов: анимаций, интерфейсных элементов, динамических сцен и декоративных переходов.
В основе механизма лежит идея: один объект используется как «трафарет» (маска), через который виден другой объект. Всё, что выходит за пределы маски, не отображается.
В Two.js любой графический объект является экземпляром класса
Two.Shape или его производных (Two.Path,
Two.Rectangle, Two.Circle и др.). Маска также
представляет собой обычную фигуру, но используется особым образом.
Ключевое свойство:
shape.mask = maskShape;
shape — объект, к которому применяется маскаmaskShape — объект, определяющий видимую областьПосле назначения маски:
shape, которая
пересекается с геометрией маскиconst two = new Two({ width: 500, height: 500 }).appendTo(document.body);
// Основной объект (например, изображение или фигура)
const rect = two.makeRectangle(250, 250, 300, 300);
rect.fill = 'blue';
// Маска — круг
const mask = two.makeCircle(250, 250, 100);
mask.fill = 'black';
// Применение маски
rect.mask = mask;
// Скрываем маску
mask.visible = false;
two.update();
Результат: синий квадрат будет виден только внутри круглой области.
Маска и объект существуют в одной системе координат. Это означает:
translation,
rotation, scale) применяются независимоПример смещения маски:
mask.translation.set(300, 250);
Это изменит область видимости объекта без изменения самого объекта.
Two.js активно использует группы (Two.Group) для
организации сцены. Маска может применяться не только к отдельной фигуре,
но и к группе:
const group = two.makeGroup(rect1, rect2, rect3);
group.mask = mask;
В этом случае:
Two.js поддерживает вложенность:
shape.mask = mask1;
mask1.mask = mask2;
Однако на практике:
Маски особенно полезны при работе с изображениями:
const image = two.makeImage('image.jpg', 250, 250);
const mask = two.makeCircle(250, 250, 120);
image.mask = mask;
mask.visible = false;
Применение:
Маска — это обычный объект, значит её можно анимировать:
two.bind('upd ate', function(frameCount) {
mask.scale = 1 + Math.sin(frameCount * 0.05) * 0.5;
});
Эффекты:
Маска не ограничивается простыми фигурами. Можно использовать произвольные пути:
const path = two.makePath(
200, 200,
300, 100,
400, 200,
350, 300,
250, 300,
true
);
shape.mask = path;
path.visible = false;
Преимущества:
Важно понимать:
opacity) маски не влияет на силу
маскированияИсключение: при использовании SVG-рендера возможны нюансы, связанные с альфа-каналом.
Two.js использует иерархию сцены:
Рекомендуемый подход:
two.add(mask);
two.add(shape);
shape.mask = mask;
Two.js поддерживает несколько рендереров:
Поведение масок может отличаться:
Canvas:
SVG:
WebGL:
Маскирование — ресурсоёмкая операция. Рекомендации:
1. Прогресс-бары
2. Эффекты появления
3. Параллакс
4. Имитация освещения
Маски можно сочетать с:
opacityscalerotationtranslationПример:
mask.rotation += 0.01;
mask.scale = 1 + Math.sin(frameCount * 0.1) * 0.2;
Это даёт сложные динамические эффекты без изменения самого объекта.
При проблемах с отображением:
временно включать видимость маски:
mask.visible = true;проверять координаты
упрощать форму маски
тестировать в разных рендерерах
Разделение логики:
Композиция:
Анимационные контроллеры:
visible)Динамическая смена маски:
shape.mask = mask1;
// позже
shape.mask = mask2;
Интерактивные маски:
document.addEventListener('mousemove', (e) => {
mask.translation.se t(e.clientX, e.clientY);
});
Маски с анимацией пути:
vertices)Механизм масок в Two.js представляет собой мощный инструмент управления видимостью, позволяющий создавать сложные графические композиции с минимальными затратами кода.