Posterize Time

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

Posterize Time (Постеризация времени, Ступенчатое время, Стоп-моушен для бедных, Эффект лагающего говна) — это священный Грааль любого уважающего себя моушен-дизайнера, спасительная соломинка для ленивых аниматоров и главный спонсор эффекта Стиль (Vox) на YouTube. В сухих технических терминах — это эффект или выражение (expression) в программах для композитинга и видеомонтажа (в 1-ю очередь в Adobe After Effects и Adobe Premiere Pro), которое искусственно понижает частоту кадров (FPS) слоя, композиции или отдельного свойства, заставляя плавную 60-кадровую анимацию выглядеть как дерганое, рукотворное, теплое и ламповое инди-кино из 90-х.

Я просто хотел сделать модный винтажный лук, накинул этот эффект на 1-часовое видео, и мой рендер вырос с 10 минут до 2 часов... Я больше никогда не буду это использовать!
Анонимус, познавший боль оптимизации Adobe
posterizeTime(12); value;
— Мантра, которую ньюфаги забывают дописать до конца, получая тонны ошибок

Суть[править]

С незапамятных времен человечество билось за плавность картинки. Олдфаги помнят, как братья Люмьер крутили ручку кинематографа со скоростью 16 кадров в секунду, потом пришел звуковой кинематограф и стандартизировал 24 кадра. Потом появились геймеры-пекари, которые начали орать, что глаз не видит меньше 60 FPS, а потом 144, 240 и 100500 FPS. Казалось бы, прогресс должен был заставить нас делать все анимации идеально плавными, чтобы кривые Безье скользили как по маслу. Но нет. Внезапно выяснилось, что идеальная компьютерная интерполяция выглядит как бездушное пластиковое говно, вызывающее у эстетов приступы тошноты и баттхерта.

И тут на сцену выходит сабж.

Суть эффекта чуть более, чем полностью состоит в том, чтобы взять плавное движение (допустим, 30 кадров в секунду) и заставить программу выкидывать часть кадров, дублируя оставшиеся. Если мы задаем частоту 12 FPS в композиции с 24 FPS, то программа показывает 1-й кадр 2 раза, потом 3-й кадр 2 раза, и так далее. Результат? Картинка начинает стробить, дергаться и выглядит так, будто её анимировал укуренный японский аниматор из студии Ghibli или чувак, перекладывающий кусочки картона под камерой в 1920-м году. Профит!

Как это работает IRL[править]

Есть 2 стула… точнее, 2 основных способа применить эту магию, и каждый имеет свои взаимоисключающие параграфы.

Способ 1: Эффект в панельке[править]

Ты просто берешь эффект Posterize Time из вкладки Time и кидаешь его на слой (или на корректирующий слой — Adjustment Layer). У эффекта ровно 1 (одна) настройка — Frame Rate. Ставишь туда 12, 8, или 6, и идешь пить чай, пока твой процессор Intel Core i9 пытается понять, зачем ты заставляешь его деградировать до уровня калькулятора.

Но тут есть нюансы:

  • Эффект применяется ко всему слою целиком. Если это видео, оно начнет тормозить. Если это шейповая анимация, она тоже начнет тормозить.
  • Ньюфаги часто кидают эффект прямо на картинку, у которой анимирован параметр Position. И внезапно — ни хрена не работает! Почему? Потому что архитектура After Effects обрабатывает трансформации (позицию, масштаб, вращение) ПОСЛЕ наложения эффектов. Чтобы эффект сработал на движение, слой нужно предварительно скомпозить (сделать Pre-compose), или кинуть эффект на Adjustment Layer поверх всего. Ньюфаги рвут волосы на жопе, не понимая, почему их прямоугольник все еще плавно едет по экрану со скоростью 60 FPS.
  • Если кинуть этот эффект на длинное видео, алгоритмы Adobe сойдут с ума, пытаясь пересчитать тайминг каждого пикселя, и время рендера увеличится в 10 раз. Это фейл.

Способ 2: Expressions (Выражения)[править]

Вот тут начинается настоящий матан для красноглазиков. Вместо того чтобы вешать тяжелый эффект на весь слой, тру-моушен-дизайнеры используют код. Ты зажимаешь Alt и кликаешь по часикам (stopwatch) любого параметра (например, Scale), открывая строку для ввода кода. И пишешь туда священные строки.

posterizeTime(12);
value;

Что делает этот код? 1-я строчка говорит движку: Эй, тупая железяка, вычисляй значения этого параметра только 12 раз в секунду. 2-я строчка говорит: А теперь верни мне значение, которое получилось.

