Морфинг в mo.js представляет собой процесс плавного преобразования одной геометрической формы в другую с сохранением анимационной непрерывности. В основе механизма лежит интерполяция точек пути (path interpolation), при которой контур исходной фигуры трансформируется в контур целевой фигуры через последовательные промежуточные состояния.
В mo.js морфинг фигур строится вокруг концепции
ShapeSwirl и Shape, где ключевым элементом
выступает параметр пути. Любая фигура рассматривается как набор
координат, описанных кривыми Безье или SVG-path строкой.
Ключевая идея:
Если формы имеют разное количество точек, библиотека автоматически нормализует их, приводя к единой сетке интерполяции.
mo.js активно использует SVG-пути как универсальное представление фигур. Морфинг работает только тогда, когда обе формы могут быть представлены в виде совместимых path-структур.
Пример базового подхода:
SVG-путь разбивается на команды:
M — move toL — line toC — cubic Bézier curveZ — замыкание контураИменно координаты этих команд интерполируются при анимации.
В mo.js морфинг чаще всего реализуется через объект
Shape:
const shape = new mojs.Shape({
parent: document.body,
shape: 'circle',
scale: { 0: 1 },
duration: 800
});
Для морфинга между формами используется параметр shape
как анимируемое значение:
const morph = new mojs.Shape({
parent: document.body,
shape: { circle: 'rect' },
scale: { 0: 1 },
duration: 1000,
easing: 'cubic.out'
});
Здесь происходит интерполяция между двумя базовыми preset-фигурами.
Более гибкий подход — использование пользовательских SVG-путей.
const morph = new mojs.Shape({
parent: document.body,
shape: {
path: 'M10 10 H 90 V 90 H 10 Z',
curve: 'M50 15 C 80 20, 80 80, 50 85 C 20 80, 20 20, 50 15 Z'
},
duration: 1200
});
В этом случае библиотека интерполирует координаты контрольных точек Безье-кривых.
Одной из ключевых задач при морфинге является приведение разных форм к единой структуре.
Процесс включает:
Если направления обхода различаются (clockwise vs counterclockwise), возникает эффект «перекручивания» фигуры.
После нормализации выполняется линейная интерполяция:
x(t) = x₁ + (x₂ - x₁) * t
y(t) = y₁ + (y₂ - y₁) * t
где t изменяется от 0 до 1.
В mo.js поверх этого слоя добавляются easing-функции, влияющие на
скорость изменения параметра t.
Easing определяет характер перехода формы:
Пример:
const morph = new mojs.Shape({
parent: document.body,
shape: { circle: 'polygon' },
duration: 1500,
easing: 'elastic.out'
});
В этом случае изменение геометрии усиливается эффектом «переразгона» координат.
mo.js поддерживает последовательные трансформации нескольких форм:
Каждый переход интерполируется отдельно, но с сохранением общего таймлайна.
const morph = new mojs.Shape({
parent: document.body,
shape: {
circle: 'rect',
rect: 'polygon',
polygon: 'circle'
},
duration: 2000
});
Такие цепочки требуют строгой совместимости SVG-структур, иначе возникают артефакты.
Форма редко изменяется изолированно. Обычно морфинг сопровождается:
const morph = new mojs.Shape({
parent: document.body,
shape: { circle: 'rect' },
scale: { 0: 2 },
rotate: { 0: 180 },
opacity: { 1: 0 },
duration: 1200
});
Комбинация трансформаций усиливает визуальную плавность перехода.
В более сложных сценариях используется прямое управление path-строками.
const morph = new mojs.Shape({
parent: document.body,
shape: {
path: 'M20,20 L80,20 L80,80 L20,80 Z',
path2: 'M50,10 L90,90 L10,90 Z'
},
duration: 1400
});
Каждый path преобразуется в набор сегментов, после чего выполняется покоординатная интерполяция.
Основные проблемы морфинга:
Эти проблемы решаются через preprocessing:
Морфинг в mo.js может быть вычислительно затратным при большом количестве точек.
Основные факторы нагрузки:
Оптимизация достигается через:
mo.js часто используется не изолированно, а в связке с burst-эффектами.
Пример логики:
Это создаёт эффект «разрыва формы».
В более сложных интерфейсах морфинг используется как способ перехода между состояниями UI:
Каждое состояние описывается отдельной SVG-формой, а mo.js обеспечивает плавный переход.
С математической точки зрения морфинг представляет собой:
При корректной настройке морфинг не допускает разрывов контура, только его деформацию.
В продвинутых реализациях используется:
Это позволяет добиться предсказуемого результата даже при сложных трансформациях.
Типичные артефакты:
Контроль достигается через:
Морфинг часто применяется как центральный элемент сцены:
В таких сценариях он работает не как изолированная анимация, а как часть композиции движения.