Отладка проблем с экспрессиями

Экспрессии в After Effects представляют собой JavaScript-подобный язык, выполняющий вычисления на этапе рендера композиции. При экспорте через Bodymovin эти выражения не всегда транслируются в эквивалентную логику Lottie JSON. В результате часть поведения теряется, часть упрощается, а часть приводит к некорректному рендерингу или полному игнорированию анимации.

Ключевая проблема заключается в различии сред исполнения: After Effects выполняет выражения в собственной системе композиции, тогда как Lottie Web интерпретирует уже готовое JSON-представление, не имеющее полноценного движка выражений.

Ограничения выполнения экспрессий в Lottie

Большинство ошибок при работе с экспрессиями связано с тем, что Lottie не интерпретирует After Effects expressions напрямую. Вместо этого происходит попытка конвертации значений в статические ключевые кадры или упрощённые зависимости.

Основные ограничения:

  • отсутствует runtime-интерпретатор выражений
  • поддерживаются только вычисленные значения, а не логика
  • динамические обращения к слоям часто теряются
  • time, valueAtTime, comp() и подобные функции не транслируются
  • пользовательские функции полностью игнорируются

Экспрессия, завязанная на временную шкалу композиции, может превратиться в фиксированное значение на момент экспорта. Это создаёт эффект «замороженной логики».

Типовые симптомы проблем

Ошибки, связанные с экспрессиями, проявляются в Lottie Web в виде характерных паттернов:

  • слой отображается, но не реагирует на ожидаемую динамику
  • анимация воспроизводится статично при наличии выражений в AE
  • часть параметров игнорируется (opacity, position, scale)
  • несоответствие между предпросмотром After Effects и веб-версией
  • резкие скачки значений вместо плавных переходов

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

Причины потери логики при экспорте через Bodymovin

Плагин Bodymovin выполняет статический анализ композиции и конвертирует её в JSON. Любая логика, требующая исполнения в реальном времени, либо вычисляется заранее, либо отбрасывается.

Основные причины деградации:

  • выражения зависят от времени композиции
  • обращение к внешним слоям композиции
  • использование эффектов, не поддерживаемых спецификацией Lottie
  • нелинейные вычисления, не сводимые к keyframe-последовательности

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

Анализ JSON как основной метод диагностики

Файл Lottie JSON становится единственным источником истины при отладке. Экспрессии как таковые в нём отсутствуют, поэтому анализируется результат их вычисления.

Ключевые структуры:

  • layers — структура сцены
  • ks — трансформации (position, scale, rotation, opacity)
  • a, p, s, r, o — анимируемые свойства
  • keyframes — дискретные значения во времени

Отсутствие ожидаемых keyframes указывает на то, что выражение не было корректно преобразовано.

Пример проблемного фрагмента:

"p": {
  "a": 0,
  "k": [100, 100]
}

Ожидание динамического поведения при этом не реализуется, поскольку параметр стал статическим.

Использование логирования в Lottie Web

Lottie Web предоставляет базовые механизмы наблюдения за состоянием анимации через события экземпляра.

Ключевые события:

  • loaded_images
  • DOMLoaded
  • complete
  • loopComplete
  • enterFrame

Через обработчики возможно отслеживание момента, когда анимация теряет синхронизацию.

const anim = lottie.loadAnimation({
  container: document.getElementById('anim'),
  renderer: 'svg',
  loop: true,
  autoplay: true,
  path: 'data.json'
});

anim.addEventListener('enterFrame', (e) => {
  console.log(e.currentTime, e.direction);
});

При анализе поведения экспрессий полезно сопоставлять время и изменения параметров, особенно при расхождении с исходной композицией.

Изоляция проблемных слоёв

Одним из методов диагностики является постепенное исключение слоёв с выражениями из композиции.

Подход:

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

Особенно эффективно отключение выражений на:

  • Position
  • Trim Paths
  • Stroke Width
  • Opacity

Если после удаления выражения поведение стабилизируется, проблема локализуется в конкретной логике AE.

Ограничения поддерживаемых выражений

