Создание игрового Peugeot 403 с использованием Unreal Engine и Substance 3D
Педро Алешандре Перейра рассказал о процессе создания модели Peugeot 403, поделился, что вдохновило его на проект, как он преодолел трудности при моделировании автомобиля и как создал детали.

Введение
Меня зовут Педро Перейра, и я 3D-артист из Португалии. Я профессионально занимаюсь 3D-искусством более 10 лет. С юных лет меня увлекали 3D-игры, поскольку я вырос в то время, когда игры переходили из 2D в 3D. Это, наряду со страстью к искусству, в конце концов привело меня к работе с некоторыми программами в подростковом возрасте.
Позже я начал серьёзно изучать 3D с намерением продолжить карьеру в колледже. После некоторого времени, работая в рекламе и на телевидении, я начал работать в игровой студии и выпустил множество мультиплатформенных игр, в основном в качестве художника по окружению и реквизиту. Я также работал фрилансером.




Peugeot 403
Этот проект начался, потому что я изначально хотел создать мод автомобиля для Assetto Corsa, включая полностью смоделированный интерьер. Моя жена и я — большие поклонники шоу «Коломбо» 70-х, и она была той, кто предложил мне попробовать создать старый и потрёпанный Peugeot 403 лейтенанта Коломбо из шоу.
В конце концов, работая над моделированием, я решил изменить масштаб проекта, чтобы сосредоточиться исключительно на внешнем виде. Хотя я сохранил первоначальное намерение создать автомобиль в качестве готового к игре ассета, я решил превратить проект в часть портфолио и использовать Unreal Engine для рендеринга. Я хотел, чтобы автомобиль выглядел ещё более повреждённым, ржавым и грязным, чем тот, что был в шоу, и ещё больше развить свои навыки текстурирования.
Для справки, я начал с поиска хорошего чертежа автомобиля. Это важный первый шаг для моделирования чего-то столь точного, как автомобиль из реального мира, поскольку вы не можете понять реальные пропорции, используя только фотоматериалы. Затем я сделал несколько скриншотов из шоу и столько качественных фотографий этого автомобиля, сколько смог.
Поскольку я обнаружил некоторые расхождения в элементах автомобиля между эпизодами, а также в том, что некоторые фотографии автомобиля выдавались за те, что использовались в шоу, я решил смоделировать те элементы, которые нашёл в разных источниках, собранных на моей доске PureRef (особенно крупные планы). Я также смоделировал колёсный диск из другой модели, поскольку нашёл его спицевые диски более интересными.

Моделирование
Я начал процесс моделирования, импортировав чертежи-ссылки в Maya и увеличив их до реального размера. Хорошее эмпирическое правило — всегда делать объекты в масштабе реальной жизни, поскольку это помогает со многими системами в 3D-пакетах и рендер-движках. В моём случае я изначально моделировал это как мод для Assetto Corsa, так что это было требованием.
Но даже позже, когда стало ясно, что модель будет импортирована и интегрирована в Unreal Engine, который использует физически основанный рендер-движок с реальными значениями интенсивности света и спада, это оставалось важным. Сначала я создал несколько направляющих кривых вдоль основных линий, образующих форму автомобиля, чтобы иметь представление об общей форме объекта и помочь с топологией. Затем были созданы петли рёбер, следуя этим основным линиям.

Процесс заключался в создании всего кузова как одного объекта, следуя этим первоначальным направляющим кривым. Затем различные панели были вырезаны, скошены и выдавлены внутрь. Получить правильную форму кузова автомобиля было непростой задачей, и в какой-то момент мне пришлось начать всё сначала, поскольку я был недоволен своей первой попыткой. Даже тогда я продолжал что-то менять почти до самого конца.
Полученная в результате экструзии сетка (здесь показана красным) затем разделяется и в итоге получает чёрный материал в Unreal, создавая водонепроницаемую сетку. Поскольку я всегда люблю исследовать разные рабочие процессы и инструменты в личных проектах, я решил смоделировать колёсный диск в инструменте CAD, который я изучал, под названием Plasticity.


