Теории-теории-теории, бла-бла-бла... И правда, давайте уже смотреть, что происходит на практике!
В прошлой статье я разделил трекинг на типы, виды, категории, группы и прочее. Это помогает лучше осознать трекинг в теории, а вот на практике чуть реже, чем всегда, мы имеем дело с комбинацией подходов. Если во время работы и возникает вопрос, какой трекинг нужен, то, как правило, речь идет о пространстве, в котором будет восстанавливаться движение объекта, и все сводится к 2½ вариантам:
- 2D-трекинг — когда в результате мы должны получить точку (или набор точек), движущихся в двумерном пространстве кадра (двумерной системе координат);
- 3D-трекинг — если речь идет о восстановлении движения объекта в трех измерениях в пространстве виртуальной сцены;
- трекинг поверхности — в тех случаях, когда приходится восстанавливать движение набора точек, лежащих на одной поверхности как в 2, так и в 3 измерениях.
Другими словами, вопрос ставится относительно результата, а не технологий, использованием которых он будет достигнут — в таком ключе понимать типы трекинга на практике будем и мы (если не оговорено иное).
Чем тречить
У разных приложений есть разные средства трекинга в той или иной степени подходящие под те или иные задачи. Здесь я сначала было хотел чуть более подробно остановиться на инструментах трекинга в разных приложениях, но получается слишком много теории (опять!!1). Так что просто перечислю софт и инструменты, а какие и для чего — будем уже смотреть на примерах.
Оговорюсь только, что это никакой не «топ-х» и не «исчерпывающий список», а просто те, которые я использую чаще всего для своих задач. Если вы владеете каким-то аналогом, отлично (а более мощным — совсем прекрасно)! Приемы работы будут в целом совпадать, а вы уже реализуйте их чем удобно.
- Adobe After Effects: Tracker, 3D Camera Tracker, плагин Mocha for AE, плагин Lockdown.
- Blender: набор инструментов Motion Tracking (мощный и разносторонний).
- Blackmagic Fusion: Tracker, Camera Tracker, Planar Tracker.
Что будем тречить?
Возьмём реальную задачу. В прошлом году в составе команды Madlight VFx я принимал участие в работе над фильмом Discovery «Как производятся полимеры в России»:
В частности моей задачей была работа над завершающими кадрами фильма, которые после всех манипуляций выглядели следующим образом (в фильме их можно увидеть с 20-й минуты):
Но это уже результат, а вот исходные материалы представляли собой несколько иное зрелище:
В отснятом видео нужно было разместить виртуальные объекты, а заодно удалить все маркеры из сцены и исправить линию стыка циклорамы с полом. В основе решения всех этих задач лежит как раз трекинг, и в совокупности они очень наглядно иллюстрируют основные подходы к этому процессу.
Процесс: подготовка
1. Анализ исходных материалов
Прежде, чем окунуться непосредственно в технический процесс, нужно, исходя из брифа, предельно ясно представить себе состав задач, которые стоят перед вами в каждом отдельном плане, и способы их решения.
Наша сцена состоит из 13 разных планов (или шотов — от англ. “shot”), которые сняты в одном пространстве с одними декорациями и освещением:
01. Здесь необходим 3D-трекинг, поскольку расстояние от камеры до виртуальных объектов меняется и, соответственно, будет меняться их визуальная проекция. Однако, есть сложность: ближе к концу плана у нас полностью пропадают маркеры на столе (остаётся только задняя плоскость) — это может создать проблемы с трекингом на данном участке видео.
02. Здесь есть проблемы для трекинга: надежно зацепиться здесь можно только за два видимых маркера и попробовать использовать неподвижно лежащий на столе планшет. Других надёжных источников информации о положении объектов в пространстве в этом кадре нет.
03. Потенциально не представляет серьезных проблем, так как маркеры видны хорошо, в достаточном количестве и в разных плоскостях.
04. По сложности ориентирования в пространстве сопоставим со 2-м, но здесь есть существенное отличие: исходя из расположения объектов в сцене, в этом плане, скорее всего, в кадр попадет только стеллаж у стены, который с учётом длительности плана и характера движения камеры вполне может быть размещен как плоское изображение. То есть, для работы вполне может хватить обычного 2D-трекинга.
05. Полностью аналогичен 3-му плану.
06. Здесь та же история, что и в 4-м, только ракурс несколько изменился (видно по маркерам) и фоновое изображение нужно будет перерендерить с учётом этого изменения.
07. Все почти также, как и с 3, 5, но есть нюанс: в конце плана все маркеры на столе и объекты (планшет, бутылка) почти уходят за кромку кадра — это может создать сложности с трекингом.
В планах 08 и 09 в соответствии с задачей и схемой расстановки объектов, ничего из виртуальных предметов в кадр не попадает.
10. Этот план по крупности близок 3, 5 и 7, но, в отличие от них, стол в кадре полностью скрыт, так что выполнить можно только 2D-трекинг (на основе маркеров на стене). Так как крупность кадра не меняется, это нас полностью устраивает.
11. Здесь маркеры попадают в кадр, но трекинг нужен только для клин-апа (clean-up — удаление нежелательных объектов из кадра), простой 2D-трекинг для этого случая годится.
13. Последний, самый длинный план. Несмотря на то, что видимые объекты здесь остались только на фоне «у стены», для большей точности передачи изменения их проекции при отъезде (смене ракурса) 3D-трекинг здесь нужен. Его особенность в том, что в первой части шота у нас есть маркеры только на одной плоскости.
Что ж, это было слегка утомительно, но такой анализ необходим, чтобы понимать состав предстоящих задач и иметь возможность набросать план предстоящих работ. Что-то, конечно, может поменяться или уточниться в процессе решения задачи, но глобально... у нас есть понимание задачи!
2. Планирование работ
Поскольку сцена одна и никак не меняется (за исключением видимости разного набора объектов между планами), логичнее всего выполнить 3D-трекинг всех камер и совместить их в одной сцене, а для сцен с 2D-трекингом подобрать подходящие ракурсы и высчитать статичные фоны из на основе сцены.
С 3D-трекингом здесь вполне справится Blender, а 2D-трекинг, поскольку композ будет осуществляться в After Effects, в нем же и сделаем.
Вообще, звучит как план.
3. Подготовка материала
Исходники были переданы в виде склеенного мастер-файла («колбасы»), который следует нарезать на отдельные планы — зачастую рекомендуется высчитывать в png-, exr- или даже jpeg-секвенции (пронумерованные последовательности файлов изображений, где каждая картинка — один кадр видео), но так как и Blender, и After Effects хорошо работают с .mov, кодированным ProRes, я буду использовать этот формат для экономии дискового пространства и упрощения работы с файлами.
Еще обычно в процесс подготовки должен входить этап устранения оптических искажений изображений (lens undistorting), но в данном случае он невелик, так что этими искажениями можно пренебречь (у нас и без того статья большой получается — оставим для следующего раза). Также для более комфортной работы я выполнил базовую цветокоррекцию всего материала, чтобы добиться высокого контраста на тех участках изображения, где расположены маркеры (скриншоты выше сделаны уже после этой коррекции) — тут главное не создать попутно каких-либо артефактов или шума на изображении, которые будут мешать в дальнейшем. Теперь можно непосредственно заняться трекингом!
Процесс: трекинг
Я не буду делать подробного механического урока трекинга ни в Blender, ни в After Effects — их полно в сети, я буду останавливаться на решениях, которые приходится принимать в процессе: как именно я использовал элементы инструментария и почему.
Итак, планы за номером 1, 2, 3, 5, 7 и 13 у нас подлежат 3D-трекингу, а 4, 6, 10 и 11 — 2D-трекингу. Погнали!
1. 3D-трекинг
Я часто предпочитаю трекинг в Blender по причине возможности детально контролировать процесс. В то время как большинство остальных программ расставляют точки трекинга автоматически, или используют трекинг целых областей изображения, здесь можно каждую точку поставить вручную и обеспечить ее точный трекинг на протяжении всего диапазона присутствия ее в кадре. Таким образом, вместо того, чтобы надеяться на то, что сотни авто-определенных точек дадут корректный трек с той или иной вероятностью, я предпочитаю сделать чуть больше ручной работы, но получить гарантированный результат.
Справедливости ради стоит сказать, что ручная работа и в других приложениях позволяет уточнить результат за счет вычистки некорректных точек, но мне больше импонирует подход сразу делать нормально, чем потом чистить — и так, и так тратится время, лучше я буду его тратить на «делать правильно» вместо «вычищать дерьмо».
Также стоит отметить, что и Blender может сам автоматически расставить точки трекинга, но и в эту лотерею я предпочитаю не играть — что, конечно же, не означает, что всем следует поступать также.
Для удачного воссоздания сцены трекером Blender'а нужно иметь минимум 8 общих точек в двух разных кадрах видео, которые алгоритм сможет сопоставить и понять их относительное расположение в пространстве (и определить параметры камеры, если нужно). После этого он «смотрит» их перемещения в остальных кадрах и восстанавливает движение камеры — для этого, строго говоря, все 8 точек не обязательны, но крайне желательны.
Вообще, если можно сделать больше точек, лучше больше. Но также не стоит сильно увлекаться: мой опыт говорит, что >15 одновременно оттреченных точек не дают заметного повышения точности трекинга, а если на одном участке будет встречаться 20+ точек, то точность может даже начать падать (это связано с тем, что так или иначе каждая точка содержит некоторую неточность трекинга, и большое количество дополнительных точек начинают не столько помогать уточнять позицию камеры в пространстве, сколько добавлять отклонения).
Здесь нельзя не упомянуть что эти 8-15 точек по возможности должны располагаться в разных плоскостях, на разном расстоянии от камеры и разных частях кадра — об этом и многих других «правилах трекинга» мы поговорим в 3-й статье цикла про трекинг.
Для первого плана хватило 10 точек, 3 из которых я расположил на задней стене, 6 — на столе и одну зацепил за горлышко бутылки как единственную неподвижную точку вне плоскостей стены и стола. Маркеры на полу не задействованы, так как с одной стороны они параллельны плоскости стола, а с другой — мало живут в кадре.
Для горлышка и смартфона периодически приходилось корректировать трекинг вручную, остальные же маркеры были распознаны нормально. Небольшой лайфхак: если Blender в каком-то кадре перестает тречить маркер, прежде, чем вручную выставлять там позицию, попробуйте просто в предыдущем кадре слегка изменить масштаб маркера или области его поиска — очень часто этого достаточно, чтобы автоматический трекинг продолжился на сколько-то еще кадров вперед.
В результате получаем трекинг с погрешностью 0,3 px — во многих уроках любят говорить, что нужно стремиться к значению 0,2 и меньше, но при ошибке меньше 1 пиксела, я рекомендую сначала просто сделать тест, разместив несколько объектов в кадре, и посмотреть, действительно ли эта ошибка заметна и стоит того, чтобы тратить еще время на уточнение результата — повторю тезис из предыдущей статьи: нам не нужен идеальный результат, “good enough” — вполне достаточно. В данном случае 0,3 — это «достаточно хорошо» и можно двигаться дальше.
3 и 5 планы тречились аналогичным образом, а вот 7-й доставил проблем и вынудил прибегнуть к созданию неточных маркеров.
Во-первых, все маркеры на столе ушли за нижнюю границу кадра (1), поэтому пришлось создать гарантированно неточный маркер на стыке стола и кресла (2) — эта точка находится в центральной части кадра, поэтому ее перспективное смещение не будет слишком сильным (хотя, и будет, потому что это не точка строго на краю стола), а также цепляться за складки кожи на кресле (3) — повезло, что в этом плане актриса не двигала предмет мебели, а также Blender на удивление хорошо зацепился за эти еле-заметные детали. В результате получился трек с ошибкой 0,57 px — и в данном случае такой результат также оказался “good enough”.
И самый яркий представитель подхода «и так сойдет» — 13-й план. Его отличительная особенность, как уже упоминалось выше, заключается в том, что примерно половину плана у нас есть возможность работать только с одной плоскостью (задняя стена), и я предположил, что вторую часть плана можно оттречить в 3D, а первую — 2D. Поскольку объекты в кадре здесь должны стоять только у стены, можно сделать рендер анимации во второй части плана, а для первой — просто взять стоп-кадр и его притречить к видео. Таков был план.
Реальность же оказалась приятнее: весь фрагмент, где оставался хотя бы один маркер на полу, оттречился нормально, а первая часть восстанавливалась только по маркерам на плоскости — но так как вторая часть шота позволила восстановить размещение всех маркеров в пространстве, трекинг стены в первой части также получился удовлетворительным — на тесте видно, что вначале плана близкие к камере объекты «гуляют», но объекты у стены все время смотрятся «на своем месте». Из-за погрешностей в трекинге маркеров вначале камера как будто слегка вихляет, вращаясь вокруг дальней стены, но визуально для объектов в зоне этой самой стены, это не является проблемой.
Если бы на переднем плане у нас также оставались объекты, такой трекинг был бы проблемой и неизбежно пришлось бы прибегать к 2D-трекингу и интерполировать его результаты на объекты на разной глубине (или пытаться добиться идеального трека маркеров — опять же, все бы зависело от сцены), но в данном случае задачу можно считать решенной.
Самым проблематичным в итоге оказался 2-й план — это крупный план, который, к тому же, не статичный, а снят с движущейся камеры. Его трекинг (здесь, правда, больше подойдет термин match-moving) был выполнен вручную «на глазок».
Чтобы воссоздать остальные ракурсы (да и в принципе подготовить 3D-сцену к работе), все камеры нужно было объединить в одном прстранстве. В Blender'е нет специального инструмента, который позволил бы автоматически разместить несколько разных оттреченных камер в одном пространстве, поэтому действуем вручную: для каждой камеры в 3D-пространстве воссоздается свой набор маркеров и затем друг за другом камеры по этим маркерам выравниваются (чтобы маркеры одной камеры совпадали с маркерами другой — идеально они вряд ли совпадут, но очень высокой точности соответствия добиться можно) — получается общая сцена.
Затем, пользуясь возможностью посмотреть на одну и ту же сцену с разных точек и используя видео, которое получилось с этой точки, можно воссоздать дополнительные детали, вроде крышки стола (ее контур сильно помог для 2-го плана), дополнительных потребовавшихся маркеров и других вспомогательных объектов.
Последним шагом стало добавление новых камер в сцену для оставшихся планов — и выравнивание их в общем пространстве: используя видео разных шотов, нужно просто разместить камеры так, чтобы маркеры и другие объекты на видео совпали с соответсвующими маркерами и объектами в 3D-сцене. Для 2-го плана это размещение пришлось еще и анимировать — это не сложно само по себе, но требует времени и терпения на аккуратность и точность. Для 4, 6, 10 и 11 потребовались обычные статичные камеры, потому что match-moving там будет достигнут за счет 2D-трекинга.
2. 2D-трекинг
Здесь не так много, чего интересного можно сказать — процесс в данном случае получился достаточно прямолинейный: ставишь трек-точку на маркер и смотришь, как After Effects вычисляет его перемещение, при необходимости корректируешь.
По возможности я использовал трекинг двух точек, чтобы захватить не только перемещение, но и о вращение/масштабирование задника относительно кадра. В двух планах это получилось, в двух других острой необходимости в этом не было, да и видимые маркеры были расположены слишком близко друг-к-другу, так что погрешность при трекинге давала сильные искажения результата — наклон камеры было проще восстановить вручную, даром что здесь он был малозначителен.
Дальнейшая работа с роликом
После всех процедур создается 3D-сцена со всеми объектами и камерами.
С каждой из камеры она визуализируется и композится. Также камеры и маркеры экспортируются в After Effects — они используются для облегчения clean-up'а: заплатки и маски для них создаются на 3D-слоях, что снимает необходимость следить за их смещением на протяжении плана. Там, где был выполнен только 2D-трекинг, соответственно, элементы клинапа просто привязываются к имеющимся трекам.
И композитинг, и клинап даже такого, не самого сложного, материала — очень обширные темы, к которым лучше вернуться в рамках отдельных статей, а пока что всё. Если у вас остались вопросы, появились замечания или предложения, пишите в комментариях — прочитаю, учту, отреагирую. Всего хорошего!