Кривые Безье третьего порядка (cubic bezier) являются основой для создания плавных анимаций в Popmotion. Они задаются четырьмя точками: начальной, конечной и двумя управляющими, определяющими форму кривой. В контексте анимации используются нормализованные координаты, где:
(0, 0)(1, 1)(x1, y1) и
(x2, y2) задают характер ускорения и замедленияФункция cubic bezier интерполирует значение от 0 до 1 по времени, создавая нелинейное изменение скорости.
Кривая описывается параметрическим уравнением:
B(t) = (1 - t)^3 * P0 +
3(1 - t)^2 * t * P1 +
3(1 - t) * t^2 * P2 +
t^3 * P3
где:
t — параметр времени от 0 до 1P0 = (0, 0)P1 = (x1, y1)P2 = (x2, y2)P3 = (1, 1)В анимации важен не сам путь, а зависимость y от
x, которая задаёт easing-функцию.
Popmotion предоставляет встроенный инструмент для работы с cubic
bezier через модуль easing.
Пример создания кастомной функции:
import { cubicBezier } from "popmotion";
const ease = cubicBezier(0.42, 0, 0.58, 1);
Здесь:
0.42, 0 — первая управляющая точка0.58, 1 — вторая управляющая точкаЭти значения соответствуют стандартной функции
ease-in-out.
Cubic bezier применяется в свойствах ease:
import { animate } from "popmotion";
animate({
from: 0,
to: 100,
ease: cubicBezier(0.17, 0.67, 0.83, 0.67),
onUpdate: value => {
console.log(value);
}
});
Функция ease преобразует линейное время в нелинейное,
изменяя скорость анимации.
Координаты (x1, y1) и (x2, y2) влияют
на:
Горизонтальные значения (x):
Вертикальные значения (y):
cubicBezier(0, 0, 1, 1)
cubicBezier(0.42, 0, 1, 1)
cubicBezier(0, 0, 0.58, 1)
cubicBezier(0.42, 0, 0.58, 1)
Форма кривой определяет характер движения:
x1 и x2 должны находиться в
диапазоне [0, 1], иначе функция может стать
некорректнойy могут выходить за пределы
[0, 1], создавая эффекты overshoot (перелёт)const ease = cubicBezier(0.34, 1.56, 0.64, 1);
Cubic bezier может использоваться совместно с:
keyframestimelinespring (для более сложной физики)Пример:
import { keyframes, cubicBezier } from "popmotion";
keyframes({
values: [0, 100, 50, 150],
ease: [
cubicBezier(0.42, 0, 1, 1),
cubicBezier(0, 0, 0.58, 1),
cubicBezier(0.17, 0.67, 0.83, 0.67)
],
duration: 2000
}).start(v => console.log(v));
CSS-функции легко переносятся:
transition: all 0.3s cubic-bezier(0.25, 0.1, 0.25, 1);
Эквивалент:
cubicBezier(0.25, 0.1, 0.25, 1)
Подбор параметров часто выполняется экспериментально:
x1 → более резкий стартy1 → ускорение в началеy2 → замедление перед концомx2 → более позднее торможениеДля точной настройки используются визуальные редакторы cubic bezier:
Cubic bezier:
Однако:
spring в реалистичности| Характеристика | Cubic Bezier | Spring |
|---|---|---|
| Контроль | Точный | Физический |
| Реалистичность | Средняя | Высокая |
| Производительность | Высокая | Средняя |
| Простота настройки | Простая | Сложнее |
Cubic bezier применяется для:
Быстрые интерфейсы:
cubicBezier(0.4, 0, 0.2, 1)
Дружелюбные интерфейсы:
cubicBezier(0.25, 0.1, 0.25, 1)
Динамичные эффекты:
cubicBezier(0.68, -0.55, 0.27, 1.55)
Popmotion:
txt по
xyЭто требует численного метода (обычно бинарный поиск или Ньютона),
так как аналитически выразить t(x) невозможно.
Cubic bezier может использоваться как часть сложных систем:
import { timeline, cubicBezier } from "popmotion";
timeline([
{
track: "x",
from: 0,
to: 100,
duration: 500,
ease: cubicBezier(0.42, 0, 0.58, 1)
},
{
track: "x",
to: 200,
duration: 300,
ease: cubicBezier(0.17, 0.67, 0.83, 0.67)
}
]).start({
update: ({ x }) => console.log(x)
});
Использование cubic bezier остаётся фундаментальным инструментом при построении анимаций с контролируемым и предсказуемым поведением.