В анимационной системе mo.js каждая трансформация опирается на точку отсчёта, от которой начинается изменение геометрии объекта. Эта точка определяет поведение масштаба, вращения, смещения и визуального расширения эффектов. Внутри движка она связывается с понятием локальной системы координат и параметрами позиционирования сущности, будь то shape, burst или tween-анимация.
Любой объект в mo.js существует одновременно в двух пространствах: глобальном и локальном. Глобальное пространство задаёт положение на странице, локальное — определяет центр трансформации.
При создании примитивов через Shape или
Burst используется система координат, где:
x и y задают позицию центра объектаparent определяет контейнер, внутри которого
вычисляется позицияradius часто выступает как визуальная граница, но
косвенно влияет на восприятие центра трансформацииЛокальный центр трансформации по умолчанию совпадает с геометрическим центром фигуры. Именно вокруг него происходят масштабирование и вращение.
const circle = new mojs.Shape({
shape: 'circle',
left: '50%',
top: '50%',
scale: { 0: 1 },
duration: 800
});
В этом случае точка трансформации совпадает с центром круга, так как
позиционирование задано через left и top
относительно центра контейнера.
При работе с эффектами типа burst точка трансформации становится источником «взрыва» частиц. Все элементы композиции рассчитывают траектории относительно начального центра.
const burst = new mojs.Burst({
left: '50%',
top: '50%',
radius: { 0: 100 },
count: 10,
children: {
shape: 'circle',
radius: 5,
scale: { 1: 0 },
duration: 700
}
});
Здесь начальная точка трансформации задаёт не только позицию burst,
но и центр радиального распределения дочерних элементов. Расширение
radius интерпретируется как увеличение расстояния от этой
точки, что формирует эффект исходящего движения.
В CSS-анимациях существует свойство transform-origin, и
mo.js наследует эту концепцию, хотя скрывает её внутри абстракций. При
масштабировании объектов важно, относительно какой точки происходит
изменение размера.
Если трансформация привязана к центру, увеличение масштаба сохраняет симметрию. Если точка смещена, возникает эффект «смещения при росте».
const square = new mojs.Shape({
shape: 'rect',
left: '50%',
top: '50%',
scale: { 0: 2 },
duration: 600
});
В данном случае увеличение масштаба происходит из центра, создавая равномерное расширение. При изменении позиции относительно родителя можно получить эффект «вылета» объекта из угла или края сцены.
В mo.js прямого параметра transform-origin нет, но его
поведение моделируется изменением координатной базы. Смещение центра
достигается комбинацией left, top, а также
вложенными контейнерами.
const offsetShape = new mojs.Shape({
shape: 'circle',
left: '70%',
top: '30%',
scale: { 0: 1 },
duration: 900
});
При таком расположении визуальный центр сцены и точка трансформации объекта не совпадают, что создаёт асимметричное развитие анимации. Это используется для имитации глубины и направленного движения.
В композициях типа Burst параметр radius определяет не
только размер, но и распределение дочерних элементов относительно
центра.
const burst = new mojs.Burst({
left: '50%',
top: '50%',
radius: { 20: 80 },
children: {
shape: 'polygon',
points: 5,
scale: { 1: 0 },
duration: 1000
}
});
Увеличение радиуса интерпретируется как расширение области, из которой происходит генерация частиц. Центр остаётся фиксированным, но траектории движения становятся более протяжёнными.
При вложении анимаций друг в друга возникает несколько уровней точек трансформации. Родительская сущность задаёт глобальный центр, дочерняя — локальный.
const parent = new mojs.Shape({
shape: 'circle',
left: '50%',
top: '50%',
scale: { 1: 1.5 }
});
const child = new mojs.Shape({
shape: 'rect',
parent: parent.el,
scale: { 0: 1 },
duration: 800
});
В этом случае трансформация дочернего элемента зависит от координат родителя. Центр масштабирования пересчитывается относительно вложенного DOM-узла, что создаёт эффект иерархической анимации.
Хотя mo.js не предоставляет явного API для управления
transform-origin, аналогичное поведение достигается через
комбинацию смещения и анимации координат.
const shifted = new mojs.Shape({
shape: 'circle',
left: { '50%': '60%' },
top: { '50%': '40%' },
scale: { 0: 1 },
duration: 700
});
Здесь центр трансформации фактически «плавает» между двумя состояниями, создавая эффект движения, совмещённого с масштабированием.
Любая трансформация в mo.js опирается на начальное состояние объекта. Это состояние фиксирует:
Именно этот набор значений определяет базовую точку, от которой строится вся анимационная траектория. При изменении параметров tween система интерполирует значения относительно этой базы.
const anim = new mojs.Tween({
duration: 1000,
onUpdate: (progress) => {
const scale = 1 + progress * 2;
}
});
Хотя здесь не используется shape напрямую, логика остаётся той же: прогресс анимации всегда вычисляется относительно начальной точки состояния.
Вращение в mo.js строго привязано к центру объекта. При изменении угла без смещения координат объект сохраняет орбиту вращения вокруг собственной оси.
const rotating = new mojs.Shape({
shape: 'rect',
left: '50%',
top: '50%',
angle: { 0: 360 },
duration: 1200
});
Если бы центр трансформации был смещён, вращение создавало бы круговую траекторию в пространстве, но в стандартной конфигурации движение остаётся симметричным.
При одновременном применении scale, rotate и translate система mo.js стремится сохранять устойчивость точки трансформации. Это позволяет избегать визуальных артефактов и «дрожания» объектов при интерполяции.
const complex = new mojs.Shape({
shape: 'circle',
left: '50%',
top: '50%',
scale: { 0: 1.5 },
angle: { 0: 180 },
duration: 1000
});
В этой конфигурации все изменения происходят относительно одного центра, что обеспечивает предсказуемость движения и согласованность анимации даже при высокой плотности эффектов.