Косплей на Эльзу | Холодное сердце
В честь Нового Года хочу показать вам мой перезапуск косплея на Эльзу! Поздравляю с наступающим Новым Годом! Пусть он принесет много счастья, тепла и улыбок :)
Фотограф: https://vk.com/julisvulis
Как я делал Эльзу. Часть третья – UV-развёртка, текстуры и материалы - 2
Итак, вторая часть одного большого поста. Продолжаем.
Насчёт зубов и языка – всё делаю абсолютно по такому же принципу. А для зубов даже карты нормалей не нужно – там, если помните, отлично справляются складки. Размер текстур для ротовой полости сильно большой не нужен, делаю их 2048х2048 пикселей.
Кстати, к нарисованным бровям я дополнительно добавил и настоящие, сделанные при помощи Hair Curves. Они почти не выделяются, но добавляют детализации и объёма.
Всё? А вот и нет. Текстуры готовы, но с персонажем всё ещё что-то не так. Особенно если смотреть его на просвет. Силуэт тёмный, как статуя. Живые люди (даже стилизованные) так не выглядят. А дело в том, что у Эльзы ещё нет так называемого SSS – Subsurface scattering. Это та самая штука, когда вы смотрите на свою руку перед ярким источником света, и пальцы по краям становятся красными.
Так и здесь. Я добавляю подповерхностное рассеивание на всё тело. Но, где-то оно должно быть явно выраженным, например на ушах, на пальцах, на носу и других тонких объектах, а где-то – почти не проявляться. Как этого добиться? Можно нарисовать ещё одну текстуру, чёрно-белую, где чёрный цвет будет соответствовать отсутствию рассеивания, а белый – максимальному проявлению. А можно сделать и проще. Этот способ я придумал сам, но, может быть, его ещё кто-то использует, не знаю.
Суть та же, что и с текстурой, только указывать блендеру, где подсвечивать, мы будем с помощью атрибута цвета. Заходим в режим рисования по вершинам, и чёрной кисточкой превращаем Эльзу вот в такого чумазика.
В нодовой структуре материала указываю полученный атрибут, инвертирую его, и настраиваю так, чтобы меня удовлетворил результат. Нода с красным цветом отвечает за цвет самого рассеяния.
И всё, теперь уши и пальцы выглядят натуральнее, да и в целом тени на теле стали помягче.
И тут хотелось бы вернуться к зубам и сделать маленькое уточнение. Зубы, хоть и являются твёрдым объектом, они – не кусок камня, а органика, которая должна хоть немного, но пропускать свет. Этого практически никогда не будет заметно на рендерах, при анимации, но тем не менее, такие мелочи нужно учитывать, иначе персонаж может выглядеть неестественно. Поэтому к материалу зубов тоже добавляем совсем немного SSS.
И последнее, чего стоит коснуться в данной теме – динамические текстуры. Мне хочется, чтобы при определённой мимике, на тех или иных местах на лице появлялись морщинки. Самый простой и очевидный способ этого добиться – создать ещё одну карту нормалей, подмешать её к основной, а затем скрывать или показывать. Идём в ранее созданный файл, в котором я запекал нормали для тела, и слегка пакостим на лице следующим образом:
Снова запекаем, возвращаемся к основному. Тут уже и средства блендера сгодятся. Рисуем вот такую текстуру размером 256х256 (больше нет смысла).
Эта, и ещё несколько подобных ей – маски для будущей динамической текстуры. Белый цвет проявляет карту морщин, чёрный – скрывает. Значит, нужно добиться того, чтобы каждая из этих текстур могла становиться полностью чёрной.
Делаю ещё одну текстуру, тоже 256 пикселей. Она отделит левую сторону от правой, и позволит включать и выключать маски.
А дальше – смешиваю всё это между собой. Вот пример одной из них, остальные аналогично.
Забегая немного вперёд, в тему анимации, я подвязал эти значения с помощью драйверов к определённым костям. Вот как это работает, на примере этих самых морщин на лбу:

Кожу специально сделал более блестящей, и чуть увеличил силу нормалей, чтобы было заметнее.
Вот теперь, кажется, всё. Но только для темы с текстурами. Впереди риг, одежда, анимация, короче ещё будет, о чём написать.
Как я делал Эльзу. Часть третья – UV-развёртка, текстуры и материалы
Примечание: тема вышла очень обширной, даже в один пост не влезает, так что придётся разбить её надвое. Второй пост тут.
Итак, после того, как все составляющие закончены (за исключением одежды – это отдельная тема), можно приступать к текстурированию. Оригинальные игровые текстуры оставляют желать лучшего: у них низкое разрешение, недостаточная детализация, а в импортированных вместе с моделью материалах присутствуют лишние элементы, вроде Light Map, в виде дополнительной текстуры, которая подмешивается к основной.
Вот что она собой представляет в чистом виде. Это сделано для упрощения расчётов в игровом движке, и имитирует контактные тени. По сути, это Ambient Occlusion, только назван по-другому. Помимо тела, такое встречается почти на всех элементах. Мне это не нужно, у меня всё будет просчитываться физически корректным способом, так что от этого будем избавляться.
Поехали.
Первой переделанной текстурой стала текстура глаз. Если честно, я занялся ею даже ещё до того, как приступил к волосам. Оригинальная имела размер 1024х1024 пикселя, почему-то инвертированную карту бликов (наверное, в другом движке она интерпретировалась правильно), также отсутствовали нормали. Выглядело это так:
Лишний блик прямо на зрачке, при этом остальная часть сухая как штукатурка – ровно наоборот.
Новую текстуру для глаз я создавал довольно интересным способом, подсмотренным на ютубе на канале Ниворд. Вкратце проиллюстрирую на следующей картинке.
Я отрендерил пару вариантов, меняя настройки, чтобы получились радужки разной степени реализма. После чего скомпоновал их в фотошопе, используя маски и режимы наложения, пока не достиг желаемого результата. Таким же образом сделал всё для карты шероховатости и нормалей. После чего, наконец, собрал всё воедино для текстуры целого глаза. Радужки я отрендерил в размере 2048х2048, а вот вся целиком текстура глаза, вместе с белковой частью, имеет размер уже 4096х4096. На белковую часть также наложил едва заметные кровеносные сосуды. Они были и на оригинальной текстуре, только я не стал отрисовывать каждый сосудик, а просто накинул готовые. Паттерн чуть иной, но это не страшно. Вот как выглядит моя текстура в сравнении с игровой:
Если на таком масштабе всю разницу в деталях, скорее всего, и не увидеть (да и пикабу сожмёт картинку в любом случае), то на самой модели она более чем очевидна:
Здесь, кстати, видно и то, как роговица отражает падающий на неё свет от окружающей среды. Таких текстур я сделал две, для левого и правого глаза, они слегка отличаются рисунком радужки.
И ещё тут можно заметить, как изменились ресницы. Их я, естественно, тоже переделал. Оригинального размера в 512 пикселей явно мало. В отдельном файле я положил старую текстуру в качестве фона, и смоделировал по ней вот такую вещь:
Это не что иное, как Hair Curves, расположенные по обведённому контуру. Каждая из этих ресничек точно повторяет оригинал.
Вот уже с этого файла я отрендерил чёрно-белый силуэт для альфа-канала, карту глубины, и карту нормалей. Всё в разрешении 2048х2048. Глубина в итоге не понадобилась по прямому назначению, но я смешал её с основным цветом, чтобы получить небольшое разнообразие и дополнительную детализацию.
Закончив с глазами и ресницами, я приступил к основной части, а именно – текстурированию тела. В оригинальной модели текстура была представлена двумя блоками: со стороной 1024 пикселя для лица и головы, и 2048 для всего остального тела, но во второй блок была запечена ещё и текстура плаща. Все текстуры, за исключением лицевой, были нарисованы односторонними, так как оригинальная развёртка также была односторонней, и лишь отзеркаливалась.
С UV-развёртки и начался процесс, так как без этого никакого адекватного покраса быть не может. Я сохранил оригинальную развёртку лицевой части, чтобы ориентироваться на неё при работе, и чтобы максимально сохранить черты лица. Остальную же пришлось делать с нуля, и ничего общего с первоначальной она не имеет.
Перво-наперво размечаем швы.
Затем, когда всё размечено, применяем модификатор «симметрия», и делаем первичную развёртку. В новой версии блендера появился алгоритм, позволяющий разворачивать геометрию с минимальными искажениями. Но, даже с ним, без ручных правок не обойтись.
Создаём временную текстуру с шахматным рисунком, это позволит видеть, насколько хорошо развернулся тот или иной элемент, что и где поправить, а также отрегулировать масштаб и привести всё к общему знаменателю.
Там, где клеточки меньше – больше детализация, и наоборот. Самая высокая детализация, конечно же, должна быть на лице, там вы видите самые мелкие клеточки.
Постепенно, развёртка приобрела следующий вид:
Красным выделены закреплённые точки, то есть те, на которые влияние развёртывания не распространяется, однако от них зависит, как поведут себя все остальные. Закреплять точки полезно, если, например, нужно получить симметричную развёртку туловища, или поправить развёртку какого-то участка, не меняя его целиком.
Как видите, развёртка заняла целых три слота, и возможно, кто-то скажет, что она слишком неэкономно расходует пространство. Ну, во-первых, пространства мне не жалко, железо позволяет, а во-вторых, мне нравится, когда островки расположены упорядоченно и симметрично. Не для игры, в конце концов, делается.
Три слота означают, что текстура тела Эльзы будет состоять из трёх изображений, связанных между собой. Это называется UDIM, и такой подход очень распространён в 3D-индустрии. Главное – соблюдать синтаксис в именах файлов. Текстура первого квадрата должна иметь окончание 1001, второго – 1002, и так далее. Так блендер поймёт, в каком порядке ему их загружать. А сами текстуры при этом можно рисовать в чём угодно, принципиальной разницы для блендера здесь нет.
Для блендера, может и без разницы, зато я считаю иначе. В самом блендере есть инструментарий для рисования текстур, но реализован он не лучшим образом, и подходит разве что для простых зарисовок, набросков, или текстур небольшого размера. Он глючный, постоянно тормозит даже при простых действиях, и у него мало возможностей. Фотошоп тем более не годится, там даже понимания развертки нет.
Поэтому не мучаемся, откладываем блендер в сторону, и открываем программу, созданную специально для задач текстурирования – SubstancePainter. Но, прежде чем начать в нём рисовать, надо экспортировать из блендера соответствующий меш. Выбираю тело Эльзы, отключаю все сглаживающие модификаторы, и экспортирую выделенное в файл формата obj. На его основе уже создаётся новый проект в пейнтере, и я приступаю к покрасу.
Покрас Эльзы я начал с того, что добавил на модель оригинальные текстуры. На них я буду опираться при работе. С шероховатостью и нормалями беда полная, но пока я их не трогаю, работаю чисто в режиме цвета.
Первый этап – глаза. Создаю для них новую папку, а внутри этой папки – новый слой-заливку с основным цветом. Прячу его под чёрной маской. Затем аккуратно, стараясь не затрагивать лишние зоны, закрашиваю весь макияж, внутреннюю поверхность век, ну и брови. После этого на новых слоях сглаживаю переходы, добавляю оттенки. Образцы цветов беру прямо с модели. После того, как старые глаза и брови полностью скрылись, создаю ещё одну папку, в которой уже рисую веки заново. Это очень кропотливая работа, нужно попасть и в цвет, и соблюсти форму. Постоянно переключаю видимость на прежнюю текстуру, чтобы видеть разницу.
Макияж довольно комплексный, с кучей деталей и оттенков. Если в первой папке, которая лишь скрывает старые глаза – пять слоёв, то во второй, где нарисованы новые – уже целых семнадцать.
Таким же способом рисую брови. Сперва симметрично, затем добавляю немного вариативности для левой и правой. Брови – простой объект, и мне понадобилось всего четыре слоя.
Дальше – нос, вместе со щеками. Десяток слоёв – и кожа приобрела более ровный цвет и лучшую детализацию. Немного побледнели веснушки, но я займусь ими чуть позже.
В принципе, что касается лица, то процесс на всех его частях был более-менее одинаков. Поверх старой текстуры создавались новые слои, сглаживающие цвет и добавляющие детали.
Было-стало:
А вот что насчёт волос, которые нарисованные. В принципе, с ними можно было вообще не заморачиваться, но я решил сохранить их, и также доработать. Хоть их почти и не будет видно под настоящими волосами, о которых был предыдущий пост, но свой вклад они вносят.
Дальше, после того как голова и лицо сделаны, перехожу к телу. Собственно, там почти нечего делать – так, добавить слегка вариативности коже, где-то побольше румянца, где-то веснушек. Просто в данном конкретном случае тело – не та вещь, на которой будет фокусироваться внимание. Уверен, и в самом Диснее придерживаются этой логики. Другое дело, если бы это была 18+ модель – вот там бы пришлось заморочиться над деталями, и особенно в некоторых местах.
А вот на кистях рук и стопах следует проявить чуть больше усердия. На руках прокрашиваем красноватым цветом места суставов, ладонь, подушечки пальцев, слегка тёмным цветом подчёркиваем тени в складках. То же самое и на ногах.
И наконец ногти. Просто заливаем все полигоны, из которых они состоят, телесным цветом, и рисуем более светлую полоску. Впоследствии мне придётся слегка поправить этот элемент, так как при подразделении полоска некрасиво выгибается, но это я сделаю уже средствами самого блендера.
На этом покрас основного цвета закончен, и остались шероховатость с нормалями. Если насчёт шероховатости особых сложностей не было – просто настроил каналы в уже созданных слоях, то вот с картой нормалей пришлось повозиться.
Итоговую карту нормалей я создавал путём смешения нескольких. Частично задействовал исходную карту, некоторые участки там оказались удачными. Ещё, на таких местах, как например губы или кисти рук – нарисовал детали в Substance.
Для волос и бровей я использовал этот сервис генерации нормалей из картинок, и загрузил туда уже готовую мою текстуру цвета.
Возвращаемся в блендер, в нём мы будем запекать ещё один источник для итоговой карты нормалей. Я взял меш Эльзы, закинул его в отдельный файл, и применил к нему модификатор Multiresolution. Там, на третьем уровне подразделения, просто подчеркнул наиболее важные складки у глаз, губ, носа, ушей и пальцев. Очень хорошо при этом стали выглядеть ногти, что пригодится при создании итоговой карты.
После этого запекаю нормали, и возвращаюсь в Substance Painter. Создаю новый проект, и загружаю туда целых четыре набора: исходный, ранее экспортированный из SP, запечённый в блендере, и сгенерированный сайтом. У каждого есть свои достоинства и свои недостатки. Моя задача – смешать все эти наборы так, чтобы сохранить лучшее от каждого из них, а все огрехи скрыть.
Готовую карту нормалей сохраняю также в UDIM с правильными суффиксами, подгружаю в основной файл блендера. Почти готово! К сожалению, в один пост не влезает больше 25 картинок, и продолжение будет во втором посте, который выйдет одновременно с этим. А пока предлагаю сравнить то, что получилось, с тем, что было.
Как я делал Эльзу. Часть вторая – волосы и рот
Волосы… Это самая настоящая проблема. В одном из своих постов я как-то говорил, что сделать хорошие и качественные волосы невероятно сложно, и на тот момент для меня это была практически нереализуемая цель. Приходилось выбирать между внешним видом, и функциональностью.
Однако, с тех пор прошло много времени, и я рад сообщить, что проблема решена! Не обошлось без костылей, но я открыл для себя даже не один способ, чем очень доволен. И в процессе создания Эльзы неплохо так набил руку. К слову, для разных причёсок я использовал разные способы создания волос, и об этом чуть ниже.
Но, прежде чем перейти к теме волос, давайте вскользь коснёмся глаз, зубов и языка. С ними особых трудностей не возникло, у глаз так вообще даже топология приемлемая, единственное что – пришлось убрать треугольники, но тут автоматическая функция справилась на ура.
Кстати, сверху они выглядят так:
Чуть торчат в разные стороны, и в своё время для меня это стало открытием, но на самом деле с анатомической точки зрения так правильнее.
С зубами чуть больше работы, но тоже в целом ничего сложного. Кстати, ротовой аппарат в оригинальной модели был представлен единым объектом. Так тоже можно, но я не сторонник такого подхода, и поэтому разделил его на составляющие.
Глаза и зубы после моего вмешательства. Обратите внимание, что вокруг глаз я создал дополнительные сферы, которые в дальнейшем будут играть роль роговицы и отражать свет.
И ещё маленький момент насчёт зубов. После того, как я почистил топологию (осталось много треугольников, но тут это вообще не принципиально), я выделил зубы специальным инструментом «складка». Вот эти фиолетовые линии.
Это нужно для того, чтобы при сабдиве зубы чётко очерчивались и визуально отделялись от дёсен, и при этом без необходимости создавать лишнюю геометрию. Вот как на нижних зубах это видно.
Собственно, рот на этом закончен, и давайте уже поговорим про волосы.
Способов создания волос на самом деле много. Следуя поставленной цели – добиться внешнего вида «как у Диснея», я выделил для себя два. Первый способ, с помощью которого и сделана та самая классическая причёска с косой, называется hair cards. Он главным образом используется в игровой индустрии, так как для отрисовки таких волос не требуется слишком много ресурсов.
Но погодите кидаться камнями: то, что способ примитивный, вовсе не значит, что его нельзя доработать. Чем я и занялся. В отдельном файле я создал несколько волос (которые HairCurves), настроил их и отрендерил. Получились вот такие локоны.
И таких наборов я сделал несколько штук: для волос разной плотности. От прямо массивных прядей до отдельных волосков. Естественно, с альфа-каналом, нормалями и шероховатостью. Разместил это всё на одной текстуре с разрешением аж 8К. Настало время слепить из всего этого подобие настоящих волос. И, прежде чем я приступил к этому непосредственно у Эльзы, я сделал пробный файл. В нём я сначала создал меш с вот таким вот странным профилем:
Да, именно меш, а не кривую. И вот как он выглядит в целом:
Эдакое нечто непонятное. На самом деле, всё предельно ясно. Затем была сделана UV-развёртка, и начался долгий процесс рассовывания всех этих полосок по текстуре. Плотные волосы – внутри, редкие – снаружи. После того, как это было сделано, к данному мешу я применил модификатор «Кривая», и изогнул локон так, чтобы он напоминал собственно… локон. И сферу присобачил на всякий случай, типа голова.
Вот такая фиговина вышла, зато в отрендеренном виде уже вполне похоже на волосы.
Ну, вроде всё устраивает, решил я, и начал лепить причёску. Но, как оказалось, созданные волосы имели один маленький, но неприятный недостаток: слишком заметные края. Из-за этого местами они выглядели не как растущие из головы волосы, а как вставленные туда пластиковые полоски.
Что-то типа этого:
Примерно такой же эффект был, когда внутренние волосы пересекались с внешними и вылезали наружу. Некрасиво, нехорошо.
Что делать? Эффект пластика создавала чрезмерная плотность волосков на текстуре. Но, что если сделать локон без сплошных текстур? Вот чисто из отдельных волосинок, просто напихать их побольше. Ради интереса я сделал пару таковых. И столкнулся с новой неприятностью. Точнее, даже двумя. Во-первых, вот:
Это происходит из-за того, что количество прозрачных элементов превышает количество путей света в настройках рендера. Можно вылечить, подкрутив число отскоков, но тут вылезает вторая проблема: рендеринг и так не очень быстрый, а с увеличенным числом путей его продолжительность вообще вырастает в разы.
Короче, тоже не годится. Поэтому я решил вернуться к первоначальному варианту, только доработать его. Создал новый набор текстур для плотных волос, и на этот раз без чёткой границы: плотность плавно нарастала по направлению к центру. Затем, поэкспериментировал с профилем и формой меша. Сделал так, чтобы пряди слегка перекрывали друг друга, создавая иллюзию плотного пучка. Одновременно уменьшилось количество полигонов, стало легче и рендерить, и моделить. И после этого снова принялся за причёску.
Наглядным референсом послужила изначальная причёска, что была у игровой модели. Я брал созданный мною меш вместе с деформирующей его кривой, ставил в нужное место, и затем придавал ему форму. В целом, это выглядело так:
Кстати, на тех прядях, которые находятся спереди, я также немножко поработал с корнями, чтобы они не так грубо входили в кожу.
После очень долгой работы, которая заняла примерно недели две, я наконец получил классическую причёску, которую вы уже видели в предыдущих постах, но я покажу ещё раз, мне не сложно.