Некоторые выражения частично поддерживаются за счёт предварительного вычисления в момент экспорта:

  • простые арифметические операции
  • линейные зависимости между значениями
  • базовые ссылки на value

Не поддерживаются:

  • wiggle()
  • loopOut()
  • обращения к другим слоям через thisComp.layer
  • любые функции времени (time, posterizeTime)
  • условные конструкции с динамическими зависимостями между слоями

Даже если экспрессия не вызывает ошибок в AE, это не гарантирует её корректную сериализацию в Lottie JSON.

Поведение wiggle и псевдослучайных функций

Функция wiggle() является одной из наиболее проблемных. Она генерирует псевдослучайные колебания во времени, что требует runtime-движка.

После экспорта возможны варианты:

  • превращение в фиксированную кривую
  • генерация ограниченного набора keyframes
  • полная потеря эффекта

В Lottie Web отсутствует механизм воспроизведения псевдослучайности в реальном времени без заранее рассчитанных значений.

Проверка корректности через временную дискретизацию

При анализе подозрительных анимаций используется сравнение значений на разных кадрах.

Методика:

  • фиксирование времени enterFrame
  • сравнение значений трансформаций
  • поиск несоответствий между ожидаемой и фактической траекторией

Если значения остаются неизменными при изменении времени, экспрессия не была конвертирована в анимацию.

Особенности работы с opacity и transform

Параметры трансформации чаще других страдают от потери логики:

  • opacity может становиться константой
  • position превращается в фиксированную точку
  • scale теряет зависимость от времени

Это связано с тем, что Bodymovin оптимизирует композицию, объединяя выражения в статические значения при возможности.

Отладка через упрощение выражений

Сложные выражения необходимо постепенно редуцировать:

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

Пример упрощения:

Исходное выражение:

value + wiggle(2, 20) * Math.sin(time)

Упрощённая форма:

value + 10

Постепенное возвращение логики позволяет выявить точку потери совместимости с Lottie.

Использование консольных инструментов браузера

Lottie Web рендерит анимации через SVG или Canvas, что позволяет использовать стандартные инструменты DevTools:

  • инспекция SVG-дерева
  • анализ атрибутов transform
  • наблюдение за изменениями DOM
  • breakpoints на mutation observer

При SVG-рендерере изменения координат можно отслеживать напрямую через DOM-атрибуты.

Проблемы синхронизации времени

Расхождения между AE и Lottie часто связаны с различием таймингов:

  • AE использует внутренний FPS композиции
  • Lottie зависит от requestAnimationFrame
  • возможны округления времени

Это приводит к:

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

Особенно заметно при сложных выражениях, завязанных на time.

Диагностика через минимальные сцены

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

  • один слой
  • одно свойство
  • одно выражение

Если поведение корректно в минимальной сцене, но ломается в полной композиции, причина заключается в взаимодействии слоёв или конфликте параметров после экспорта.

Влияние оптимизации Bodymovin

Оптимизация при экспорте может изменять структуру данных:

  • объединение keyframes
  • удаление избыточных значений
  • округление чисел
  • конвертация выражений в статические значения

Эти процессы направлены на уменьшение размера JSON, но часто приводят к потере динамики.

Практика анализа расхождений между AE и Lottie

Сравнение поведения выполняется по следующим параметрам:

  • временная шкала
  • значения трансформаций
  • наличие keyframes
  • плавность интерполяции

Любое расхождение указывает на стадию, на которой выражение было утеряно: вычисление, экспорт или рендеринг.

Поведение при частично поддерживаемых выражениях

Некоторые выражения могут работать «частично корректно»:

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

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

Работа с композициями, содержащими зависимости между слоями

Наиболее сложные ошибки возникают при:

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

Такие конструкции не имеют эквивалента в Lottie JSON и почти всегда теряют логику при экспорте.

Стратегия устойчивой разработки анимаций

Для стабильного поведения в Lottie:

  • выражения заменяются keyframes
  • логика времени переводится в дискретные значения
  • межслойные зависимости устраняются
  • динамика задаётся через параметры анимации, а не вычисления

При этом сохраняется предсказуемость рендера в Lottie Web, поскольку отсутствует необходимость интерпретировать runtime-логику After Effects.