Вот высокополигональная модель колёсного диска, преобразованная из CAD и экспортированная из Plasticity:

Вот высокополигональная модель крыши автомобиля. Сначала я смоделировал её в Maya, затем импортировал в ZBrush для детализации:


На этом этапе я решил использовать среднеполигональный подход, кроме крыши, так как у меня уже была скульптированная высокополигональная модель. Я подумал, что будет проще вносить изменения в модель, если не привязываться к высокополигональной модели и соответственно изменять вторую низкополигональную сетку. И, как было сказано ранее, корректировки модели продолжались вплоть до самого конца.
Техника среднеполигонального моделирования также была для меня в новинку, так что это стало поводом научиться чему-то новому. С этого момента любая детализация, которая в противном случае была бы частью высокополигональной модели, будет помещена в один атлас Normal Map, включая детали шины и колёсного диска, фары, логотипы и любые небольшие скосы.
Некоторые высокополигональные детали (винты, фары, задние фонари и рисунок шины) были запечены в отдельные плоские сетки позже в Substance 3D Designer и размещены вместе с другими процедурными и импортированными деталями.

Развёртка UV
Готовясь к развёртке UV, я стремился к плотности текселей около 12 пикселей на единицу. Мои наборы текстур получились такими: кузов автомобиля (4K), бамперы/металлические и резиновые детали/крыша (4K), стекло/освещение (2K), шина/колесный диск (2K). Я использовал встроенные инструменты UV в Maya для развёртки.
Обычно мой рабочий процесс начинается с простой плоской проекции для всего объекта, затем я разрезаю швы, проецирую и разворачиваю. Я назначил плоскую проекцию для X, Y и Z в качестве ярлыков, что экономит время. Я также стараюсь выпрямить как можно больше оболочек, что экономит пространство UV. Хороший совет — выбрать среднюю петлю рёбер и перейти в «Модификация» > «Выпрямить оболочку».
Для раскладки в основном я использую инструмент Layout UVs для автоматической упаковки. Я устанавливаю размер карты текстуры на свой собственный и экспериментирую с разрешением упаковки, итерациями и отступами оболочки. Я постоянно проверяю плотность текселей, пока не получу хороший результат. При необходимости я перемещаю некоторые оболочки вручную, но, как правило, делаю это в крайнем случае.
Вот части набора кузова автомобиля, которые занимают одно и то же пространство UV, например, дублированные боковые панели и двери (выделены зелёным). Я перемещаю оболочки на следующую плитку. Таким образом, Substance 3D Painter не будет накладывать запечённые текстуры, но я всё равно могу импортировать всю сетку.

Я часто использую разные наборы UV, в том числе и в этом проекте. Я использую скрипт, который автоматически переименовывает наборы UV на всех выбранных объектах. Это предотвращает проблемы, когда объединённые сетки, которые не имеют одинаковых имён в наборах UV, создают дополнительные нежелательные наборы. Скрипт также выбирает набор UV из всех выбранных объектов по заданному имени. Это гарантирует, что я не упакую случайно не те оболочки.

Текстурирование
После развёртки UV я присвоил материалам их окончательные имена, чтобы они были согласованы в Substance 3D и затем в Unreal. Разные части анимированы как в их окончательном положении, так и со смещением. Я выбирал в зависимости от того, экспортировал ли я в Unreal или Substance 3D, соответственно, поскольку размещение их в окончательном положении в Substance 3D Painter привело бы к нежелательным теням и нормалям во время запекания.
Для экспорта из Maya я использовал Game Exporter (Файл > Game Exporter). Я выбрал «Экспорт выделения» и «Экспорт во множество файлов», отметив «Переместить в начало координат». Чтобы ускорить процесс экспорта, я создал набор быстрого выбора со всеми моими объектами для экспорта, сетками и группами, дал им имя, которое будет указано в файле, и убедился, что точка поворота находится в правильном положении.
Таким образом, всё, что мне нужно было сделать, это нажать на сохранённый набор на моей полке и экспортировать. Maya переместит все объекты в начало координат и экспортирует в нужный каталог со всеми правильными именами сеток.
Вот модель, готовая к экспорту, с простыми цветными материалами и выбранным ключевым кадром со смещёнными компонентами для целей текстурирования.

