Личный проект-долгострой. Глава 1
Если хочешь сделать что-то хорошо, сделай это сам
Фердинанд Порше.
Это статья о моём личном кинофильме, с подробными пояснениями, куда мне пришлось прийти по независящим от меня причинам, с техническими подробностями из мира неадекватной 3D-графики, и планами на будущее. Пожалуй, я начну.
Ниже возможен NSFW-текст (но я обойдусь без графики).
Часть 1. Краткое введение
Здесь переплетается современная компьютерная графика и любовь к кормёжке больших змей. Я собрался нарисовать кормёжку питона так, чтобы забыть это было невозможно даже при большом желании. И одновременно выучить как можно большее количество 3D-приложений. Мне очевидно, что освоить полностью даже один серьёзный графический пакет меньше чем за пару-тройку жизней не удастся, поэтому я просто взял основные программы с заметным потенциалом, и выкинул из процесса обучения то, что явно не надо. По программному обеспечению мой список недлинный:
От Autodesk — 3dsMax и Maya.
От Adobe — ну конечно же, Photoshop.
Pixologic Zbrush.
Каждую из программ я несколько лет изучал, отмечал полезные фишки. Запоминал найденное, позже записывал текстом в файлик. Файлик с текстом, даже очевидным — мегаполезная вещь, к примеру, найденная багофича без записывания забывается напрочь уже на следующий день. Но для начала надо пояснить, почему задача из простой змейки разрослась до монстра, с которым мне самому сложно справляться.
Есть на свете большие змеи. Иероглифовый горный питон в одной части суши, в африканской саванне, и зелёная анаконда в в джунглях Южной Америки. И так произошло, что в мозге человека с рождения есть структуры, которые заставляют его бояться змей, независимо от размера. Страх в сочетании с природной фантазией привёл к мифам о змеях, которые охотятся на людей с целью их, грубо говоря, сожрать. Есть такие сообщества, которые в арте добавляют к агрессивным змеям-людоедам сексуальный контекст.
Здесь надо уточнить, что само по себе это направление арта неагрессивное, более того, здесь не ценят и всячески избегают действительно агрессивных и NSFW-тем, которые с лёгкостью можно вывести из самого факта змеекартинок. Если я не ошибаюсь, такое направление называется «ванильным».
Для себя я вывел коротенький белый список тем, за который не выхожу. В итоге получается технически выхолощенное нейтрально-скучное повествование (по сравнению с специально усиленной по заветам Диснея анимацией), которое только и можно реализовать, имея в распоряжении одну рабочую станцию (которая на самом деле ноутбук, но это тайна).
Но когда в сцене появляются большие змеи, которые едят красивых девушек, рабочий процесс становится в разы сложнее.
Когда-то я начинал в солидном графическом пакете со змейками на входном баннере. Это был 2010 год. Смоделив анаконду и наложив черновые текстуры, я попытался сделать ей сплайновый скелет. И ничего не вышло. Сейчас, оглядываясь назад, и открывая ту же самую программу, с до сих пор не реализованной ключевой для меня функцией, я понимаю, что кроме как на 3D-моделирование, она ни на что не способна, и, в общем, начал я там зря. Пришлось перейти на Maya.
Maya меня поначалу не обрадовала. Это теперь понятно, что ранние версии — только для профессионалов, с глюками и официально не реализованными функциями типа скелета HumanIK, с тяжелейшей настройкой, которая ещё и требует сакральных знаний, которые в 2012 году даже на английском языке были скудны.
Каюсь, где-то в апреле этого года я решил, что моих сил бороться с моей же моделью анимированной змеи больше нет, струсил, и переключил усилия на соседнюю тему, а готовиться к рендеру стал уже в Unreal 4. И довёл бы тему до логического конца, но помешал ноутбук. Он сгорел прямо во время рендера последовательности кадров. Это был не черновик, а самый настоящий финал.
Я достал старую машину 2012 года, вытащил жёсткий диск из остатков нового компьютера и сунул в старый. И установил аналогичные программы. Лишился всего, что связано с искусственным интеллектом и нейросетями (видеокарта там 600-й начальной мобильной серии).
Часть 2. Настоящее время
Очевидно, что фильм начинается с литературного сценария. Нет, конечно же, в реальности он начинается, когда готов логлайн, потом синопсис, поэпизодный план, потом литературный сценарий, потом ещё режиссёрский, но я так не могу. Эти бумаги предназначены для полнометражных фильмов и сериалов, в которых действует необходимый минимум персонажей. Три человека (можно немного больше). В моём случае человек (девушка) одна.
Это значит, что если не использовать технические хитрости вроде закадрового голоса, отсутствующих телом на съёмочной площадке персонажей (телефонных), то придётся обойтись без диалогов.
Причина номер два — это персонажная анимация. Так получилось, что нужную мне анимацию человека делать легко, и я её сделал за два дня. Здесь нет ничего, кроме перекатывания связанного тела в попытках снять верёвки. Я обещал текстовой NSFW, это БДСМ, а конкретно шибари — связывание. Связанное тело удобно заглатывать питону.
Но если бы я замахнулся на продолжительность хотя бы сериала (40 минут без рекламы, один раз), мне бы пришлось искать средства для обычной классической анимации, начиная с ходьбы. Спасибо авторам программы «Cascadeur» за подаренную надежду сделать ходьбу без MotionCapture. Сегодня на это нет никаких шансов.
Модель сетчатого питона со скелетом
У меня есть грамотная модель сетчатого питона с настроенным скелетом. Имея гуманитарный склад ума, уважая Киплинга, и понимая, что без разницы, какое имя, питона я назвал Kaa.
(Клыки у него, которые складываются — от коброгадюки Сета. Был такой персонаж когда-то давно).
Фишку, которая позволила мне обойти глючный майский инструмент SplineIK, я утаю. Ещё бы, сколько лет потрачено, чтобы отыскать её совершенно случайно в старой англоязычной ветке форума. Добавлю лишь, что результат выглядит идеальным. Змея не проскальзывает, и не вращается вокруг собственной оси.
Текстуры я рисовал не классическим способом, это не «открыл Photoshop утром, а вечером готовый результат», и даже не рисование по 3D-модели. Это долгая работа, несколько месяцев я добавлял детали и замазывал швы, есть комплект PBR-карт (за исключением очевидной Metallic), а открыть модель полностью в 3D-рисовалке нельзя, потому что текстура на теле питона нарисованная от начала до конца, и на представление её как геометрии памяти не хватает. Сейчас я могу только вспомнить, что изначально была грубая тяжёлая чешуя в виде геометрии, а спустя год доработок и замазывания она стала чем-то отдалённо близким к требуемой.
Альбедо кожи питона в пространстве цвета ACES.
ACES — это Система Кодирования Академического Цвета. Создана в 2014 году, чтобы обеспечить сохранность готового киноматериала навечно. Ценный материал сохраняется в цветовом пространстве ACES 2065–1, с нефизически реализованными первичными цветовыми точками (Primaries). Точки покрывают всю подкову цветов CIE, при этом солидная часть треугольника отрицательная. Это значит, что покрыты все физически возможные для глаза человека цвета, и очень много невозможных. Архив же. При нужде надо будет просто взять исходный материал в пространстве ACES 2065–1, и перекодировать его под нужный дисплей преобразованием, которого ещё нет. Исходник продолжит храниться дальше.
Для рендера до композа используется ACEScg. Его малый цветовой диапазон компенсируется меньшим числом глюков.
С ACES и системой управления цветом OCIO у меня не всё просто. Пару недель назад я нашёл замечательный сайт-учебник, где английским по чёрному написано, как управлять цветом. Переводчик помог разобраться, потому смотрите: Maya поддерживает систему управления цветом OCIO. В этом пакете есть LUT-таблицы и файл конфигурации, чтобы её настроить.
Реализация OCIO для Win/Maya построена на LUT-таблицах, а в самой Maya есть правила для распознавания типа текстуры. Правило опирается на суффикс в имени файла, и если, допустим, текстура Albedo, то целевым входным преобразованием для неё будет Utility — Texture — sRGB. Когда Mayа видит, что в имени текстуры указана эта строка, она назначает преобразование автоматически, при любых изменениях текстуры оно будет сохранено. Чтобы окончательно было понятно, что не стоит слепо доверять даже авторам Maya: вариант «linear» в списке входных преобразований — это не цветовое пространство, как написано. Это sRGB с линейной передаточной функцией.
(Что такое «линейная передаточная функция», мне представляется достаточно туманно, но пускай будет так).
Текстуры импортируются с правилом «Utility — Texture — sRGB» для исходников Albedo из готовых библиотек и Интернета, с правилом «Utility — Texture — Linear», если текстура никогда не сохранялась как sRGB (это портит цвет), и с правилом «Utility — Raw», если численные значения цвета важны, а обрабатывать цвет нельзя, для Normal, Roughness, и всех технических карт.
Для создания скелета девушки (Евы) я использовал Advanced Skeleton. Я пришёл к выводу, что, имея задание сделать главного положительного персонажа, и к тому же привлекательного, надо иметь на руках модель с грамотной, сделанной вручную топологией. И у меня есть такая модель, но для 3dsMax и на Biped. Я поставил модель в позу по умолчанию, каюсь, не с первой попытки. Advanced Skeleton работает хорошо, когда модель в симметричной Т-позе. Из-за того, что я никак не ожидал подлянки в виде несимметричной по умолчанию 3D-модели, пришлось накладывать скелет со второй попытки. Я позволил плагину создать скелет тела без лица.
Лицо, в моём случае, нужно для первых четырёх-пяти кадров из планируемых сорока пяти, или в пересчёте на время, первую минуту из восьми. Девушку надо сожрать питоном, её красивая причёска мешает, её просто не должно быть. И это при том, что волосы — одна из самых трудных задач (помните же, у меня ноутбук вместо рабочей станции).
Я не уверен, нужны ли здесь прелести в красивом нижнем белье, так что, на всякий случай, их просто не показываю ;).
Нижнее бельё я нарисовал в Photoshop, используя как референс эту фотографию:
Получилось что-то вроде этой обрезанной карты Альбедо:
Красивую кружевную кайму пришлось отрезать полностью, её некуда накладывать. На оригинальной модели нет такой геометрии.
Декорациями для сцены я решил сделать собственноручно снятые фотографии комнаты. Снимал я их на сверхбюджетный зеркальный фотоаппарат Nikon D5300 с китовым объективом AF-S Nikkor 18–105 миллиметров, причём не просто так, а с расчётом на фотограмметрию.
По неподтверждённым данным, это худший объектив с худшей тушкой за всю историю Nikon. По другим неподтверждённым данным, наоборот, камера — зашибись. Имея один фотоаппарат, истину я не установил.
Мне нужна модель комнаты в 3D, чтобы соблюдать границы и не пересекать геометрией персонажей реальную мебель и стены. Таких фотографий было 750 штук, по три штуки на ракурс, потому что была ещё и идея свести каждый ракурс в HDR. Потому что из-за недостатка света фотографии выглядели хреново. Что из этого вышло… ну, вышло так себе, потому что вылез шум, несмотря на добавленную в угол мощную LED-лампу на 300 не-энергосберегающих ватт. Свет нужен совсем другой, но приходится экономить.
После RealityCapture получилась милая трёхмерная комната с диваном, софой и остатками кресла, с текстурой цвета. Я снимал со штатива, и во время съёмки не знал, где будет рабочая камера, а где техническая. Снимал наугад, и кресло оказалось с изуродованной геометрией, а главный ракурс — против окна. Был пасмурный день, и это классно, потому что при ярком бьющем в камеру солнечном свете испорченными были бы все фотографии без остатка.
Комнату-меш я не показываю, потому что она годится только для грубой оценки объёма сцены. Эту фотографию, обработанную в Фотошопе, увёл в зелёные тона. Результат HDR-сведения ядовито-красный.
Комната.
Ракурс оказался удачным — на советском ковре посреди комнаты хватит места и для сетчатого питона, и для девушки. Надо было сделать 3D-модель ковра с текстурой. Я измерил ковёр рулеткой, размеры оказались нестандартными: 148×222 см. Зато стандартные пропорции — точно 1,5.
Именно таких ковров в Сети нет, если не считать пару совсем плохих маленьких фотографий. Я взял ковёр в охапку и отправился на улицу фотографировать текстуру. Был конец августа, в тени +36 по Цельсию, на солнце возможности что-либо делать никакой. По Солнцу снимать нельзя, мешают тени от яблони, снял против Солнца — буквально, весь кадр ушёл в тень, но свет на улице был таков, что хватило.
Вернувшись домой, я проявил цифровые негативы, и соорудил милую текстуру ковра почти без искажений. В качестве ориентира у меня была текстура ковра из RealityCapture — качества сильно пережатого JPEG. Новый ковёр совпал практически идеально.
Ковёр.
Здесь уже нанесены повреждения, которых в оригинале не было. Ковёр я расположил поверх фотографии (в Maya). При симуляции этого одного кадра посредством nCloth, ковёр прогибается в том месте, где змея душит жертву. По идее, это место должно пойти складками, и я это сделал. Нанёс складки в ZBrush, и дополнительно нарисовал на этих местах AmbientOcclusion, грязь и потёртости.
Сцена симулирована физикой ткани nCloth. Когда-то давно я решал проблему симуляции силовым путём — просто пихал жертву в пасть змеи, и ждал результат. Так поступать нельзя. Распишу, как правильно:
Завернуть девушку в змею посредством родных анимационных контролёров.
Сделать нужную анимацию человека.
Сделать сквозную кривую (CV Curve), проходящую через девушку от пяток до макушки, и далее в змею.
На полигональную версию этой кривой наложить ShrinkWrap, который притянет к ней девушку.
Теперь можно переходить посредством ключей на тайм-линии от вытянутой в струнку жертвы до полноценного красивого тела.
Используя подготовительный период в 100 кадров, растянуть питона перпендикулярно добыче.
На сотом кадре будет красивый начальный результат.
При использовании nCloth, нужны специфические настройки ткани:
Compression Resistance около нуля.
Активный Attract to Target Mesh (единица).
Collision Thickness измеряется в единицах, которые мне неведомы. Должен в миллиметрах, но явно не так. Я поставил 0.09.
После симуляции удушения девушки питоном можно продавить ими обоими ковёр. Удобно это делать, сохранив меш как Alembic-кеш, и удалив к чертям лишние полигоны, которые грузят решатель. У моей видеокарты, которую использует nCloth, памяти совсем немного (два гигабайта), мне это важно.
На нелёгком пути разведения виртуальных змей есть подводные камни, которые я не упомянул. Например, давний баг Maya, который не даёт сохранить материал на меше, на который наложен модификатор nCloth, и у которого больше одного UV-набора. Решается это копированием материала с точно такой же копии меша (питона) на нулевом кадре, инструментом Transfer Shading Sets.
Инструменты, которые находятся рядом с Transfer Shading Sets (перенос UV-наборов, перенос топологии, перенос порядка вершин) для меня часто служат последним шансом на успех, потому что они довольно долго работают на каждом кадре анимации, и, если анимация более-менее сложная, просто отключаются.
А ещё бывают фокусы, когда модель на вид нормальная, меш выглядит неплохо, но каждый полигон вырезан и существует сам по себе. Ага, с сохранением мировых и UV-координат. Наложить текстуру на такую модель невозможно. У меня была ещё более дикая ситуация, когда сам Alembic-кеш имел разную топологию на разных кадрах, вследствие чего текстура существовала только на кадре номер один. После запуска анимации требовалось переоткрыть сцену с диска, и тогда в кадр номер один текстура возвращалась. Это следствие глюков в Maya и ZBrush. После сохранения такой работы проблемы начинаются непрерывным потоком.
Описанные действия дают сцену, которую, в принципе, можно визуализировать, но всплывают мелкие баги. Общий вид таков:
Готовое изображение после Фотошопа
В том месте, где край пасти касается её груди, решатель nCloth честно продавил кожу питона в толщину бумажного листа. Я воспользовался нодой BlurRelax, и стандартным деформатором TextureDeformer, чтобы добавить толщины. Её голову нужно просто удалить, потому что визуализировать это место не надо, оно съедено.
Итог рендера из майского визуализатора требуется сохранить в формат OpenEXR, причём с конкретными настройками: глубиной цвета 16-бит, с плавающей запятой (требование имеет отношение к упомянутому ACES). В Photoshop я привёл картинку к виду, как если бы она была снята на недорогую камеру (обычное размытие + Гауссов шум + нечёткая маска), и дополнительно наложил LUT-таблицу (какую, уже не помню, это было давно).
Что мне здесь не нравится: категорически не нравится тумба на заднем плане из советского ДСП, убитого временем, ещё и разломанная (без ящика). Сейчас на этом месте стоит журнальный столик, который выглядит в разы лучше, но переснимать я уже не могу, потому что осень, и потому, что 3D-сцену я рассчитал на ноутбуке чудом, после двух суток тяжелейшей работы.
Ещё не нравится то, что змея короткая. Но, во-первых, это старый рендер со старым питоном, а во-вторых, вкусы у людей разные. Кто-то кайфовал.
Перспектива следующая: уже готов литературный сценарий для анимации. Правда, готов весьма условно, потому что я не имею возможности сделать обычную бытовую анимацию, и персонажей нет. Потому я подозреваю, что выглядит по проф. меркам чуть лучше, чем никак. Чем богаты, тем и рады.
В дальних планах фильм на семь с половиной минут заглатывания несчастной жертвы голодным питоном.
До новых встреч.