Если хочешь сделать что-то хорошо, сделай это сам
Фердинанд Порше.
Это статья о моём личном кинофильме, с подробными пояснениями, куда мне пришлось прийти по независящим от меня причинам, с техническими подробностями из мира неадекватной 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. Сегодня на это нет никаких шансов.
![Модель сетчатого питона со скелетом Модель сетчатого питона со скелетом](https://www.pvsm.ru/images/2021/10/10/lichnyi-proekt-dolgostroi-glava-1.jpg)
У меня есть грамотная модель сетчатого питона с настроенным скелетом. Имея гуманитарный склад ума, уважая Киплинга, и понимая, что без разницы, какое имя, питона я назвал Kaa.
(Клыки у него, которые складываются — от коброгадюки Сета. Был такой персонаж когда-то давно).
Фишку, которая позволила мне обойти глючный майский инструмент SplineIK, я утаю. Ещё бы, сколько лет потрачено, чтобы отыскать её совершенно случайно в старой англоязычной ветке форума. Добавлю лишь, что результат выглядит идеальным. Змея не проскальзывает, и не вращается вокруг собственной оси.
Текстуры я рисовал не классическим способом, это не "открыл Photoshop утром, а вечером готовый результат", и даже не рисование по 3D-модели. Это долгая работа, несколько месяцев я добавлял детали и замазывал швы, есть комплект PBR-карт(за исключением очевидной Metallic), а открыть модель полностью в 3D-рисовалке нельзя, потому что текстура на теле питона нарисованная от начала до конца, и на представление её как геометрии памяти не хватает. Сейчас я могу только вспомнить, что изначально была грубая тяжёлая чешуя в виде геометрии, а спустя год доработок и замазывания она стала чем-то отдалённо близким к требуемой.
![Альбедо кожи питона в пространстве цвета ACES. Альбедо кожи питона в пространстве цвета ACES.](https://www.pvsm.ru/images/2021/10/10/lichnyi-proekt-dolgostroi-glava-1-2.jpg)
ACES — это Система Кодирования Академического Цвета. Создана в 2014 году, чтобы обеспечить сохранность готового киноматериала навечно. Ценный материал сохраняется в цветовом пространстве ACES 2065-1, с нефизически реализованными первичными цветовыми точками(Primaries). Точки покрывают всю подкову цветов CIE, при этом солидная часть треугольника отрицательная. Это значит, что покрыты все физически возможные для глаза человека цвета, и очень много невозможных. Архив же. При нужде надо будет просто взять исходный материал в пространстве ACES 2065-1, и перекодировать его под нужный дисплей преобразованием, которого ещё нет. Исходник продолжит храниться дальше.
Для рендера до композа используется ACEScg. Его малый цветовой диапазон компенсируется меньшим числом глюков.
С ACES и системой управления цветом OCIO у меня не всё просто. Пару недель назад я нашёл замечательный сайт-учебник, где английским по чёрному написано, как управлять цветом. Переводчик помог разобраться, потому смотрите: Maya поддерживает систему управления цветом OCIO. В этом пакете есть LUT-таблицы и файл конфигурации, чтобы её настроить.
![Личный проект-долгострой. Глава 1 - 3 Личный проект-долгострой. Глава 1 - 3](https://www.pvsm.ru/images/2021/10/10/lichnyi-proekt-dolgostroi-glava-1-3.jpg)
Реализация 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, используя как референс эту фотографию:
![Личный проект-долгострой. Глава 1 - 4 Личный проект-долгострой. Глава 1 - 4](https://www.pvsm.ru/images/2021/10/10/lichnyi-proekt-dolgostroi-glava-1-4.jpg)
Получилось что-то вроде этой обрезанной карты Альбедо:
![Личный проект-долгострой. Глава 1 - 5 Личный проект-долгострой. Глава 1 - 5](https://www.pvsm.ru/images/2021/10/10/lichnyi-proekt-dolgostroi-glava-1-5.jpg)
Красивую кружевную кайму пришлось отрезать полностью, её некуда накладывать. На оригинальной модели нет такой геометрии.
Декорациями для сцены я решил сделать собственноручно снятые фотографии комнаты. Снимал я их на сверхбюджетный зеркальный фотоаппарат Nikon D5300 с китовым объективом AF-S Nikkor 18-105 миллиметров, причём не просто так, а с расчётом на фотограмметрию.
По неподтверждённым данным, это худший объектив с худшей тушкой за всю историю Nikon. По другим неподтверждённым данным, наоборот, камера — зашибись. Имея один фотоаппарат, истину я не установил.
Мне нужна модель комнаты в 3D, чтобы соблюдать границы и не пересекать геометрией персонажей реальную мебель и стены. Таких фотографий было 750 штук, по три штуки на ракурс, потому что была ещё и идея свести каждый ракурс в HDR. Потому что из-за недостатка света фотографии выглядели хреново. Что из этого вышло... ну, вышло так себе, потому что вылез шум, несмотря на добавленную в угол мощную LED-лампу на 300 не-энергосберегающих ватт. Свет нужен совсем другой, но приходится экономить.
После RealityCapture получилась милая трёхмерная комната с диваном, софой и остатками кресла, с текстурой цвета. Я снимал со штатива, и во время съёмки не знал, где будет рабочая камера, а где техническая. Снимал наугад, и кресло оказалось с изуродованной геометрией, а главный ракурс — против окна. Был пасмурный день, и это классно, потому что при ярком бьющем в камеру солнечном свете испорченными были бы все фотографии без остатка.
Комнату-меш я не показываю, потому что она годится только для грубой оценки объёма сцены. Эту фотографию, обработанную в Фотошопе, увёл в зелёные тона. Результат HDR-сведения ядовито-красный.
![Комната. Комната.](https://www.pvsm.ru/images/2021/10/10/lichnyi-proekt-dolgostroi-glava-1-6.jpg)
Ракурс оказался удачным — на советском ковре посреди комнаты хватит места и для сетчатого питона, и для девушки. Надо было сделать 3D-модель ковра с текстурой. Я измерил ковёр рулеткой, размеры оказались нестандартными: 148 x 222 см. Зато стандартные пропорции — точно 1,5.
Именно таких ковров в Сети нет, если не считать пару совсем плохих маленьких фотографий. Я взял ковёр в охапку и отправился на улицу фотографировать текстуру. Был конец августа, в тени +36 по Цельсию, на солнце возможности что-либо делать никакой. По Солнцу снимать нельзя, мешают тени от яблони, снял против Солнца — буквально, весь кадр ушёл в тень, но свет на улице был таков, что хватило.
Вернувшись домой, я проявил цифровые негативы, и соорудил милую текстуру ковра почти без искажений. В качестве ориентира у меня была текстура ковра из RealityCapture — качества сильно пережатого JPEG. Новый ковёр совпал практически идеально.
![Ковёр. Ковёр.](https://www.pvsm.ru/images/2021/10/10/lichnyi-proekt-dolgostroi-glava-1-7.jpg)
Здесь уже нанесены повреждения, которых в оригинале не было. Ковёр я расположил поверх фотографии(в 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. После сохранения такой работы проблемы начинаются непрерывным потоком.
Описанные действия дают сцену, которую, в принципе, можно визуализировать, но всплывают мелкие баги. Общий вид таков:
![Готовое изображение после Фотошопа Готовое изображение после Фотошопа](https://www.pvsm.ru/images/2021/10/10/lichnyi-proekt-dolgostroi-glava-1-8.jpg)
В том месте, где край пасти касается её груди, решатель nCloth честно продавил кожу питона в толщину бумажного листа. Я воспользовался нодой BlurRelax, и стандартным деформатором TextureDeformer, чтобы добавить толщины. Её голову нужно просто удалить, потому что визуализировать это место не надо, оно съедено.
Итог рендера из майского визуализатора требуется сохранить в формат OpenEXR, причём с конкретными настройками: глубиной цвета 16-бит, с плавающей запятой(требование имеет отношение к упомянутому ACES). В Photoshop я привёл картинку к виду, как если бы она была снята на недорогую камеру(обычное размытие + Гауссов шум + нечёткая маска), и дополнительно наложил LUT-таблицу(какую, уже не помню, это было давно).
Что мне здесь не нравится: категорически не нравится тумба на заднем плане из советского ДСП, убитого временем, ещё и разломанная(без ящика). Сейчас на этом месте стоит журнальный столик, который выглядит в разы лучше, но переснимать я уже не могу, потому что осень, и потому, что 3D-сцену я рассчитал на ноутбуке чудом, после двух суток тяжелейшей работы.
Ещё не нравится то, что змея короткая. Но, во-первых, это старый рендер со старым питоном, а во-вторых, вкусы у людей разные. Кто-то кайфовал.
Перспектива следующая: уже готов литературный сценарий для анимации. Правда, готов весьма условно, потому что я не имею возможности сделать обычную бытовую анимацию, и персонажей нет. Потому я подозреваю, что выглядит по проф. меркам чуть лучше, чем никак. Чем богаты, тем и рады.
В дальних планах фильм на семь с половиной минут заглатывания несчастной жертвы голодным питоном.
До новых встреч.
Автор:
Astromatics