Плавающие геометрические объекты (жёлтого цвета), которые позже будут использовать материал декали. На зеркале проецируются отверстия для винтов, а на шине — все её детали.


Материал передней решётки использует простую чередующуюся текстуру нормалей и непрозрачности размером 128x128.

Чтобы создать атлас нормалей, используемый в декалях и во втором наборе UV, используемом по всему автомобилю, я использовал Substance 3D Designer. Я часто использую Designer, даже если не обязательно создаю с его помощью процедурные материалы, а компоную текстуры из разных источников, таких как запекание, Painter или Photoshop.
Я считаю его удобным инструментом для конвейера, поскольку он автоматически обновляет все входные данные из этих источников и может автоматически экспортировать текстуры по конечному пути. На этот раз мне нужно было создать карту нормалей и карту непрозрачности, и я использовал комбинацию процедурного подхода и запекания.
Вот окончательный граф Substance 3D для атласа нормалей и окончательный атлас текстур:

Схема очень проста: несколько растровых входов из запечённых высокополигональных деталей, процедурный граф для детализации переднего света, лист отделки, текстовые детали, видимые по всему автомобилю, и логотип Peugeot спереди. У каждого из этих компонентов есть узел преобразования в конце, который я использовал для перемещения и организации окончательного атласа.
Вот крупные планы в Unreal Engine, показывающие различное использование атласа нормалей на декалях и в качестве вторичных смешанных нормалей.
Для основных текстур я использовал Substance 3D Painter. Я не буду разбирать каждый набор текстур, поскольку процесс текстурирования основного материала, повреждений, ржавчины и пыли одинаков для каждого набора. Мы сосредоточимся на текстурировании кузова автомобиля. Я начал с придания ему основного цвета и некоторой шероховатости.
Я также создал слой заливки, который обесцвечивает основной цвет в верхней части кузова, чтобы придать ему неравномерный оттенок. Для вариации шероховатости я создал слой заливки с фильтром MatFinish Rough, замаскированный несколькими картами Grunge. Эти слои шероховатости также учитывают повреждения и ржавчину, используя точки привязки, о которых я расскажу далее.
Вот основной цвет и шероховатость со слоем обесцвечивания поверх и слоем вариации шероховатости, а также слои основного цвета и шероховатости:


Для деталей повреждений я создал папку перед базовыми слоями, содержащую слои заливки высоты с различной информацией о высоте. Затем в верхней части этой папки я создал слой заливки, у которого все каналы были отключены, установленный в режиме наложения «Проход» в канале высоты.
Это эффективно делает так, что этот слой содержит всю информацию о высоте из слоёв в папке, а добавление точки привязки даёт мне всю стопку деталей повреждения для ссылки в любом месте проекта. Я использовал этот подход для ржавчины и пыли, как мы увидим далее.


Некоторые повреждения нарисованы вручную с помощью простой кисти и размыты. В других случаях, как здесь, я использую Cell Noise, отфильтрованный с помощью Anisotropic Kuwahara и Blur, затем маскирую только те части, которые хочу.


Для ржавчины я использовал аналогичный подход. Я создал стопку слоёв заливки высоты для рисования масок участков ржавчины. Эта группа, называемая Rust Stack, установлена в режим смешивания «Отключить» и используется в качестве точки привязки. Затем точка привязки этой группы используется другой группой, Rust Height, где я создал эффект отслаивания и пузырьков ржавчины.
Это позволяет мне рисовать внутри группы Rust Stack, а её значение высоты передаётся в группу Rust Height, чтобы перейти от отсутствия ржавчины к пузырькам ржавчины и полностью отслаивающейся автомобильной краске.

Внизу я создал слой Height Hole, который, используя Levels, ссылается на определённое значение из маски Rust Stack и создаёт точку отсечения между краской и ржавчиной. Эта маска точки привязки используется много раз после, но сам слой отключён.