Epic Fail номер 1 среди школия: они пишут просто `posterizeTime(12)` и получают ошибку Undefined value used in expression. Движок тупо не понимает, что ему нужно вывести на экран. Команда `posterizeTime` лишь задает частоту вычислений, она не возвращает значение сама по себе! Без `value;` (или без конкретной формулы после) эта функция бесполезна.

Зачем это нужно?[править]

Казалось бы, почему просто не создать композицию с частотой 12 FPS и не анимировать в ней? А вот тут кроется главная хитрость профессии и причина бесконечных споров.

  1. Motion Blur (Смаз движения). Если рендерить проект в 12 FPS, встроенный моушен-блюр будет использовать только эти 12 кадров данных. Смаз получится рваным, убогим и коротким. Но если проект настроен на 24 или 30 FPS, а анимация ограничена эффектом Posterize Time, программа может просчитывать качественный, жирный смаз (если применить его до эффекта), создавая уникальный гибридный вид.
  2. Гибридная частота кадров. Представь, что у тебя есть плавная проходка камеры в 3D (24 FPS), но персонаж или текст в кадре должен выглядеть рукотворным. Если вся композиция будет 12 FPS — камера тоже станет дерганой, что вызовет тошноту у зрителя и приступы эпилепсии. Выход? Камера остается на 24 FPS, а текст обмазывается кодом `posterizeTime(12)`. Мы получаем лучшее из 2 миров: 3D-плавность и 2D-стилизацию.
  3. Стандарты вещания и YouTube. Если залить видео в 12 FPS на трубу, плеер может некорректно его обработать, или перекодировать во что-то страшное (обычно плееры YouTube, Запретграм и TikTok ожидают 23.976, 24, 25, 30 или 60 FPS). Если отдать клиенту файл в 12 FPS, он откроет его на своем MacBook и скажет: Что за лаги, я платил за 60 FPS!. Поэтому видео экспортируется в 24/30 FPS, но визуально выглядит как 12.
  4. Эмуляция аниме (Анимация на двойках и тройках). Традиционные аниматоры часто рисуют 1 новый кадр на каждые 2 кадра кинопленки (это называется on twos, то есть 12 уникальных картинок в секунду при воспроизведении в 24 FPS). Для экшена могут рисовать на 1-цах (24 FPS), для медленных сцен — на 3-ках (8 FPS). Сабж позволяет эмулировать этот процесс автоматически, экономя время кунам, которые хотят сделать свое аниме не выходя из спальни.

Рецепт шедевра в коде[править]

Чтобы сделать тряску как у тру-дизайнеров, ньюфаги лезут в Expression Selector текста или в свойства Position. Классический код, который копипастят все кому не лень:

posterizeTime(6);
wiggle(10, 50);

Что тут происходит? Функция `wiggle` создает хаотичное дрожание со скоростью 10 раз в секунду и амплитудой 50 пикселей. Но благодаря `posterizeTime(6)`, это дрожание обновляется только 6 раз в секунду. Результат — дерганые прыжки вместо плавного плавания. Объект не летает как муха под спидами, а телепортируется из точки в точку, как в покадровой анимации.

Проблемы[править]

Несмотря на всю гениальность, сабж генерирует тонны ненависти и лулзов на форумах техподдержки.

Wiggle Paths и Шейпы[править]

Допустим, ты нарисовал векторный круг и хочешь, чтобы его края дрожали 4 раза в секунду. Ты находишь модификатор Wiggle Paths внутри свойств шейпа. И тут выясняется, что у Wiggle Paths НЕТ встроенной опции понижения частоты кадров! Он всегда анимируется плавно, как сопля на ветру.

Анонимусы плачут: Как убрать плавность (tweening)? Я хочу только 4 кадра в секунду! Решение от олдфагов: нужно выкрутить параметр Wiggles/Second в 0, чтобы остановить встроенную анимацию. А затем применить код к параметру Random Seed:

posterizeTime(4);
time * 100;

Вуаля! Сид меняется со скоростью времени (умноженного на 100 для большего разброса), но только 4 раза в секунду. Края круга дергаются дискретно. ЧСВ моушен-дизайнера летит в небеса.

Дробные частоты кадров[править]

