В Popmotion движение строится на физически ориентированных моделях, где анимация рассматривается как результат взаимодействия начального положения, целевой точки, силы сопротивления и начальной скорости. Именно начальная скорость задаёт инерционный “импульс” объекта в момент старта или завершения взаимодействия, особенно в сценариях drag-and-drop, жестов и кинематических переходов.
Начальная скорость (velocity, v₀) определяет, с какой
скоростью объект уже движется в момент запуска анимации.
Формально:
v₀ — скорость в момент времени
t = 0
единицы измерения зависят от анимируемого параметра:
px/s — для координатdeg/s — для угловunit/s — для абстрактных значенийВ контексте Popmotion начальная скорость используется как входной параметр физического симулятора, который продолжает движение без резких скачков.
Popmotion не “перескакивает” к целевому состоянию, а моделирует движение:
Начальная скорость влияет на:
springВ пружинной модели начальная скорость влияет на первый импульс системы.
import { spring } from "popmotion";
spring({
from: 0,
to: 300,
velocity: 800,
stiffness: 200,
damping: 20
}).start(v => {
console.log(v);
});
velocityПружинная модель интерпретирует скорость как энергию системы в начальный момент.
decayМодель затухания полностью опирается на начальную скорость как на единственный драйвер движения.
import { decay } from "popmotion";
decay({
from: 0,
velocity: 1200
}).start(v => {
console.log(v);
});
Начальная скорость здесь задаёт всю “длину пути”.
inertiainertia объединяет физику инерции и сопротивления
среды.
import { inertia } from "popmotion";
inertia({
velocity: 600,
min: 0,
max: 1000,
power: 0.8,
timeConstant: 350
}).start(v => {
console.log(v);
});
При работе с drag-событиями именно сюда передаётся вычисленная скорость отпускания.
В реальных интерфейсах velocity редко задаётся вручную. Чаще он вычисляется на основе пользовательского ввода.
Типичный сценарий:
Пример расчёта:
let previous = { x: 0, t: 0 };
function onMove(x, t) {
const dt = t - previous.t;
const velocity = (x - previous.x) / dt;
previous = { x, t };
return velocity * 1000;
}
Popmotion часто используется совместно с pointer и
drag.
import { pointer, inertia } from "popmotion";
let latest = 0;
pointer({
onMove: v => {
latest = v.x;
},
onEnd: v => {
inertia({
from: v.x,
velocity: v.velocity.x
}).start(console.log);
}
});
Здесь:
v.velocity.x уже содержит вычисленную начальную
скоростьНачальная скорость определяет форму движения:
Начальная скорость не существует изолированно. Она взаимодействует с параметрами среды:
damping в spring определяет, насколько быстро гасится
энергияfriction в inertia влияет на замедлениеpower в decay масштабирует влияние скоростиПример:
spring({
from: 0,
to: 500,
velocity: 1000,
damping: 30
});
При одинаковой скорости изменение демпфирования радикально меняет поведение системы.
Скорость без привязки к времени приводит к нестабильному поведению:
Для стабильного поведения скорость приводится к единому масштабу:
Часто применяется ограничение:
const clampVelocity = v =>
Math.max(-2000, Math.min(2000, v));
Начальная скорость формирует ощущение “массы” интерфейса:
В интерфейсах с жестами именно velocity создаёт иллюзию непрерывности движения между касанием и анимацией.
Popmotion позволяет строить собственные физические системы, где начальная скорость входит в дифференциальные уравнения движения:
function customPhysics(v0, t) {
const friction = 0.95;
return v0 * Math.pow(friction, t);
}
Здесь:
v0 задаёт старт