Velocity tracking

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

Основная идея velocity tracking заключается в вычислении производной изменения значения во времени и преобразовании её в устойчивую величину, пригодную для управления анимацией.


Базовая модель скорости в Popmotion

Внутренне скорость рассматривается как изменение значения x во времени t:

v =

Где:

  • Δx — изменение координаты или значения
  • Δt — интервал времени между измерениями
  • v — мгновенная скорость

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


Сглаживание скорости

Для получения стабильного значения применяется экспоненциальное сглаживание. Оно уменьшает влияние резких скачков и делает движение физически правдоподобным.

v_{smoothed} = v_{new} + (1 - ) v_{prev}

Параметр α определяет чувствительность:

  • близко к 1 — высокая реактивность
  • ближе к 0 — плавное движение

В Popmotion это проявляется в механизмах расчёта velocity для pointer-based взаимодействий.


Сбор данных движения

Velocity tracking начинается с фиксации последовательности значений:

  • координаты pointer (x, y)
  • timestamp события
  • текущее значение анимируемого свойства

Каждое новое событие обновляет состояние:

  • сохраняется предыдущая позиция
  • фиксируется время
  • вычисляется разница

Пример логики сбора:

let lastX = 0;
let lastTime = performance.now();

function onMove(x) {
  const now = performance.now();
  const dt = now - lastTime;

  const dx = x - lastX;
  const velocity = dx / dt;

  lastX = x;
  lastTime = now;
}

В библиотечном контексте эта логика обобщается и интегрируется в pointer tracking.


Pointer velocity и жесты

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

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

Pointer tracking обычно фиксирует не только позицию, но и вектор движения.

= (v_x, v_y)

Где:

  • v_x — горизонтальная составляющая
  • v_y — вертикальная составляющая

Это позволяет моделировать двумерную инерцию.


Inertia и использование velocity

Inertia-анимации в Popmotion строятся на переданной начальной скорости. После завершения пользовательского взаимодействия система продолжает движение, постепенно уменьшая скорость.

Базовая физическая модель затухания:

genui{“math_block_widget_always_prefetch_v2”:{“content”:“v(t) = v_0 e^{-kt}”}}

Где:

  • v_0 — начальная скорость
  • k — коэффициент трения
  • t — время

Такой подход обеспечивает естественное замедление движения.


Расчёт расстояния при известной скорости

Интеграция скорости позволяет определить пройденное расстояние:

x(t) = v(t) dt

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


Реализация velocity tracking через value-объекты

Popmotion использует реактивные value-объекты, которые могут отслеживать изменения и вычислять производные.

Типичная схема:

import { value } from 'popmotion';

const x = value(0, (v) => {
  // реакция на изменение
});

При обновлении значения система может вычислять:

  • текущую скорость
  • ускорение
  • направление изменения

Velocity хранится как мета-информация о состоянии value.


Velocity через выборку (sampling)

Один из методов вычисления скорости основан на дискретной выборке значений.

v

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

Особенности:

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

Ограничение максимальной скорости

Для стабильности анимации вводятся ограничения:

  • clamp скорости
  • нормализация вектора
  • ограничение ускорения

Формально ограничение может выглядеть как:

|v| v_{max}

Это предотвращает выбросы при резких жестах.


Velocity decay и управление временем затухания

Decay-анимации используют velocity как начальное условие и постепенно уменьшают его до нуля.

Временная характеристика зависит от friction-like коэффициента:

t_{stop} ()

Где ε — порог остановки движения.


Использование velocity в комбинированных анимациях

Velocity становится связующим элементом между различными типами анимации:

  • drag → inertia
  • pointer movement → spring transition
  • scroll momentum → decay

Система принимает текущее значение скорости и выбирает модель поведения.

Пример логики перехода:

if (velocity > threshold) {
  startInertia(velocity);
} else {
  startSpring();
}

Двумерная стабилизация скорости

Для UI-интеракций важно избегать дрожания траектории. Используется нормализация вектора скорости:

=

После нормализации применяется масштабирование:

_{final} = s

где s — скаляр скорости.


Velocity в системах жестов

При построении gesture systems velocity становится ключевым параметром классификации взаимодействия:

  • короткий быстрый жест → flick
  • медленный контролируемый → drag
  • ускоряющийся → swipe

Классификация основана на порогах скорости и ускорения:

a =

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


Интеграция velocity в reactive pipeline

Velocity tracking часто встроен в поток обновлений состояния:

  • input event → sampling
  • smoothing
  • velocity estimation
  • physics model selection
  • animation execution

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


Практическая роль velocity в Popmotion-архитектуре

Velocity является связующим звеном между:

  • пользовательским вводом
  • физическими моделями движения
  • анимационными переходами
  • инерционными эффектами

Без корректного вычисления скорости невозможна реалистичная имитация движения, так как система теряет информацию о предыдущем состоянии и динамике взаимодействия.