Скидки до 50% и 3 курса в подарок : : Выбрать курс
Геймдев
#статьи

Как подготовить ассет для AAA-игры — на примере модели рации

Рекомендации от 3D-художника Джеймса Брейди.

Иллюстрация: Colowgee для Skillbox Media

Создание ассета для AAA-игр требует не только художественных навыков, но и соблюдения пайплайна студии, в том числе технических требований к контенту. В ноябрьском номере журнала 3D World UK вышла статья от 3D-художника Джеймса Брейди, где он подробно описал ряд этапов, через которые проходит 3D-контент высокого качества перед импортом в игровой движок. Редакция «Геймдев‎» Skillbox Media делится тезисами специалиста из этой статьи.


Джеймс Брейди

Фриланс-художник в области 3D-графики родом из Ирландии.

На протяжении своей карьеры он делал ассеты для Red Dead Redemption 2, Halo Infinite, Dying Light 2: Stay Human, Ghostbusters: Spirits Unleashed, Judas, Rogue Company, Life is Strange: Double Exposure и других известных игр.


В своём материале Брейди дал ряд поэтапных рекомендаций по созданию ассета высокого качества, подходящего для импорта в видеоигру или фильм. В качестве примера он продемонстрировал цикл подготовки модели военной рации перед импортом в движок Unreal Engine. В рамках своего пайплайна художник работал в 3ds Max, ZBrush, Marmoset Toolbag и Substance 3D Painter.

Хотя у каждой компании есть свой набор софта для создания цифрового контента, рекомендации Джеймса Брейди помогут оптимизировать процесс подготовки ассетов для последующего экспорта в движок.

Даже если в качестве основного приложения для 3D-моделирования вы используете не 3ds Max, а Maya, из этого материала можно извлечь несколько полезных лайфхаков по блокингу, UV-развёртке, булевым операциям, запеканию деталей и достижению фотореализма в текстурировании. А в дальнейшем адаптировать их под свой пайплайн.

Подписывайтесь на наш телеграм-канал «Чекпоинт». Это уютное место, в котором мы рассказываем об играх и о том, как они создаются, а также делимся полезными советами разработчиков и пишем о важных обновлениях популярного софта. Комментарии открыты: вы можете предложить идею для нового текста или просто обсудить всё, что связано с геймдевом.

Проверка метрической системы

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

В данном случае Брейди делал рацию для игры на Unreal Engine 4, поэтому в программе для 3D-моделирования он выбрал в качестве единиц сантиметры, так как именно эту систему мер использует движок. К примеру, чтобы настроить систему единиц в 3ds Max, нужно перейти во вкладку Customise в главном меню программы и найти опцию Units Setup… — после этого откроется окно с кнопкой System Unit Setup. Именно там находятся настройки системы мер, которые отвечают за реальный масштаб объекта в сцене. Что касается Display Unit Scale, то эти настройки предназначены для определения единиц непосредственно во вьюпорте.

Изображение: James Brady / 3D World UK, 2024. №317

Блокинг ассета

Блокинг, или блокаут, в 3D — это грубое построение объекта или локации из примитивных форм, которое создают в самом начале для определения общего масштаба будущей модели. Чтобы начать процесс блокинга в моделировании, создайте простой куб и подгоните его под размер и форму ассета. Очень важно соблюдать пропорции в соответствии с референсом, особенно когда передняя часть объекта отличается от задней, как, например, фаски по краям рации, представленные на слайде ниже. В этом случае сначала создают прямую поверхность, а затем делают скосы углов с той стороны, где это необходимо.

Моделирование корпуса рации на стадии блокинга
Изображение: James Brady / 3D World UK, 2024. №317

На следующем этапе Брейди создал дополнительные верхние и нижние секции и добавил их к уже существующему примитиву. Таким образом получилась общая форма рации, и фаски на ней проглядываются уже более отчётливо. Затем художник добавил к конструкции передние части в виде цилиндров — микрофон и динамик. Таким образом модель постепенно обрастает всё новыми деталями, до тех пор, пока не завершится процесс блокинга.

Сетка рации в ортогональном режиме (вид сверху) и итоговый результат блокинга Изображение: James Brady / 3D World UK, 2024

Создание high-poly-объекта

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

Изображение: James Brady / 3D World UK, 2024. №317