Здесь ещё старые текстуры тела. Про текстуры будет отдельный пост, а пока что переходим ко второму способу создания волос, и ко второй причёске. А именно той самой, которая появилась во время исполнения шикарной, на мой взгляд, песни Show Yourself, и благодаря которой, Эльза теперь краш не только для меня, но и вообще для многих.
Спойлер: вот она


Работа над этой причёской ещё ведётся, в плане оснастки её для анимации. И точнее, уже даже готова, просто хочу исправить несколько моментов.
Способ создания – те самые пресловутые Hair Curves. Да, красивые, но, как я когда-то был уверен, совершенно не предназначенные для рига и анимации. И поэтому распущенную причёску я сначала хотел сделать тем же методом, что и классическую. И даже начал. А затем случайно наткнулся на одно видео, после которого уже не было смысла продолжать. Я бы привёл ссылку на ютуб, но с недавних пор это здесь моветон, так что для желающих расширить свои познания в блендере: ищите по имени Rakenval, у него много полезных советов.
Так вот, оказывается, HairCurves прекрасно можно анимировать! Воодушевлённый, я приступил к работе над ними. Процесс этот был очень долгим, даже дольше, чем в предыдущем случае. Весь его я расписывать не буду, но вкратце суть сводится к тому, чтобы создать на поверхности эти самые волосы, затем их расчесать, придать нужную форму. Это можно делать как в режиме скульптинга, так и редактирования. Получается что-то подобное:
Естественно, я не мог обойтись без тестов. В отдельных файлах создавал как и странные конструкции вроде этого
так и более вменяемые и приближенные к итоговому результату сценки. Здесь мне опять помогла та стандартная моделька девочки из ассетов блендера.
Для каждой пряди я создавал отдельные кривые, чтобы было удобнее их потом контролировать. Та причёска, что вы видели, состоит из 13 объектов, и это только сами кривые.
После долгого и упорного труда, проб, ошибок, переделываний, причёска готова! Теперь, хоть до анимации ещё далеко, я всё же делаю все необходимые приготовления. Вот тут и приходит на помощь видео. Короче, для того, чтобы вся эта система работала, волосы-кривые нужно привязать к так называемому прокси-мешу. Отдельный респект Rakenval, что вместе с видео он выложил и файлы, где содержится всё необходимое.
Краткий алгоритм: волосы дублируем, конвертируем в меш, меш немного экструдируем, чтобы была ненулевая геометрия, затем назначаем ему физику ткани. Настроили физику – привязываем волосы к прокси через геоноды. Все, готово! Однако, если волос много, как в моём случае, то симуляция может идти слишком долго, да и ведут они себя иначе, чем в мультфильме. Там, если кто помнит, вот эти отдельные большие локоны держали форму, а не рассыпались на сотни волосков. Точнее, слегка рассыпались, но в целом держали. А значит, с целью упрощения расчётов, и сохранения формы, нужно проделать ещё один дополнительный шаг.
Нет, Эльза не облысела, просто эти штуки - специальные объекты, каждый из которых будет управлять более мелкими и частыми прокси-волосами соответствующего локона. Их не видно на рендере, они выполняют чисто вспомогательную функцию. Вот им уже и назначаем физику, и на этот раз всё идёт намного быстрее. Кстати, именно их я хочу впоследствии отредактировать, чтобы они вели себя более корректно.
Добившись приемлемого результата, с удовлетворением закрываю блендер и отправляюсь на заслуженный перерыв. Впереди не менее важный этап: текстурирование. Ему будет посвящён следующий пост, а пока что жду вашего отклика, комментариев, советов, критики. До новых встреч!