Существует 1 мерзкий баг. Если твой проект настроен на киношную частоту 23.976 FPS (которую используют почти все профессиональные видеографы), эффект Posterize Time иногда сходит с ума. Программа начинает путаться в дробных значениях при округлении, и в анимации появляются так называемые заикания (stutters) или пропущенные кадры. Для синхронизации с покадровыми аниматорами приходится отказываться от сабжа и использовать Time Remapping с Hold-ключевыми кадрами. Это процесс превращения плавной линии в ступеньки вручную. Долго, нудно, зато работает без багов.

Смещение времени на нечетные кадры[править]

Ты настроил композицию на 24 FPS. Применил `posterizeTime(12)`. Программа зафиксирует ключи на четных кадрах: 0, 2, 4, 6, 8… А что, если у тебя 2 слоя, и ты хочешь, чтобы один обновлялся на четных кадрах, а 2-й — на нечетных (1, 3, 5, 7)? Чтобы они мигали в противофазе, создавая сложный ритм? Прямого способа в стандартной функции НЕТ. Функция жестко привязана к началу композиции. Начинаются танцы с бубном. Чуваки пишут мега-сложные экспрешены с использованием `valueAtTime`, пытаясь сдвинуть вычисление на 1 кадр назад или вперед:

var newFramerate = 12; 
var frameOffset = 1; 
var frameRate = 1/thisComp.frameDuration;
var t = (time*frameRate);
var newT = Math.floor((t-frameOffset)/(frameRate/newFramerate));
newT = newT*(frameRate/newFramerate) + frameOffset;
newT /= frameRate;
transform.position.valueAtTime(newT);

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

Конкуренты[править]

Конечно, не только рабы Adobe хотят делать стоп-моушен. Люди из параллельных миров тоже задаются этим вопросом.

DaVinci Resolve и Fusion[править]

В стане цветокорректоров, которые внезапно решили стать моушен-дизайнерами, всё немного иначе. Во Fusion нет кнопки Сделать красиво в 12 фпс. Зато есть мощная математика и модификаторы. Если ты хочешь понизить FPS для конкретного параметра во Fusion, тебе придется писать Lua-экспрешен:

self:GetValue("CtrlID", math.floor(time/x)*x)

Или для узла TimeStretcher: `floor(time/1.33)*1.33`. Те, кто не хочет кодить, используют ноды и настраивают графики (Splines) в режим Step In/Out, превращая гладкую кривую в лесенку.

The Foundry Nuke[править]

В суровом Голливудском композитинге в Nuke всё еще суровее. Чуваки применяют ноду TimeWarp, удаляют с нее дефолтную анимацию и вписывают Tcl-магию:

int(frame/(OLD/NEW))*(OLD/NEW)

Где OLD — это старый FPS (например, 24), а NEW — целевой (например, 12). Формула тупо берет текущий кадр, делит его на 2, получает 1.5, отбрасывает десятые доли с помощью `int()`, получает 1, и умножает обратно на 2. В итоге кадр 3 ссылается на кадр 2. Стоп-моушен готов. Матан правит миром.

Blender 3D[править]

А что делать в бесплатных 3D-пакетах? В Blender есть модификатор кривых анимации (F-Curve Modifier), который называется Stepped Interpolation (Ступенчатая интерполяция). Ты просто выделяешь свои ключевые кадры, накидываешь модификатор Stepped, и указываешь размер шага (Step Size) равным 2 кадрам. Особо продвинутые блендеристы вешают этот модификатор на кости персонажа. В итоге персонаж двигается как пластилиновый, при этом камера может облетать его с абсолютно плавной скоростью в 60 FPS. Полный контроль и 0 написанного кода. Шах и мат, Adobe.

Продвинутые техники[править]

Давай разберем типичный проект SaaS-рекламы (реклама софта и стартапов), которая пытается выглядеть на миллион долларов. Заказчик хочет, чтобы интерфейс приложения скроллился супер-плавно на 60 FPS (чтобы показать, как их софт не лагает), но графические элементы, иконки и плашки должны вылетать с модным эффектом гибридного стоп-моушена (Premium Hybrid Look).

Анонимус на Reddit задает резонный вопрос: Как совместить высокоскоростной Time Remapping (резкие ускорения и замедления) с низким FPS (12/24), чтобы это не выглядело как лагающий кусок мусора? Если просто кинуть Posterize Time на быстро движущийся объект, он будет мерцать в глазах зрителя из-за эффекта стробоскопа (Saccadic Masking). Расстояние между позициями объекта на соседних кадрах становится слишком большим. Мозг зрителя не может соединить 2 точки в 1 движение.