Во время этого процесса необходимо проследить за равномерным распределением рёбер вдоль всего меша. Забегая вперёд, стоит отметить, что эти манипуляции нужны для дальнейшего применения модификатора Turbosmooth, который сгладит полигональную сетку. И если подразделения выполнены хаотично, после применения этого инструмента структура некоторых элементов может получиться неравномерной.

Добавляем в меш последние штрихи

Закончив с распределением замкнутых рёбер по всем элементам, применяем модификатор Turbosmooth. В некоторых случаях необходимо добавить чуть больше рёбер для лучшего скругления углов. Тем не менее стоит помнить, что в дальнейшем этот объект будет экспортирован в ZBrush, где его полигональной сетке добавят подразделений. Чтобы не переборщить с уровнями подразделения в ZBrush, лучше создать ещё немного замкнутых рёбер при необходимости и вновь применить Turbosmooth, пока модель всё ещё находится в 3ds Max.

Финальный вид меша верхней части рации после применения Turbosmooth
Изображение: James Brady / 3D World UK, 2024. №317

Эти манипуляции необходимо провести и с остальными элементами модели, пока все меши не будут готовы к экспорту в ZBrush.

Подготовка мешей для булевых операций

Конструкция рации предполагает множество мелких отверстий в области микрофона и динамика. Эти детали можно проработать с помощью булевых операций. В данном случае Брейди создал группу цилиндров, толщина которых соответствует предполагаемым отверстиям, и разместил их на модели в соответствии с референсом. Во время этого действия важно проследить, чтобы все цилиндры находились на одном уровне, в противном случае после булевых операций глубина отверстий получится неравномерной.

Установка группы цилиндров для будущих отверстий на меш динамика
Изображение: James Brady / 3D World UK, 2024. №317

Аналогичные действия необходимо провести со всеми элементами, где требуются углубления, включая мельчайшие детали. Например, у рации художника рядом с антенной есть небольшое отверстие с гайкой.

Расположение цилиндра на меше верхней части рации
Изображение: James Brady / 3D World UK, 2024. №317

После того как все предназначенные для булевых операций примитивы вставлены‎ в меш, можно экспортировать модель в ZBrush в формате OBJ.

Импорт мешей в ZBrush

Загружаем OBJ-файл в ZBrush. После загрузки объекта в меню Tool открываем вкладку Subtool и, чуть прокрутив её вниз, находим кнопку Split, и нажимаем Split to Similar Parts.

Программа автоматически распознает задействованные в булевых операциях меши и отделит их от основных деталей. Все они появятся в категории Subtool в качестве отдельных элементов. Такой подход позволяет избежать заметных артефактов во время процесса. После этого необходимо проверить список разделённых сегментов на панели Subtool и убедиться, что меши, предназначенные для булевых операций, находятся выше мешей, в которых нужно проделать отверстия: в дальнейшем они объединятся во время выполнения функции DynaMesh.

Интерфейс загрузки мешей и их распределение в Subtool
Изображение: James Brady / 3D World UK, 2024. №317
Видеоинструкция, как найти функцию Split to Parts в ZBrush

Проведение булевых операций с мешами

В Subtool выделяем первый меш, над которым необходимо провести булеву операцию (в данном примере это микрофон или динамик). Прокрутив панель вниз, находим вкладку Dynamesh. В настройках этого инструмента Брейди обычно выставляет ползунок слайдера с разрешением на 1400. Такой вариант настроек обеспечит желаемую форму и плотность при дальнейшей конвертации меша.

Изображение: James Brady / 3D World UK, 2024. №317

Затем необходимо выбрать объект, с помощью которого проводится булева операция, и назначить его отрицательным, то есть нажать на значок полумесяца рядом с объектом в меню Subtool. Это значит, что после выполнения операции сторонний меш, вставленный в основной объект, удалится, но отверстия от него останутся.

Убедившись, что выделены обе полигональные сетки, заходим во вкладку Polygroups и нажимаем Group As DynaMesh Sub, после чего во вьюпорте выделится извлекаемый меш. Осталось только объединить оба меша: удерживая Ctrl, нажимаем ЛКМ и перетаскиваем курсор в сторону. После этого на меше появятся отверстия.

Изображение: James Brady / 3D World UK, 2024. №317

Аналогичный процесс необходимо повторить со всеми остальными элементами high-poly-модели, где требуются отверстия.

Создание low-poly-модели

