В экосистеме анимации Adobe After Effects выражения представляют собой JavaScript-подобный язык, который позволяет динамически управлять параметрами свойств слоёв, эффектов и ключевых кадров. В контексте экосистемы Lottie Web важно понимать, что эти выражения существуют только на этапе авторинга и практически всегда преобразуются в статические данные при экспорте.
Выражения в After Effects — это вычисляемые инструкции, привязанные к свойствам анимации: позиции, масштабу, прозрачности, цвету и любым параметрам эффектов. Они позволяют:
Типичный пример выражения:
wiggle(2, 30)
или зависимость одного слоя от другого:
thisComp.layer("Controller").transform.position
Однако ключевой момент заключается в том, что выражения не являются частью конечной анимационной модели Lottie.
При экспорте через Bodymovin (плагин, формирующий JSON для Lottie), выражения не транслируются напрямую. Вместо этого происходит предварительное вычисление значений в After Effects.
Процесс можно описать так:
Таким образом, в структуре Lottie-файла выражений не существует — остаются только результаты их вычисления.
Внутри Lottie JSON выражения не представлены отдельной сущностью. Вместо этого используются:
k — ключевые кадры или значение свойства;Пример позиции слоя:
"p": {
"a": 0,
"k": [100, 200]
}
Если бы это значение было результатом выражения, оно всё равно попало бы сюда уже вычисленным.
Для анимации:
"p": {
"a": 1,
"k": [
{
"t": 0,
"s": [0, 0],
"e": [100, 100]
}
]
}
Никакой информации о логике вычисления в JSON не сохраняется.
Существует фундаментальное ограничение: любые выражения, которые зависят от времени, случайности или внешних данных, должны быть «развернуты» в дискретные значения.
Не поддерживаются:
time-зависимые функции в виде кода;wiggle(), loopOut(), random()
как логика;Причина проста: движок Lottie Web является интерпретатором уже готового описания анимации, а не средой исполнения выражений.
Плагин Bodymovin действует как «компилятор» анимации:
Если выражение зависит от времени:
time * 50
то результатом в JSON станет последовательность значений:
"k": [
{"t": 0, "s": 0},
{"t": 1, "s": 50},
{"t": 2, "s": 100}
]
Таким образом, выражение превращается в дискретную функцию, приближенную через ключевые кадры.
Несмотря на отсутствие прямой поддержки, поведение выражений можно частично воспроизвести:
Все вычисления переносятся в этап дизайна. Используются:
After Effects позволяет создавать циклические анимации, которые после экспорта становятся обычными повторяющимися ключевыми кадрами.
Контроллеры могут влиять на параметры до экспорта, но их логика исчезает после конвертации.
Архитектура Lottie ориентирована на предсказуемость и производительность в браузере:
Если бы выражения исполнялись в runtime, это нарушило бы:
Поэтому логика выражений переносится на этап авторинга.
Внутри рендерера Lottie Web используется интерполяция значений между ключевыми кадрами:
Это создаёт эффект «живой» анимации без необходимости вычислять выражения.
Пример:
{
"t": 0,
"s": [0, 0],
"e": [100, 100],
"i": {"x": [0.33], "y": [0.33]},
"o": {"x": [0.67], "y": [0.67]}
}
Хотя в After Effects это может быть результатом сложного выражения, в Lottie остаётся только математическая кривая.
Отсутствие выражений в runtime приводит к важным последствиям:
Если требуется динамическое поведение, используется слой поверх рендера:
Пример управления:
const anim = lottie.loadAnimation({
container: element,
renderer: "svg",
loop: true,
autoplay: true,
path: "animation.json"
});
anim.setSpeed(2);
anim.goToAndStop(50, true);
Таким образом логика выражений переносится из AE в JavaScript-уровень.
Выражения занимают промежуточное положение:
В пайплайне Lottie:
Expression → Evaluation in AE → Keyframes → JSON → Lottie Web rendering
Именно поэтому понимание их роли критично при проектировании сложной анимации, несмотря на их полное отсутствие в итоговом файле.