Как подготовить ассет для AAA-игры — на примере модели рации
Рекомендации от 3D-художника Джеймса Брейди.
![](https://248006.selcdn.ru/main/iblock/488/488c10d239c8feba8a6d912cf18677d4/849a5aa76a0ec37d071091831e64944c.png)
![](https://248006.selcdn.ru/main/iblock/488/488c10d239c8feba8a6d912cf18677d4/849a5aa76a0ec37d071091831e64944c.png)
Иллюстрация: Colowgee для Skillbox Media
Создание ассета для AAA-игр требует не только художественных навыков, но и соблюдения пайплайна студии, в том числе технических требований к контенту. В ноябрьском номере журнала 3D World UK вышла статья от 3D-художника Джеймса Брейди, где он подробно описал ряд этапов, через которые проходит 3D-контент высокого качества перед импортом в игровой движок. Редакция «Геймдев» Skillbox Media делится тезисами специалиста из этой статьи.
![](/upload/setka_images/17250406022025_d94a1d0d95e1a6e27b7423a44412fc5bba80fae8.jpg)
Джеймс Брейди
Фриланс-художник в области 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, то эти настройки предназначены для определения единиц непосредственно во вьюпорте.
![](/upload/setka_images/17305406022025_accf102caaa970ce65d217b9ae9a8e9a57caa67c.jpg)
Блокинг ассета
Блокинг, или блокаут, в 3D — это грубое построение объекта или локации из примитивных форм, которое создают в самом начале для определения общего масштаба будущей модели. Чтобы начать процесс блокинга в моделировании, создайте простой куб и подгоните его под размер и форму ассета. Очень важно соблюдать пропорции в соответствии с референсом, особенно когда передняя часть объекта отличается от задней, как, например, фаски по краям рации, представленные на слайде ниже. В этом случае сначала создают прямую поверхность, а затем делают скосы углов с той стороны, где это необходимо.
![](/upload/setka_images/17321106022025_08fda0244b5397e030ee401fd2bea5b24f78a72b.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
На следующем этапе Брейди создал дополнительные верхние и нижние секции и добавил их к уже существующему примитиву. Таким образом получилась общая форма рации, и фаски на ней проглядываются уже более отчётливо. Затем художник добавил к конструкции передние части в виде цилиндров — микрофон и динамик. Таким образом модель постепенно обрастает всё новыми деталями, до тех пор, пока не завершится процесс блокинга.
![](/upload/setka_images/17325206022025_6896a8696b8038f4fc8989ab005e4fccc3b90047.jpg)
Создание high-poly-объекта
Получив оптимальный результат после блокинга, можно приступить к созданию высокополигональной модели. Во время этой стадии художник продублировал ассет, полученный в результате предыдущей фазы, и начал добавлять больше замкнутых рёбер в полигональную сетку. Необходимо разобрать модель, созданную путём блокинга, на отдельные сегменты и добавить на каждую часть больше замкнутых рёбер.
![](/upload/setka_images/17334906022025_c7c2d6650fe8dd3125b1541cb39af56649bd56fa.jpg)
Во время этого процесса необходимо проследить за равномерным распределением рёбер вдоль всего меша. Забегая вперёд, стоит отметить, что эти манипуляции нужны для дальнейшего применения модификатора Turbosmooth, который сгладит полигональную сетку. И если подразделения выполнены хаотично, после применения этого инструмента структура некоторых элементов может получиться неравномерной.
Добавляем в меш последние штрихи
Закончив с распределением замкнутых рёбер по всем элементам, применяем модификатор Turbosmooth. В некоторых случаях необходимо добавить чуть больше рёбер для лучшего скругления углов. Тем не менее стоит помнить, что в дальнейшем этот объект будет экспортирован в ZBrush, где его полигональной сетке добавят подразделений. Чтобы не переборщить с уровнями подразделения в ZBrush, лучше создать ещё немного замкнутых рёбер при необходимости и вновь применить Turbosmooth, пока модель всё ещё находится в 3ds Max.
![](/upload/setka_images/17352406022025_0ed1686442ac630326a48ddcef43684fa02b904b.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
Эти манипуляции необходимо провести и с остальными элементами модели, пока все меши не будут готовы к экспорту в ZBrush.
Подготовка мешей для булевых операций
Конструкция рации предполагает множество мелких отверстий в области микрофона и динамика. Эти детали можно проработать с помощью булевых операций. В данном случае Брейди создал группу цилиндров, толщина которых соответствует предполагаемым отверстиям, и разместил их на модели в соответствии с референсом. Во время этого действия важно проследить, чтобы все цилиндры находились на одном уровне, в противном случае после булевых операций глубина отверстий получится неравномерной.
![](/upload/setka_images/17363306022025_b30ff17d14b759c017197570526ff51b33cc83c5.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
Аналогичные действия необходимо провести со всеми элементами, где требуются углубления, включая мельчайшие детали. Например, у рации художника рядом с антенной есть небольшое отверстие с гайкой.
![](/upload/setka_images/17363306022025_fc9956ee2f4201e204a5532c68850c6715ed24e0.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
После того как все предназначенные для булевых операций примитивы вставлены в меш, можно экспортировать модель в ZBrush в формате OBJ.
Импорт мешей в ZBrush
Загружаем OBJ-файл в ZBrush. После загрузки объекта в меню Tool открываем вкладку Subtool и, чуть прокрутив её вниз, находим кнопку Split, и нажимаем Split to Similar Parts.
Программа автоматически распознает задействованные в булевых операциях меши и отделит их от основных деталей. Все они появятся в категории Subtool в качестве отдельных элементов. Такой подход позволяет избежать заметных артефактов во время процесса. После этого необходимо проверить список разделённых сегментов на панели Subtool и убедиться, что меши, предназначенные для булевых операций, находятся выше мешей, в которых нужно проделать отверстия: в дальнейшем они объединятся во время выполнения функции DynaMesh.
![](/upload/setka_images/17363406022025_6caf85fa09e0642959e62c753d9a2f18236eb1da.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
Проведение булевых операций с мешами
В Subtool выделяем первый меш, над которым необходимо провести булеву операцию (в данном примере это микрофон или динамик). Прокрутив панель вниз, находим вкладку Dynamesh. В настройках этого инструмента Брейди обычно выставляет ползунок слайдера с разрешением на 1400. Такой вариант настроек обеспечит желаемую форму и плотность при дальнейшей конвертации меша.
![](/upload/setka_images/17363306022025_c0c954a3a268bfc515e88839a41a25de5bd1b194.jpg)
Затем необходимо выбрать объект, с помощью которого проводится булева операция, и назначить его отрицательным, то есть нажать на значок полумесяца рядом с объектом в меню Subtool. Это значит, что после выполнения операции сторонний меш, вставленный в основной объект, удалится, но отверстия от него останутся.
Убедившись, что выделены обе полигональные сетки, заходим во вкладку Polygroups и нажимаем Group As DynaMesh Sub, после чего во вьюпорте выделится извлекаемый меш. Осталось только объединить оба меша: удерживая Ctrl, нажимаем ЛКМ и перетаскиваем курсор в сторону. После этого на меше появятся отверстия.
![](/upload/setka_images/17363406022025_cece785eb92cd643f5e788e5f37e3d933a76f56c.jpg)
Аналогичный процесс необходимо повторить со всеми остальными элементами high-poly-модели, где требуются отверстия.
Создание low-poly-модели
После всех преобразований объекты экспортируют обратно в софт для 3D-моделирования (в рамках рабочего пайплайна), чтобы создать низкополигональную версию модели. Самый быстрый способ — использовать в качестве основы изначальный меш, полученный на этапе блокинга.
Каждую часть необходимо сопоставить с high-poly-аналогами. Возможно, high-poly-сегментов окажется больше, и недостающие элементы можно просто смоделировать вручную. Размеры high-poly- и low-poly-деталей должны полностью совпадать, иначе в дальнейшем могут возникнуть проблемы в процессе запекания, включая видимые артефакты, и ошибки, связанные с отсутствием перекрытий полигональных сеток.
![](/upload/setka_images/17363306022025_2229e417950c39bd1ac90259b6c781a232a40430.jpg)
Продолжайте дорабатывать изначальный меш, полученный в результате блокинга, пока он не будет идеально сопоставлен с high-poly-деталями. Если в ассете есть несколько одинаковых мешей (к примеру, как динамики в рации Брейди), можно выбрать одну деталь и работать только с ней, а затем продублировать её после этапа с UV-развёрткой.
![](/upload/setka_images/17363306022025_71b97f3681cfd481f98f8279e17d064ae63ea66a.jpg)
Изображение: 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.
![](/upload/setka_images/17420506022025_b96f49b701f581862428f9c58e1a46c731d0aa89.jpg)
Изображение: 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-развёртке Брейди корпус рации представлен одним большим шеллом. Это обеспечит высокую детализацию фрагменту текстуры, и на нём будут легко считываться царапины, потёртости, маркировки и другие детали.
![](/upload/setka_images/17420506022025_d75dd4921f9f5ca9dc828e1efafbd5a21dfa9c5d.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
Художник рекомендует упаковывать развёртку таким образом, чтобы UV-острова одной детали находились рядом. Благодаря такому подходу не только проще заметить ошибку в текстурировании, когда, к примеру, уникальный элемент текстуры затронул другой остров, но и оптимизировать связующие UV-острова. Под ними подразумеваются смежные элементы, которые не видит игрок, но фактически они находятся в той же области, где расположен видимый UV-остров ассета.
Импорт в Marmoset Toolbag
После того как все UV-острова распределены в пространстве 0–1, можно приступить к запеканию карт для текстурирования. Этот процесс удобнее всего выполнять в Marmoset Toolbag. Открываем программу и импортируем созданные low-poly- и high-poly-меши. Во избежание различных проблем с масштабированием и смещением, убедитесь, что обе модели импортированы как файлы .fbx. После загрузки моделей желательно назначить на каждую из них цветной материал, чтобы было проще их идентифицировать и отследить нежелательные выступы low-poly-меша.
![](/upload/setka_images/17420606022025_b76bc71fa80c20942ed01e19c21ead7b69ad6b89.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
Процесс запекания
В главном меню Marmoset Toolbag открываем вкладку Scene и переходим в New Object — Bake Project. После этого переместите high-poly- и low-poly-модели в соответствующие категории, которые появились в аутлайнере слева. Выделите Bake Project 1 и убедитесь, что все карты в разделе Map отмечены галочкой, за исключением Material ID.
В разделе Output в пункте Samples укажите 64x, а в Resolution — 4096×4096. Запечённые детали получатся более чёткими и без зубчатых артефактов в хорошем разрешении. Перед запеканием проверьте кейдж и убедитесь, что он перекрывает все меши. Если расположение кейджа вас устраивает, просто нажмите Bake.
![](/upload/setka_images/17420706022025_1c076733da30d01108464d85a8ffad1517acec59.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
![](/upload/setka_images/17471806022025_b75fdd2a8498fc2acfb3d28fc090fa3c1e11e4fb.png)
Читайте также:
Переход в 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.
![](/upload/setka_images/17420506022025_1cc7c7aaff1472b38801633d33e2f9e6221a290f.jpg)
Изображение: 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.
![](/upload/setka_images/17420506022025_62bf1942effdabf0107c530d35221fdf53489254.jpg)
Во время текстурирования в Substance Painter можно применить фильтр Sharpen поверх слоя. Это поможет усилить чёткость деталей. Брейди предпочитает выставлять его интенсивность на 0.4 (параметр Sharpen Intensity).
Дополнительные детали
Следующий шаг — нанесение на поверхность различных деталей, в том числе обусловленных историей модели. Рация, например, может быть грязной и потёртой. Для первого слоя художник использовал генераторы, а затем нанёс ещё один слой вручную, чтобы добавить ассету авторских штрихов.
Вы можете добавить дополнительные детали уже созданным текстурам, изменяя параметры в Levels — Base Color в окне наверху иерархии слоёв.
Во время текстурирования важно следить за отображением карт, отвечающих за свойства шероховатости (Roughness) и металла (Metallic). К примеру, детали с высоким параметром шероховатости хорошо подчёркивают запылившиеся участки и в целом матируют поверхность. Металлические поверхности представлены на карте либо 100% чёрным (то есть без отражений), либо 100% белым цветом, без промежуточных значений.
![](/upload/setka_images/17420506022025_ea2b2f998665356b094cbc9e4d99ecdc646b93d5.jpg)
Изображение: 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.
![](/upload/setka_images/17420806022025_b200d8bc76303a5287d3954213dd40d331052ae4.jpg)
Изображение: James Brady / 3D World UK, 2024. №317
![](/upload/setka_images/17420506022025_178ae943fb180dbd85da113c997e71d410f43eb6.jpg)
Изображение: Джеймс Брейди