После всех преобразований объекты экспортируют обратно в софт для 3D-моделирования (в рамках рабочего пайплайна), чтобы создать низкополигональную версию модели. Самый быстрый способ — использовать в качестве основы изначальный меш, полученный на этапе блокинга.

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

Изображение: James Brady / 3D World UK, 2024. №317

Продолжайте дорабатывать изначальный меш, полученный в результате блокинга, пока он не будет идеально сопоставлен с high-poly-деталями. Если в ассете есть несколько одинаковых мешей (к примеру, как динамики в рации Брейди), можно выбрать одну деталь и работать только с ней, а затем продублировать её после этапа с UV-развёрткой.

Доработка низкополигональных мешей под размер высокополигональных
Изображение: James Brady / 3D World UK, 2024. №317

UV-развёртка для low-poly-меша

Если текущий результат вас устраивает и все детали корректно сопоставлены с high poly, можно перейти к созданию UV-развёртки. Для начала необходимо убедиться, что у будущей UV-развёртки отсутствуют растяжения и перекосы, и проверить плотность текселей с помощью специальных настроек.

К примеру, чтобы сделать это в 3ds Max, нужно выбрать UV Unwrap Modifier: в списке модификаторов Modifier list он отмечен как Unwrap UVW. На панели Edit UVs нажимаем кнопку Open UV Editor… В появившемся редакторе находим в главном меню вкладку Options и выбираем Preferences. После этого откроется окно Unwrap Options, где можно настроить плотность текселей в пункте Checker Tiling.

Настройки Checker Tiling в 3ds Max
Изображение: James Brady / 3D World UK, 2024. №317

Упаковка UV-островов

Подготовив UV-развёртку низкополигонального меша, необходимо её упаковать. Все UV-острова (шеллы) размещаются в UV-пространстве от 0 до 1.

Что такое «от 0 до 1» в UV-развёртке?

Как правило, разрешение текстур для моделей варьируется от 512×512 пикселей до 4K (4096×4096 пикселей). Поэтому при размещении UV-островов нет смысла использовать пиксельные координаты, и в качестве альтернативы выбрана специальная система координат 0–1. В буквальном смысле это небольшой квадрат, где точка 0 — это пересечение осей U и V, а 1 — точки на обеих осях. Координаты этого отрезка и сопоставляются с границами текстуры.

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

Слева представлен общий вид UV-развёртки рации, справа выделен UV-остров корпуса, внизу — UV-острова динамиков
Изображение: James Brady / 3D World UK, 2024. №317

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

Импорт в Marmoset Toolbag

После того как все UV-острова распределены в пространстве 0–1, можно приступить к запеканию карт для текстурирования. Этот процесс удобнее всего выполнять в Marmoset Toolbag. Открываем программу и импортируем созданные low-poly- и high-poly-меши. Во избежание различных проблем с масштабированием и смещением, убедитесь, что обе модели импортированы как файлы .fbx. После загрузки моделей желательно назначить на каждую из них цветной материал, чтобы было проще их идентифицировать и отследить нежелательные выступы low-poly-меша.

Высокополигональные и низкополигональные модели, загруженные в Marmoset Toolbag и отмеченные разными цветами
Изображение: James Brady / 3D World UK, 2024. №317

Процесс запекания

В главном меню Marmoset Toolbag открываем вкладку Scene и переходим в New Object — Bake Project. После этого переместите high-poly- и low-poly-модели в соответствующие категории, которые появились в аутлайнере слева. Выделите Bake Project 1 и убедитесь, что все карты в разделе Map отмечены галочкой, за исключением Material ID.

Расширенный видеоурок о процессе запекания в Marmoset Toolbag

В разделе Output в пункте Samples укажите 64x, а в Resolution — 4096×4096. Запечённые детали получатся более чёткими и без зубчатых артефактов в хорошем разрешении. Перед запеканием проверьте кейдж и убедитесь, что он перекрывает все меши. Если расположение кейджа вас устраивает, просто нажмите Bake.

Распределение high-poly- и low-poly-мешей в аутлайнере, предварительные настройки и установка кейджа
Изображение: James Brady / 3D World UK, 2024. №317

Переход в Substance 3D Painter

Запускаем Substance 3D Painter и выбираем New Project, после чего откроется стартовое окно с предварительными настройками. В данном примере ассет рации изначально создавался для проекта на движке Unreal Engine 4, поэтому в категории шаблона Template выбрана опция Unreal Engine 4 (starter_assets), а в Document Resolution — разрешение 4096.