Маска слоёв, содержащих эффект пузырьков, основана на шуме ячеек. Обратите внимание, что используется маска отсечения для вычитания, что влияет только на окружающую краску автомобиля, а не на область ржавчины. Меньшие пузырьки на втором изображении используют первое изображение в качестве маски вычитания, потому что они обычно окружают более крупные пузырьки.


Эффект отслаивания — это снова маска отсечения, размытая и вычитаемая сама из себя, создавая эффект затухания.

Группа слоёв, содержащих цвет ржавчины, использует опорные точки предыдущей группы Rust Height. Некоторое разнообразие цветов достигается с помощью масок grunge и фильтров градиента. Фильтр High-pass используется для создания затухания между ржавчиной и краской. Аналогичный подход также используется для создания полупрозрачного чёрного слоя заливки, установленного на Multiply, что создаёт дополнительный эффект контактной тени от слоя краски до ржавчины.

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

Пыль следует тому же принципу создания папки, установленной в режим смешивания Disabled, содержащей стек слоёв и верхний слой заливки, служащий опорной точкой. Затем один слой заливки, содержащий значение цвета и шероховатости пыли, маскируется опорной точкой стека пыли с некоторыми дополнительными настройками уровней.
Поскольку, как видно на примере, пыль оседает в основном сверху, я сначала использовал маски Position и Light generator. Я также создал маски на основе масок запечённой кривизны для щелей, а также для стеков ржавчины и повреждений. Затем последовал длительный процесс использования процедурных шумов, реальных фотографий пыли и различных кистей, чтобы пыль выглядела реалистично осевшей на автомобиле, но также как будто бы на ней остались следы от пальцев и других внешних воздействий.


Слой заливки пылью и частичное представление некоторых масок внутри группы Dust Stack:

Чтобы настроить материалы в Unreal, я использовал материалы Megascans Master в качестве отправной точки, а именно MS Base для большинства поверхностей и MS Glass для окон и источников света. Я также создал вариацию материала MS Base для кузова автомобиля, используя модель шейдера Clear Coat. Затем я добавил дополнительные параметры и входные данные, необходимые для этих материалов.
Я добавил вторичную карту нормалей, смешанную с основной, чтобы использовать свой атлас нормалей. Также добавлен дополнительный ввод текстуры для RGB-текстуры с разной картой Grunge в каждом канале, с контролируемой плиткой и минимальными и максимальными значениями.
Это смешано с основной картой шероховатости и параметрами значения, чтобы добавить некоторую микронеровность при детальном рассмотрении автомобиля. Крупные планы в Unreal Engine и текстура размером 512 x 512, показывающая, как эта настройка микрошероховатости помогает создать иллюзию дополнительной плотности текселей.

Я изменил исходный материал MS Glass, чтобы использовать свою собственную текстуру, полученную из Substance 3D Painter. Я также изменил том постобработки, чтобы использовать трассировку лучей для рефракции для таких материалов.

Рендеринг
Когда я впервые создал проект Unreal, у меня не было конкретной настройки освещения, поэтому я не ограничивал себя настройками качества. В конце концов, цель — продемонстрировать реквизит, а не создавать оптимизированную сцену.
Я начал с уровня Advanced Lighting из Starter Content, потому что там уже есть все объекты сцены и хорошие начальные значения для высококачественного рендеринга. Я настроил том постобработки, чтобы максимально увеличить все возможные значения до максимально возможного качества, включая тени, отражения и GI с трассировкой лучей максимального качества.
В своих первых экспериментах, ещё до текстур, я поэкспериментировал с закатным освещением и тенями. Я рассудил, что высокая контрастность теней и бликов поможет подчеркнуть форму и лучше продемонстрировать детали повреждений.