Решение от гуру:

  1. Оставить интерфейс на 60 FPS.
  2. Главные объекты анимировать с ускорением, а затем накинуть эффект Wide Time (Широкое время) или Echo (Эхо).
  3. Эффект Echo будет смешивать несколько предыдущих кадров вместе.
  4. Поверх этого кинуть Posterize Time на 12 FPS.
  5. И сверху добавить Roughen Edges или Displacement Map с нулевым значением плавной эволюции, чтобы смешать края клонов от эха.

Результат? Быстро движущийся объект оставляет за собой красивый, размазанный, отсканированный шлейф, который обновляется 12 раз в секунду. Это выглядит дорого, крафтово и вызывает зависть у коллег по цеху. Главное — не переборщить, иначе компьютер взорвется при рендере эффекта Echo.

Как создать Lottie/JSON анимацию с низким FPS[править]

Сегодня половина анимаций в вебе и приложениях выводится через Bodymovin в формат JSON (Lottie-анимации). Это сверхлегкие векторные файлы, которые рендерятся прямо в браузере. И тут возникает огромный болт: веб-плеер Lottie часто игнорирует твой Posterize Time, наложенный в композиции. Он видит ключи анимации и тупо сглаживает их обратно в 60 FPS на устройствах Apple! Ты старался, делал крафт, а на Айфоне оно плывет как сопля.

Как бороться с этой ересью?

  • Способ 1 (Костыльный): На каждый анимированный параметр (Scale, Position) вешаем наш любимый экспрешен: `posterizeTime(12); value;`. А при экспорте в Bodymovin ставим галочку Convert expressions to keyframes. Плагин просчитает каждый кадр и намертво запечет (bake) ступенчатую анимацию в сотни Hold-ключей. Файл станет весить больше, зато ни 1 браузер не посмеет интерполировать это движение.
  • Способ 2 (Для прогеров): В самом коде сайта, при инициализации плеера Lottie, нужно вызвать функцию `anim.setSubframe(false);`. Это заставит плеер перестать вычислять промежуточные суб-кадры и округлять всё до жестких целых значений. Но попробуй объяснить это фронтенд-разработчику, который хочет просто вставить див и пойти пить смузи.

Подводные камни[править]

Иногда After Effects ведет себя как капризная шлюха. Ты пишешь экспрешен на параметр Position у статичной картинки, и… ничего не происходит! Анонимус нашел гениальный по своей тупости костыль. Если ты просто напишешь: `posterizeTime(12);` — оно выдаст ошибку. Если ты добавишь `value;`, оно сработает, но статичная картинка не начнет дергаться сама по себе. Ей нужно движение! И тут Nack88 применяет запрещенное заклинание:

posterizeTime(12);
wiggle(0, 0);

Казалось бы, `wiggle(0,0)` — это команда трясись с нулевой скоростью и нулевой амплитудой, то есть не делай ничего. Но сам факт наличия функции `wiggle` заставляет движок AE разбудить слой и применить к нему дискретизацию времени. Магия говнокода во всей красе.

Еще 1 проблема — плагины от сторонних разработчиков. Например, пак плагинов BCC (Boris Continuum Complete) имеет свой собственный эффект BCC Posterize Time. Зачем он нужен, если есть встроенный? А затем, что в нем есть куча встроенных костылей, которые в AE нужно собирать руками: смешивание с оригиналом (Time Mix), режимы наложения (Apply Mode) и маскирование через встроенный PixelChooser. Стоит он как чугунный мост, грузит систему как майнер, но позволяет сделать эффект в 1 клик. Быдлокодеры ликуют.