Загружаем низкополигональную модель ассета и набор PSD-файлов карт, экспортированных из Marmoset Toolbag. В карте нормалей необходимо инвертировать зелёный канал (Green), чтобы движок мог в дальнейшем корректно считать рельеф поверхности. Эту манипуляцию также можно проделать в Photoshop.

Вкладка с каналами в Adobe Photoshop
Изображение: James Brady / 3D World UK, 2024. №317

Зачем нужно инвертировать канал Green?

У нормалей вершин существует собственная система координат, основанная на векторах X, Y, Z. Первые два отвечают за передачу рельефа поверхности и шейдинг. И большинство современных программ для 3D-моделирования и движков используют векторное пространство Y+ и (или) Y−, которое и отражено в зелёном канале карты нормалей (Green). Иными словами, этот канал отвечает отвечает за выпуклость или вогнутость поверхности. И если его в данном случае не инвертировать, то векторное пространство не будет синхронизировано и рельеф получится совершенно другим.

Также рекомендуем прочесть наш материал о создании ассетов в Blender в рамках AAA-производства. В нём можно узнать не только о специфике карт нормалей и векторов, но и ознакомиться с подробным списком программ, поддерживающих векторное пространство Y+ и (или) Y−.

Текстурирование в Substance Painter

Создайте набор из запечённых текстур во вкладке Texture Set Settings. После применения они отобразятся на меше во вьюпорте. Далее можно приступить к текстурированию. Примените на ассет основу в виде цветного материала. Прежде чем наносить дополнительные детали, убедитесь, что цвет основного материала максимально схож с референсом. Для корпуса рации Брейди использовал пресет Steel Painted Stained, а для металлических деталей — Steel Stained из коллекции «‎умных» материалов Smart Materials.

Изображение: James Brady / 3D World UK, 2024. №317

Во время текстурирования в Substance Painter можно применить фильтр Sharpen поверх слоя. Это поможет усилить чёткость деталей. Брейди предпочитает выставлять его интенсивность на 0.4 (параметр Sharpen Intensity).

Дополнительные детали

Следующий шаг — нанесение на поверхность различных деталей, в том числе обусловленных историей модели. Рация, например, может быть грязной и потёртой. Для первого слоя художник использовал генераторы, а затем нанёс ещё один слой вручную, чтобы добавить ассету авторских штрихов.

Вы можете добавить дополнительные детали уже созданным текстурам, изменяя параметры в Levels — Base Color в окне наверху иерархии слоёв.

Во время текстурирования важно следить за отображением карт, отвечающих за свойства шероховатости (Roughness) и металла (Metallic). К примеру, детали с высоким параметром шероховатости хорошо подчёркивают запылившиеся участки и в целом матируют поверхность. Металлические поверхности представлены на карте либо 100% чёрным (то есть без отражений), либо 100% белым цветом, без промежуточных значений.

Слева — стандартный вид ассета, в центре — отображение карт Roughness, справа — Metallic
Изображение: James Brady / 3D World UK, 2024. №317

Помните, что краска на предметах в реальной жизни имеет свойство со временем выцветать, в частности из-за погодных условий. Важно передать эти детали в ассете, чтобы сделать их максимально правдоподобными.

Экспорт текстур

И наконец, финальный этап — экспорт текстур в Unreal Engine. В Substance 3D Painter переходим в File — Export Textures, выбираем папку для будущих текстур и проверяем, чтобы в графе Output Template отображалась надпись Unreal Engine 4 (Packed). В File Type указываем расширение Targa (.tga), так как это самый распространённый тип расширения для Unreal Engine. В графе Texture Set List необходимо прописать название для набора текстур. Помните, что в отношении наименований текстурных карт для внутриигровых ассетов очень важно придерживаться чёткой идентификации и последовательных обозначений, например T_MilitaryRadio_01.

Настройки экспорта в Substance 3D Painter
Изображение: James Brady / 3D World UK, 2024. №317
Итоговый результат
Изображение: Джеймс Брейди

Попробуйте новую профессию в геймдеве — бесплатно

Доступ к курсам за 0 р.

Я не знаю, с чего начать
Кто вы в мире геймдева? Узнайте на бесплатном курсе ➞
Вы на практике попробуете 3 профессии: геймдизайнера, 2D-художника и разработчика на Unity. Создадите свою первую игру в стиле Mario. Подробности — по клику.
Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована