Визуализация временных линий

В Popmotion временная линия представляет собой последовательность анимационных событий, связанных единой шкалой времени, где каждое изменение значения привязано к конкретному моменту или интервалу. Визуализация таких временных линий позволяет превратить абстрактные числовые переходы в наглядную структуру, где легко анализировать поведение анимаций, их синхронизацию и пересечения.

В основе лежит идея дискретных или непрерывных изменений значения, распределённых по оси времени. Каждая анимация внутри Popmotion может рассматриваться как функция:

  • вход: время t
  • выход: значение свойства (число, координата, цветовой канал)

Визуализация требует преобразования этой функции в графическое представление.

Типовая временная линия включает:

  • стартовую точку (start time)
  • набор ключевых кадров (keyframes)
  • длительности переходов (duration)
  • кривые интерполяции (easing functions)
  • точки синхронизации нескольких анимаций

Каждый элемент можно представить как сегмент на временной оси.

Отображение временной оси

Визуализация начинается с построения координатной системы:

  • горизонтальная ось — время
  • вертикальная ось — значение параметра

В простейшем случае используется линейное отображение:

  • x = time * scaleX
  • y = value * scaleY

Такое преобразование позволяет переводить внутренние значения Popmotion в пиксели.

Пример базового преобразования:

const timeToX = (t, scale = 1) => t * scale;
const valueToY = (v, scale = 1) => 200 - v * scale;

Инверсия вертикальной оси необходима из-за экранной системы координат, где ноль находится в верхнем левом углу.

Визуализация ключевых кадров

Ключевые кадры представляют фиксированные состояния анимации в определённые моменты времени. В Popmotion они могут задаваться через keyframes.

Графическое отображение ключевых кадров включает:

  • точки на графике
  • линии интерполяции между ними
  • маркеры времени

Каждый ключевой кадр имеет структуру:

{
  time: 0.3,
  value: 120
}

При визуализации такие точки соединяются линиями или кривыми Безье в зависимости от типа easing.

Интерполяция и кривые движения

Popmotion активно использует функции сглаживания (easing), которые задают характер изменения значения во времени. Визуально это превращает прямые линии в кривые.

Типовые кривые:

  • linear — равномерное изменение
  • easeIn — ускорение
  • easeOut — замедление
  • easeInOut — комбинированное поведение

График интерполяции строится как функция:

const easeInQuad = t => t * t;

Визуально это означает, что изменение значения в начале временного отрезка медленное, а затем ускоряется.

При отрисовке на canvas каждый шаг времени дискретизируется:

for (let t = 0; t <= 1; t += 0.01) {
  const eased = easeInQuad(t);
  const x = timeToX(t, 300);
  const y = valueToY(eased, 200);
}

Многослойные временные линии

В сложных анимациях Popmotion одновременно работают несколько независимых потоков значений. Визуализация таких систем требует разделения на слои:

  • слой трансформаций (position, scale, rotation)
  • слой прозрачности (opacity)
  • слой цветовых изменений
  • слой событий (triggers)

Каждый слой имеет собственную временную шкалу, но может быть синхронизирован через общий таймлайн.

Графически это отображается как несколько параллельных графиков.

Синхронизация анимаций

Одной из ключевых задач визуализации является отображение синхронности:

  • параллельные анимации стартуют одновременно
  • последовательные запускаются с задержкой
  • цепочки переходов образуют каскады

Popmotion позволяет задавать задержки и относительное время запуска.

В визуализации это выражается смещением по оси X:

const delayOffset = time + delay;
const x = timeToX(delayOffset);

Такая модель позволяет видеть структуру зависимостей между анимациями.

Визуализация timeline как графа

При усложнении структуры временная линия превращается в направленный граф:

  • узлы — состояния
  • рёбра — переходы
  • веса — длительность перехода

Каждый переход может содержать свою функцию интерполяции.

Графическое представление часто реализуется через SVG, где:

  • узлы — окружности
  • связи — кривые линии
  • направление — стрелки

Пример логики построения:

const node = {
  id: 'A',
  time: 0,
  value: 50
};

const edge = {
  from: 'A',
  to: 'B',
  duration: 0.4,
  easing: 'easeOut'
};

Отображение прогресса анимации

Важной частью визуализации является индикатор текущего состояния timeline. Он представляет собой вертикальную линию, движущуюся по оси времени.

Её положение вычисляется так:

const progressX = timeToX(currentTime);

Пересечение этой линии с графиками позволяет определить актуальные значения всех анимаций в конкретный момент времени.

Scrubbing и интерактивное управление

При визуализации временной линии часто используется режим перемотки времени. В этом режиме время перестаёт быть непрерывным процессом и становится управляемым параметром.

Система переходит в состояние:

  • фиксированного времени
  • пересчёта всех значений от t

Формально:

const valueAtTime = timeline.sample(t);

Каждая анимация пересчитывается заново при изменении t, что позволяет визуально исследовать поведение системы.

Визуализация сложных переходов

В Popmotion возможно построение цепочек анимаций, где результат одной становится входом другой. Это требует отображения зависимости значений.

Пример:

  • анимация A изменяет координату X
  • анимация B использует X как вход для изменения масштаба

Графически это выражается стрелкой зависимости между кривыми.

Канвас-рендеринг временной линии

Canvas используется для высокопроизводительной отрисовки сложных таймлайнов.

Основные этапы рендеринга:

  1. очистка холста
  2. отрисовка осей
  3. отрисовка ключевых кадров
  4. построение кривых интерполяции
  5. отображение текущего времени

Пример структуры отрисовки:

function render(ctx, timeline, time) {
  ctx.clearRect(0, 0, width, height);

  drawAxis(ctx);

  timeline.keyframes.forEach(kf => {
    drawPoint(ctx, timeToX(kf.time), valueToY(kf.value));
  });

  drawCurve(ctx, timeline);

  drawIndicator(ctx, timeToX(time));
}

SVG-представление временной линии

SVG подходит для интерактивных визуализаций благодаря возможности навешивать события.

Каждый элемент таймлайна становится DOM-узлом:

  • <path> — кривые
  • <circle> — ключевые точки
  • <line> — временная ось

Преимущество SVG заключается в точной работе с координатами и возможностью масштабирования без потерь.

Масштабирование временной оси

При увеличении сложности таймлайна требуется масштабирование:

  • временное (zoom по времени)
  • амплитудное (zoom по значению)

Математически это выражается через коэффициенты:

x' = (t - t0) * scaleX;
y' = (v - v0) * scaleY;

Это позволяет рассматривать как весь таймлайн, так и его отдельные участки.

Визуализация пересечений анимаций

При наложении нескольких анимаций важным аспектом становится анализ пересечений:

  • совпадение значений в один момент времени
  • пересечение траекторий
  • синхронные пики

Такие точки часто выделяются визуально маркерами, так как они обозначают критические состояния интерфейса.

Отображение состояний объектов

В Popmotion объект часто проходит через множество состояний. Визуализация этих состояний на временной линии позволяет представить жизненный цикл объекта как непрерывную траекторию:

  • появление
  • трансформация
  • стабилизация
  • исчезновение

Каждое состояние соответствует участку кривой или отдельному сегменту.

Композиция временных линий

Несколько timeline могут быть объединены в единый композиционный слой. В этом случае визуализация становится многомерной:

  • общая временная ось
  • независимые каналы значений
  • синхронизированные события

Композиция позволяет строить сложные анимационные сцены, где поведение системы определяется взаимодействием множества временных потоков.