В анимационных системах цвет выступает не просто набором чисел, а многомерным пространством, в котором каждый канал подчиняется собственной модели интерполяции. В Popmotion работа с цветами строится вокруг преобразования значений в числовые представления и последующего смешивания этих представлений во времени через функции интерполяции и трансформации.
Цветовые значения в вебе поступают в нескольких форматах:
#ff0033, #f03)rgb(255, 0, 51))rgba(255, 0, 51, 0.5))hsl(348, 100%, 50%))tomato, black)Перед анимацией любое цветовое значение приводится к унифицированной числовой модели. В Popmotion это обычно массив каналов:
[r, g, b][r, g, b, a][h, s, l] или преобразованный в RGB форматТакой подход позволяет применять стандартные математические операции без зависимости от исходного строкового формата.
Базовый механизм анимации в Popmotion — линейная интерполяция:
[ f(t) = start + (end - start) t]
f(t) = start + (end - start) t
Для цвета это правило применяется к каждому каналу отдельно:
r₁ до r₂g₁ до g₂b₁ до b₂Таким образом цветовой переход превращается в движение точки в трёхмерном пространстве RGB.
Однако линейная интерполяция в RGB не учитывает особенности восприятия света человеком. Например, переход между двумя оттенками синего может выглядеть неравномерным из-за нелинейности цветового пространства.
В Popmotion ключевым инструментом выступает interpolate.
Она принимает диапазон значений и возвращает функцию, которая вычисляет
промежуточные состояния.
Для цветов используется автоматическое приведение к массивам:
import { interpolate } from 'popmotion';
const colorMixer = interpolate(
['#ff0000', '#0000ff'],
{ ease: t => t }
);
colorMixer(0); // rgb(255, 0, 0)
colorMixer(0.5); // rgb(127, 0, 127)
colorMixer(1); // rgb(0, 0, 255)
Внутри происходит:
RGB не является перцептивно равномерным пространством. Для более естественных переходов используется HSL:
Особенность Hue — цикличность:
[ 0]
0
Это требует специальной обработки при интерполяции, чтобы переход происходил по кратчайшей дуге цветового круга.
При наивной интерполяции 350° → 10° система может пройти через весь круг (350 → 360 → 0 → 10), вместо короткого пути.
Для корректного перехода Hue применяется логика выбора минимальной разницы:
Выбирается минимальное по модулю значение.
Это позволяет обеспечить визуально кратчайший переход оттенка.
Функция смешивания mix используется для статического или
анимированного объединения двух значений.
import { mix } from 'popmotion';
const blend = mix('#ff0000', '#00ff00');
blend(0); // красный
blend(0.5); // жёлто-зелёный
blend(1); // зелёный
В отличие от interpolate, mix чаще
используется как чистая функция без привязки к анимационному
таймингу.
Внутри применяется тот же принцип разложения цвета на каналы и последующего линейного смешивания.
RGBA добавляет четвёртый канал, который интерполируется так же, как цветовые:
При анимации прозрачности важно учитывать композитинг, поскольку визуальный результат зависит от фона.
Финальный цвет может быть представлен как:
[ C = C_{foreground} + (1 - ) C_{background}]
C = C_{foreground} + (1 - ) C_{background}
В Popmotion цвет рассматривается как частный случай value-объекта. Это означает:
При использовании value или tween цветовые
значения автоматически проходят через трансформационный слой:
import { value, tween } from 'popmotion';
const color = value('#ff0000');
tween({
from: '#ff0000',
to: '#00ffff',
duration: 1000
}).start(v => color.set(v));
Система сама определяет необходимость цветовой интерполяции и выбирает соответствующий трансформер.
Цветовые трансформации включают не только переходы между двумя значениями, но и вычисляемые изменения:
Такие операции часто реализуются через промежуточные функции над RGB или HSL.
Осветление в HSL:
При этом важно ограничивать диапазон:
RGB-эквивалент требует пересчёта всех каналов с учётом ограничения 0–255.
Easing-функции в Popmotion изменяют параметр t до его применения в интерполяции. Это означает, что цветовые переходы подчиняются тем же законам ускорения и замедления, что и координаты или размеры.
Пример нелинейного перехода:
В цветовом контексте это влияет на восприятие градиента: распределение промежуточных оттенков становится неравномерным, но визуально более естественным.
RGB можно рассматривать как точку в трёхмерном пространстве:
Переход между цветами становится векторным движением:
[ (t) = + t( - )]
(t) = + t( - )
Такое представление позволяет использовать геометрические операции для анализа цветовых переходов, включая расстояние между цветами и направление изменения оттенка.
Линейная интерполяция имеет ряд ограничений:
Из-за этого в сложных визуальных системах иногда вводятся дополнительные корректирующие функции или переход в perceptual color spaces.
При одновременной анимации нескольких цветовых свойств возникает проблема композиции:
Каждый слой может иметь собственную интерполяцию, что приводит к сложной результирующей картине.
Popmotion в таких случаях опирается на независимую обработку значений, оставляя композицию на уровне DOM или графического движка.