Если хочешь сделать что-то хорошо, сделай это сам

Фердинанд Порше.

Это статья о моём личном кинофильме, с подробными пояснениями, куда мне пришлось прийти по независящим от меня причинам, с техническими подробностями из мира неадекватной 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.

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 x 222 см. Зато стандартные пропорции — точно 1,5.

Именно таких ковров в Сети нет, если не считать пару совсем плохих маленьких фотографий. Я взял ковёр в охапку и отправился на улицу фотографировать текстуру. Был конец августа, в тени +36 по Цельсию, на солнце возможности что-либо делать никакой. По Солнцу снимать нельзя, мешают тени от яблони, снял против Солнца — буквально, весь кадр ушёл в тень, но свет на улице был таков, что хватило.

Вернувшись домой, я проявил цифровые негативы, и соорудил милую текстуру ковра почти без искажений. В качестве ориентира у меня была текстура ковра из RealityCapture — качества сильно пережатого JPEG. Новый ковёр совпал практически идеально.

Ковёр.
Ковёр.

Здесь уже нанесены повреждения, которых в оригинале не было. Ковёр я расположил поверх фотографии(в Maya). При симуляции этого одного кадра посредством nCloth, ковёр прогибается в том месте, где змея душит жертву. По идее, это место должно пойти складками, и я это сделал. Нанёс складки в ZBrush, и дополнительно нарисовал на этих местах AmbientOcclusion, грязь и потёртости.

Сцена симулирована физикой ткани nCloth. Когда-то давно я решал проблему симуляции силовым путём — просто пихал жертву в пасть змеи, и ждал результат. Так поступать нельзя. Распишу, как правильно:

  1. Завернуть девушку в змею посредством родных анимационных контролёров.

  2. Сделать нужную анимацию человека.

  3. Сделать сквозную кривую(CV Curve), проходящую через девушку от пяток до макушки, и далее в змею.

  4. На полигональную версию этой кривой наложить ShrinkWrap, который притянет к ней девушку.

  5. Теперь можно переходить посредством ключей на тайм-линии от вытянутой в струнку жертвы до полноценного красивого тела.

  6. Используя подготовительный период в 100 кадров, растянуть питона перпендикулярно добыче.

  7. На сотом кадре будет красивый начальный результат.

При использовании nCloth, нужны специфические настройки ткани:

  1. Compression Resistance около нуля.

  2. Активный 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-сцену я рассчитал на ноутбуке чудом, после двух суток тяжелейшей работы.

Ещё не нравится то, что змея короткая. Но, во-первых, это старый рендер со старым питоном, а во-вторых, вкусы у людей разные. Кто-то кайфовал.

Перспектива следующая: уже готов литературный сценарий для анимации. Правда, готов весьма условно, потому что я не имею возможности сделать обычную бытовую анимацию, и персонажей нет. Потому я подозреваю, что выглядит по проф. меркам чуть лучше, чем никак. Чем богаты, тем и рады.

В дальних планах фильм на семь с половиной минут заглатывания несчастной жертвы голодным питоном.

До новых встреч.

Комментарии (10)


  1. Yuribtr
    10.10.2021 14:30
    +12

    Ничего не понял, но очень интересно.


  1. Forthright
    10.10.2021 15:49
    +5

    Я понимаю что у всех свои фетиши и работа автором была проделана весьма существенная, но вот всё же встретить обычным воскресным днём на Хабре статью про vore я не очень был готов...


    1. Gengenid
      10.10.2021 18:31
      +4

      У этого даже название есть?

      Как скучно я живу (слава богу)


    1. Astromatics Автор
      11.10.2021 13:34
      +2

      Так, термин знаком. Хорошо. Значит, у темы здесь есть перспективы.


  1. Yser
    10.10.2021 17:10
    +2

    Первое что бросается в глаза мне - зона в районе левой лодыжки, слишком тонкая и неестественно выгнута.


    1. tvr
      11.10.2021 12:20

      После объятий питона у неё всё должно быть неестественно выгнуто и сдавлено.


    1. Astromatics Автор
      11.10.2021 13:27

      В девушке нет нормальной физической мускулатуры. Чем богаты, тем и рады. Подтягивать ещё и плагины мускульной физики тяжко, и сцена сломается. ShrinkWrap этого не переживёт. А так - да, ошибка бросается в глаза. Грешен.


  1. ASHcommander
    11.10.2021 12:00
    +1

    Питон настолько тяжёлый, что продавил не только ковер, ни и пол.


    1. tvr
      11.10.2021 12:19

      Застрял в текстурах и теперь бедная Мари будет коротать вечность в состоянии ни туда, ни сюда.


    1. Astromatics Автор
      11.10.2021 13:23

      Да! Потому что в предыдущий редакции не смог продавить даже одеяло. Добавил массы по максимуму, чтобы уж наверняка. Двести килограмм как минимум. Я не уверен, что пол вообще выдержит.

      Это было обоснование по Дойлю.