Хотя я считал, что такой подход к освещению обоснован, без окружающей среды всё выглядело неполным. Поскольку я не хотел тратить время на её создание, так как это выходило за рамки проекта, я решил использовать нейтральное студийное освещение. Я сохранил асфальтовый материал, который у меня был ранее для пола, но оставил только карту нормалей, чтобы он не был слишком пресным.
Когда я настраивал новый студийный HDR-свет, я почувствовал себя гораздо увереннее в том, что это правильный подход. Я разместил направленный свет, совпадающий с местом, где был самый сильный свет HDR, и площадной свет с тёмной стороны, чтобы убедиться, что некоторые детали не потерялись в тенях.
В томе постобработки, помимо упомянутых выше настроек качества, я практически не вносил корректировок в плане цветокоррекции, лишь немного подправил контрастность и температуру. Контраст чистой среды с повреждённым автомобилем создал интересную сцену, а почти фронтальное освещение на основных кадрах придало ей почти клинический вид, демонстрирующий износ автомобиля.

Наконец, я визуализировал финальные кадры и поворотную таблицу, используя плагин Movie Render Queue. Я установил консольные переменные, чтобы убедиться, что финальные кадры имеют наилучшее возможное качество. Для поворотной таблицы у меня возникла проблема с призраками между кадрами из-за временного сглаживания, поэтому я остановился на 32 выборках в счётчике прогрева рендеринга и количестве временных выборок.

Заключение
Я считаю, что создание хороших, реалистичных объектов-декораций, по крайней мере для меня, сводится к нескольким принципам:
- Во-первых, необходимы хорошие справочные материалы. Следование справочным данным и тому, что имеет смысл с точки зрения использования объекта или его работы.
- Во-вторых, следование принципу работы от основного блока к деталям. Сосредоточение внимания на основной форме, затем на вторичных и третичных деталях в хорошей пропорции. В моём случае я сознательно выбирал, где и в какой плотности разместить ржавчину и пыль, например.
- В-третьих, понимание технических аспектов того, как работает реалистичный рендеринг. Поскольку реализм зависит от хорошего баланса хороших материалов, освещения и постобработки, важно изучить и следовать установленным правилам, чтобы обеспечить надёжный рабочий процесс. Даже лучшая модель может быть испорчена плохим освещением.
Самым сложным в этом проекте было постоянно пересматривать решения, как крупные, так и мелкие. Было трудно отказаться от первой модели кузова автомобиля и сделать всё заново. Также было трудно решить, как должны выглядеть все слои повреждений, ржавчины и пыли, как я уже говорил выше.
Только правильно подобрав все эти мелкие детали, сбалансировав все аспекты, можно получить реалистичный и правдоподобный рендер, который будет выглядеть естественно и обоснованно. Несмотря на все трудности, я многому научился, от новых инструментов до рабочих процессов, что дало мне больше возможностей и способности решать новые художественные и технические задачи в будущих проектах.
Работа с моделированием автомобилей — это то, в чём я теперь чувствую себя гораздо увереннее. Изучение этого среднеполигонального подхода к моделированию и текстурированию также стало ценным уроком, применимым ко многим проектам по созданию декораций и окружающей среды. Что касается советов для начинающих, я бы указал не только то, что я сказал выше о том, как создавать реалистичные декорации, но я бы добавил, что в начале лучше всего работать с более простыми объектами, с меньшим количеством материалов.
Даже сделать так, чтобы простой объект выглядел реальным, — это достаточно сложная задача. Кроме того, я бы сказал, никогда не привязывайтесь слишком сильно ни к чему. Если внутреннее чутьё подсказывает, что что-то не совсем получается, доверьтесь этому чувству и сделайте это снова или попробуйте другой подход. И, наконец, я считаю, что важно быть эффективным. Устранение повторяющихся задач и трений из рабочего процесса путём поиска скриптов, инструментов или утилит, которые могут помочь.
Поддержание порядка и структурированности также сэкономит время и избавит от головной боли в долгосрочной перспективе. Время лучше потратить на решение художественных задач. Я хотел бы поблагодарить 80 Level за возможность поделиться этим разбором моей работы. Я надеюсь, что я предложил некоторую помощь, так же как я многому научился у многих художников на этой платформе!
Педро Алешандре Перейра, старший 3D-художник
Интервью проведено Эммой Коллинз
Автор: Pedro Alexandre Pereira
Материал подготовлен на основе статьи 80.lv. Перевод — Skills Up.