Blacklines.JPG Абсолуте кинографе
ЖанрыIn 5 SecondsАртхаусЗомби-трэшИндийское киноКосмическая операМашинимаНемое киноПерестроечное киноПронРоссийское киноСоветское киноФильмы восьмидесятыхЭротическое киноСтереокиноУжастикиФильмКинемацографАктёрТрёхмерное отслеживаниеРоссийский кинематографРусский сериалLucasfilmSeachtАльваро КалметНи один X не пострадалГенри Кэвилл1rus.ruДжонни ДеппАфроэльфыЭльдар РязановДжулия РобертсЧулпан ХаматоваАндрей ДворниковГолос собеседника слышен на расстоянииSoulСериалТрагедияГюльчатайТавиват ВантхаKerobtvKinoprofiСталкер ТарковскогоТрейлерSmear frameМаколей КалкинPosterize Time
Термины25-й кадрCatch phraseOne-linerProduct placementVHSВидеоформатыГоблинский переводИмя, сестраКиноляпКиноштампКлюкваМерлезонский балетОригинальная звуковая дорожкаСпойлерФандабФэнсаб (русский) • ХромакейХеппи-эндЭкранка/©ИзбранныйСаспенсДрамаПопкорнЗвезда смертиРелиз-группаКинорежиссёрКиноПереименование фильмовСкит УльрихКрасный ПлащЗагонкаRed Head SoundБлэквошингСтиль миллениаловРаша ГудбайTape OperatorБрэд ПиттНейрослоникСпираль ЛжиЧёрный ГерцогЛэнс РеддикРичард ДженкинсМартин ФордКиносферумМультивселенная MarvelЖелезное СердцеЭпоха VHSAbsolute CinemaСвинарка и пастухСита ПуапимолПуангСтивен СпилбергПровалы российского киноФантомас разбушевался
Люди кинематографаГоблинБаркерБасковаБоллВолодарскийВудКэмеронЛинчМассовщикМихалковНоланТарантиноСуперменВуди АлленМаксим ЩенёвДеймон ГамоЖак Ив КустоВалерия ДмитриеваДмитрий КрасиловРузиль Рамилевич МинекаевНиколай ЕрёминГеоргий ДаниловНикита ХоровитцСергей СоловьёвАндрей ТарковскийВиктор МурзиковАльянс Вольных ПереводчиковДжим КерриДжордж РомероВладимир КобринДоктор СатанаКульт Древних (Пустота)Revolution Team FilmsТимоти ШаламеГеоргий ВицинЮрий НикулинЕвгений МоргуновАлександр ДемьяненкоСавелий КрамаровЛеонид КуравлёвВячеслав ТихоновОлег ЯнковскийАндрей МироновАнна СамохинаАлександра ЗахароваВалентин ГафтАнатолий ПапановАлександр ПетровАркадий РайкинЛимит StudioНарит Ювабун
КритикаBadComedianNostalgia CriticTerlKabotВредное киноRU.VIDEOКино-Говно.комКинопоискКлим ЖуковКнига лучшеКонец немного предсказуемКлуб интеллектуального киноРояль в кустахТаганайРейРайан ГудманКиноЦензорДеградация ГолливудаЭндрю ЛинкольнЦензура чего-то в фильмахЗахват движенияКласс 1984Чужой районСтрашная воля боговLostfilmFanserialsColdfilmФильм, снятый на смартфонTurkruПрощай, Сара ДжейнTVOЁ
КинокомпанииPrivateThe AsylumГолливудНОМПрокатчикиXadafilmsNetflixВсетамКостафильмТи ЙодАлексей МакаровКнига бессмысленногоEgg CeteraPicture Production StudioДоля секундыТарифы МихалковаШколофильмСергей АрушановВыход фильма Назад в будущее 4LordfilmШёпот Смерти 3Лошади бежали в космосе по борту звёздного разрушителяПаромщикЧёрный Шак (Заклятие)Самурай (Заклятие)Джон БландДевушка-призракBan Phi PopОскарСлоу-моТрамп как актёр и ведущий
ЭпическоеРоссийские сериалы про ментовШерлок в РоссииКонцовка Игры престоловПоследний сезон Ходячих мертвецовБарби и ОппенгеймерТот, кто не дышитДиафильмНейросети и актёрыВыпускайте кракенаДиалог Трумэна и ОппенгеймераЗа себя и за СашкуКодекс ХейсаУльяна Андреевна БуншаИван Васильевич БуншаАнтон Семёнович ШпакЖорж МилославскийАскольд ТутылопидирскийАдаптация от NetflixСтолб ИванычаМистер Бабадук (Книга) • Постапокалиптическое поселениеВедьма из БлэрМаска АнонимусаДжон КонстантинТарантино и фут-фетишАгент СмитПерси ДжексонСравнение персонажей Чёрной лагуны и Закрытой школыОн снова здесьFlarrow FilmsКриминальное чтивоПрикроватный киберпанкБалка ИллиЧелюсти 19Крапива (2016)Харли КвиннТесса ТомпсонДольф ЛундгренТы должен был бороться со злом, а не примкнуть к немуСаурон и КелебримборСаурон выступает перед оркамиРемастер ХоббитаМачете не XПилотная серия = последняя серияБезымянный обзор «Механика коз»Ведро (веб-сериал)Конференция (фильм)Ирпенский кинофестивальКрапива: Цветок Смерти
МетаФильмыСериалыАктёры