Как создавать ассеты в Blender, когда студия работает в других программах
Доклад Маттиаса Патшайдера, художника по окружению в Remedy Entertainment.
Иллюстрация: Оля Ежак для SKillbox Media
Арт-отделы многих крупных игровых студий не используют Blender при создании контента, так как у них зачастую уже есть ряд определённых программ, включённых в пайплайн. Если же начать интегрировать в этот процесс дополнительный софт, могут возникнуть самые разные сложности, и в результате разработка замедлится.
А что, если 3D-художник отлично работает в Blender и способен создавать контент в этой программе, не нарушая динамику общего рабочего процесса студии?
На Blender Conference 2024 художник по окружению в Remedy Entertainment Маттиас Патшайдер поделился своим опытом работы в Blender в рамках пайплайна, не предполагающего использование этой программы. Также он дал рекомендации, как при таких условиях взаимодействовать с командой, не усложняя общий процесс разработки. Делимся тезисами специалиста.
Маттиас Патшайдер
Начал карьеру 3D-художника в немецкой студии King Art Games, где он создавал окружение для приключенческого хоррора Black Mirror. В тот период художник старался работать преимущественно в Maya, так как эта программа входила в пайплайн студии. В ней он делал первые блокауты, а затем начал создавать и объекты.
Вскоре он получил задание сделать модульный набор ассетов для одной из главных локаций. На тот момент Маттиас не знал, как выполнить такую работу в рамках Maya, но знал, как сделать это в Blender. К тому же работать в последней программе художнику было намного комфортнее. Маттиас убедил коллег дать ему шанс закончить проект в Blender, пообещав, что в случае неудачи он продолжит работать в Maya.
Впрочем, неудачи не случилось, и задачу удалось выполнить. Художник стал регулярно создавать контент в Blender для различных проектов, даже если их пайплайн не предполагал использование этой программы. Помимо работы над Black Mirror, Маттиас применял такой подход для создания ассетов для фриланс-проектов, в том числе визуализаций для промышленных предприятий, и для игр InnerSpace, Crossfire, а также Alan Wake 2 и дополнений Night Springs и The Lake House для неё.
Также Маттиас занимается разработкой вспомогательных инструментов для Blender. В настоящий момент он работает над серией утилит Simple Tools, призванных упростить процесс создания игрового арта.
Почему Blender сложно использовать в пайплайнах крупных студий
Прежде чем перейти к вопросу использования Blender в работе с игровым контентом, необходимо разобраться, что такое игровой арт и в чём заключается специфика его создания в рамках видеоигр. Главное отличие игрового арта от других типов контента, в том числе анимаций, кроется в том, что перед переносом результата в игровой движок все процессы по созданию арта проходят цепочку различных конвертаций.
Эти действия входят в пайплайн — структурированный процесс стандартизированных действий. Благодаря пайплайну совместная работа и продуктивность команды возрастает: сложность выполнения задач снижается, повторные операции автоматизируются, появляется согласованность между всеми участниками процесса.
Пайплайн помогает сделать рабочий процесс комфортнее. Это не значит, что у художника в таком случае есть инструмент, из которого можно сразу перенести работу в движок. Это значит, что его контент проходит ряд стандартизированных операций, которые позволят перейти с этапа A на этап B.
Перед тем как импортировать контент в игровой движок, над ним работают в особых программах — это может быть Maya, серия приложений Substance 3D, Marmoset Toolbag и другие. И хотя у каждой компании существует свой подход к созданию цифрового контента, Blender в списке подобных программ встречается крайне редко — в основном его используют небольшие инди-студии.
И если художник выбирает в качестве основного инструмента программу, которая не вписывается в пайплайн компании, где он работает, ему предстоит столкнуться со множеством технических нюансов и потенциальных сложностей.
В своём докладе Маттиас выделил три ключевых момента, возникающих при работе с Blender вне общего пайплайна:
- Совместная работа. Чтобы всем участникам процесса было комфортно работать друг с другом, должна быть возможность быстро импортировать ассеты, созданные в Blender, в программы общего пайплайна — и так же просто экспортировать их обратно в Blender для изменений.
- Совместимость. Необходимо чётко понимать специфику переноса данных — и быть уверенным, что ассеты без ошибок можно перемещать из одного софта в другой.
- Высокое качество. Важно соответствовать общему уровню: это касается не только визуальной привлекательности ассета, но и его соответствия техническим требованиям.
Далее мы рассмотрим каждый из этих пунктов в подробностях.
Совместная работа
Работая в коллективе, где Blender не включена в общий пайплайн, важно помнить о характеристиках, которыми должен обладать ассет, созданный в чужеродной программе.
Доступность. Работая в команде, необходимо убедиться, что у каждого участника проекта есть доступ к файлу, одинаковые версии приложений и возможность делиться данными в GitHub, Perforce или других аналогичных репозиториях. Если компания всё же использует Blender вне общего пайплайна, у неё могут быть дополнительные инструменты для быстрой проверки и утверждения ассетов.
Удобство в применении. Созданный в Blender контент должен считываться без ошибок и свободно интегрироваться в программы. В качестве примера можно привести интуитивное размещение ассетов из Каталога ресурсов (Asset Browser) в сцену Unreal Engine 5 методом перетаскивания.
Редактирование. Не менее важно убедиться, что любой участник проекта сможет внести изменения в созданный ассет.
Один из самых важных аспектов пайплайна заключается в том, что в нём существует определённая классификация данных. В своём докладе Маттиас выделяет:
- Рабочие данные (Work Data), то есть файл, где художник создаёт ассет. В данном случае это файл с расширением .blend;
- Исходные данные (Source Data) — готовый контент, экспортированный в универсальный формат FBX или другой формат, обусловленный стандартами производства. В файле оставляют только самые важные элементы.
Приведём пример. Дизайнеру уровня или художнику по освещению нужен не BLEND-файл, а готовый файл с расширением .fbx, так как эти специалисты работают непосредственно в движке.
Примечание
В русском языке термины «рабочий файл» и «исходный файл» имеют прямо противоположные значения («исходный» — это первоначальный, оригинальный, а «рабочий» — это тот, который получился в результате изменений). И пусть терминология может различаться, принцип классификации данных не меняется. Поэтому во избежание путаницы в этом материале контент в рамках конкретной программы мы обозначим как исходный файл или исходник (то, что выше называется Work Data), а универсальный контент для экспорта — рабочий файл (то, что выше указано как Source Data).
На схеме ниже можно увидеть стандартную конвертацию данных на протяжении всего пайплайна. Исходники (модели и текстуры) конвертируются в промежуточный формат, который может распознать игровой движок. И уже потом сам игровой движок сохраняет их в проекте, используя собственные расширения файлов.
Работа с файлами
У специалиста, работающего в Blender, есть несколько вариантов действий.
- Экспорт данных из BLEND-файла напрямую в движок.
Самый простой способ, так как в этом случае не придётся взаимодействовать с другим ПО. Нужно только экспортировать файл для загрузки в движок: модели — в формате FBX, запечённые текстуры — в формате TGA или PNG.
- Экспорт исходных данных для промежуточного этапа.
В этом случае у специалиста есть BLEND-файл, который он конвертирует в FBX для различных манипуляций.
- Использование исходных файлов для создания цифрового контента.
Эта опция характерна для крупных проектов. И сам пайплайн в данном случае может быть самым разным.
Расширение пайплайна. Например, объект из Blender могут экспортировать в Maya, чтобы провести определённые итерации в рамках корпоративного пайплайна, а затем перенести в игровой движок. Таким образом связка расширяется и выходит за пределы BLEND — FBX.
Недостаток такого подхода в том, что контент сложнее итерировать из-за множества этапов. Но есть и другой способ, предложенный Маттиасом.
Параллельное использование цифрового контента. Принцип заключается в том, что ассет всегда можно изменить, экспортируя содержимое из Blender в предусмотренный пайплайном софт (например, в ту же Maya) и затем импортируя обратно. Таким образом можно вносить правки в ассет до того, как он попадёт в движок.
Такой подход актуален для проектов-долгостроев, так как процесс создания контента в этом случае растягивается на несколько лет, и некоторые данные спустя время могут стать неактуальными. При наличии исходных файлов и возможности параллельного редактирования в разных программах художник может вернуться к начальной точке даже год спустя и внести в ассет необходимые изменения.
Стандарты хранения BLEND-файлов
Когда необходимо экспортировать или передать BLEND-файл в рамках рабочего процесса, следует придерживаться трёх основных правил.
- Стандартизированная структура. В Blender она порой бывает довольно сложной, достаточно вспомнить иерархию коллекций. Когда контент после экспорта получает человек, не знакомый со спецификой Blender, он должен чётко понимать содержимое элементов сцены.
- Независимое содержимое (без связанных ассетов из других BLEND-файлов). Это позволит поделиться с коллегами всего одним файлом без необходимости ссылаться на другой контент, также созданный в Blender.
- Чёткое обозначение элементов для экспорта в аутлайнере. В сцене могут присутствовать вспомогательные объекты (к примеру, меши для булевых операций), которые не нужны в итоговом контенте. Пример корректного оформления элементов в аутлайнере можно увидеть на слайде ниже, где представлено содержимое BLEND-файла Маттиаса.
В аутлайнере проекта можно заметить много коллекций, отмеченных разными цветами. В соответствии с легендой слева, в синей коллекции собраны low-poly-модели, которые можно экспортировать для запекания. В жёлтой — high poly, которые также задействованы в этом процессе. Коллекция, отмеченная зелёным цветом, содержит mid-poly-модели, а также элементы, задействованные в сборке различных вариаций ассетов (в данном случае ветки дерева). В оранжевой коллекции находятся различные вариации деревьев. И наконец, в красной представлено несколько видов ассета для экспорта.
На кадре выше можно заметить, что все комплексные объекты в сцене привязаны к Пустышке (Empty). Маттиас практикует этот лайфхак для быстрого масштабирования, а также размещения объектов в сцене, используя Пустышку (Empty) в форме Куба (Cube).
Сравним классическую систему экспорта объектов с новой системой экспорта коллекций.
При стандартном подходе экспорта объектов в Blender, то есть при действии Файл (File) — Экспортировать (Export), могут возникнуть сложности, так как в настройках необходимо выбрать, какие именно объекты необходимо экспортировать. К тому же в меню находится много настроек, в которых легко запутаться.
С новой функцией Exporters во вкладке Коллекции (Collection Properties) можно автоматически экспортировать всю коллекцию объектов, не прибегая к дополнительным настройкам, так как они уже заложены в выбранном содержимом. Всё, что нужно, — просто отметить элементы, которые должны быть в сцене, и нажать кнопку Export All. Полученный файл в формате FBX можно сразу отправить коллеге, и у того загрузится сцена со всеми выбранными ранее настройками.
Вместо вышеописанных операций с экспортом также можно прибегнуть к различным аддонам для конвертации данных, но в этом случае необходимо проследить, чтобы их также установил и получатель файла. Поэтому Маттиас считает, что лучше оставить способ экспорта простым и использовать функции, изначально заложенные в Blender.
Ознакомившись со всеми нюансами экспорта, рассмотрим примеры оптимизации вывода данных из Blender в другие приложения.
Совместимость
Чтобы показать специфику этого аспекта, Маттиас взял из личного проекта модель мюльной машины для производства хлопка. Объект достаточно масштабный и содержит много различных деталей, в том числе экземпляров (инстансов) — то есть зависимых копий.
Арт — это набор данных
Художник отмечает, что в контексте комплексных моделей важно абстрагироваться от художественной цели и представить созданный объект в виде набора данных. Эти данные необходимо перенести из точки A в точку B и сохранить всю заложенную в них информацию. Как и в случае с ассетами деревьев из предыдущей главы, у станка есть чёткая иерархия коллекций объектов с определёнными характеристиками, включая параметры Трансформации (Transform).
Данные полигональной сетки включают следующие составляющие:
- Топологию — Вершины (Vertices), Рёбра (Faces) и Грани (Faces). Прочие структуры — например, кривые — для игрового движка также конвертируют в полигональную сетку.
- Нормали — нормали граней, известные как Face Normals, в которых одна сторона грани рендерится, а другая нет. Также есть нормали вершин — Vertex Normals.
Стоит рассказать немного подробнее о специфике переноса нормалей вершин, так как с этим процессом могут возникнуть сложности. Так, в гифке, расположенной ниже, изначально представлен вариант проекта с «поломанными» нормалями. Подключение геометрического нода, регулирующего остроту углов, значительно улучшило вид объекта, а после подключения модификатора Взвешенная нормаль (Weighted Normal) шейдеры корректно ложатся на объект даже без использования карт нормалей.
Добившись оптимального результата, необходимо убедиться, что все эти данные корректно перенесутся в движок. Но при дальнейшем наложении карт нормалей могут возникнуть сложности.
У нормалей вершин существует своя система координат переноса текстуры в мировое пространство, где X — тангент, Y — битангент, и Z — нормаль. Векторы X и Y определяют, как интерпретировать рельеф поверхности и шейдинг в целом. Если знать об этом, понять причину некорректного наложения нормалей станет проще.
Большинство современных программ для 3D-моделирования и игровых движков использует векторное пространство битангента, то есть Y+ или Y−. Список софта и пример ошибки с синхронизацией векторного пространства можно увидеть на слайде ниже.
Важно понимать, что в данном случае не имеет значения, на какое пространство Y ориентируется программа — на + или − (Substance поддерживает оба варианта). Главное — инвертировать зелёный канал в карте нормалей, отвечающий за выпуклость/вогнутость, при необходимости. В большинстве программ уже встроена эта опция, но также операцию можно выполнить и в графическом редакторе — например, в Photoshop.
Из списка выше видно, что существует много программ, которые поддерживают систему координат Y+ или Y−. К слову, в приложениях Substance 3D используют терминологию OpenGL или DirectX, подразумевающую те же самые векторы. Из всего этого можно сделать вывод, что если нормали в другой программе имеют выпуклую поверхность вместо вогнутой, то стоит обратить внимание на специфику векторного пространства данного софта.
Ещё одна загвоздка может возникнуть при использовании UV-координат, которые отвечают за распределение текстур на мешах. В проекте может существовать несколько таких UV-развёрток, закреплённых за разными сегментами. В результате могут образоваться перекрытия. К тому же у каждого материала объекта могут быть свои UV-координаты.
В примере Маттиаса ниже есть отдельная UV-развёртка, которая охватывает весь объект. А также отдельная UV-развёртка для наложения карт освещения или масок, если в процессе шейдинга возникнет необходимость наложения дополнительного слоя на весь объект. При этом, когда художник выбирает один из мешей во вьюпорте, в окне UV отображается только развёртка, закреплённая конкретно за выделенным сегментом, без отображения сторонних UV-координат.
Для упаковки UV Маттиас использует аддон UVPackmaster.
Сложные объекты удобно подразделять на логические сегменты и визуализировать в виде цветных материалов. Этот подход не только облегчает считываемость в работе, но и помогает определить, сколько наборов материалов потребуется для текущего объекта в целом.
Дополнительные данные
В зависимости от специфики движка вам могут понадобиться опциональные данные:
- набор уровней детализации, подготовленный художником;
- данные физики (коллайдеры, физика твёрдых тел);
- точки соприкосновения, известные как Attachment Points, которые определяют, как меш будет взаимодействовать с объектами и могут ли те остаться на его поверхности, как в сцене с цветными кубиками ниже.
Рассмотрим основные сложности, с которыми может столкнуться художник при дальнейшем экспорте.
Причины возможных неполадок
Перенос всех данных в игровой движок
Как уже упоминалось ранее, данные переносятся из BLEND-файла в другие программы или напрямую в игровой движок. И чаще всего проблема может возникнуть на стадии импорта или экспорта. Самый простой способ выявить причину ошибочного отображения контента — попробовать вновь импортировать ассет в Blender (то есть сразу после экспорта из BLEND-файла). Если после реимпорта объект загрузился некорректно — значит, проблема не в специфике сторонних программ и не в движке.
На примере выше видно, что шейдинг модели выглядит корректно, но в аутлайнере сломана цепочка иерархии элементов. И можно сделать вывод, что чем больше данных содержит объект, тем сложнее найти причину проблемы и проанализировать все составляющие ассета. Поэтому прежде чем экспортировать объект, стоит максимально упростить данные:
- найти все экземпляры;
- конвертировать их в меши;
- применить все модификаторы, за исключением Взвешенной нормали (Weighted Normal);
- проверить, есть ли отрицательные значения в параметрах Трансформации (Transform), и применить трансформации: Правка (Edit) — Применить (Apply) — Трансформации (Transform);
- объединить все элементы.
После всех этих манипуляций количество данных заметно сократится, и их станет проще анализировать.
На слайде выше Маттиас упростил ранее упомянутый объект, в том числе применил трансформации. После этого действия на некоторых сегментах нормали граней стали отображаться с изнаночной стороны. Это связано с тем, что у некоторых сегментов до применения операции были отрицательные значения в пункте Масштаб (Scale).
Также после объединения элементов осталось много лишних материалов, которые больше не нужны. Их необходимо удалить из общего списка в настройках материала.
В разделе UV-карты (UV Maps) поменялись названия UV-развёрток. Такое иногда встречается, когда разным UV-картам дают одно и то же название. В этом случае необходимо привести в порядок атрибуты UV-развёрток и дать им корректные названия, чтобы игровой движок смог их распознать. При объединении объектов в один ассет алгоритмы Blender способны распределить все детали в одном наборе.
Если речь идёт о создании ассетов высокого качества, после описанной выше операции могут потребоваться дополнительные правки в топологии и самой UV-развёртке. Эту тему мы разберём чуть ниже.
Осмотр ассета в игровом движке
Закончив со всеми перечисленными выше манипуляциями, необходимо проверить ассет в игровом движке. Первое, на что нужно обратить внимание, — настройки трансформации и экспорта в Blender. В программе существует ряд опций, и порой наиболее подходящий вариант для экспорта в движки приходится искать экспериментальным путём — либо смотреть видеоуроки в Сети. Иногда ситуация упрощается, если в движке есть настройки импорта, где можно откорректировать параметры трансформации, как, например, в Unreal Engine.
Но на практике бывают случаи, когда даже при указании корректных данных о трансформации настройки могут не сработать. В практике Маттиаса встречалось несколько подобных случаев во время экспорта контента в Unreal Engine и Unity. При экспорте из Blender художник учитывал все параметры масштабирования, указав размер 1×1×1, но после импорта в Unity движок по умолчанию выставил объекту масштаб величиной 100×100×100 единиц.
Если у вас встречаются аналогичные проблемы с конвертацией масштабирования при экспорте, Маттиас рекомендует привязать к объекту Пустышку (Empty) в виде куба, вызвать вкладку Инструмент (Tool) кнопкой N и в разделе Трансформировать (Transform) поставить галочку напротив пункта Влиять только на (Affect Only) Родители (Parents). И после этого можно экспортировать ассет в движок — трансформации в Unity будут отображаться корректно. Этот лайфхак Маттиас открыл для себя много лет назад и пользуется им до сих пор.
К тому же, как уже отмечалось ранее, использовать Пустышки (Empty) довольно удобно в целом, так как с их помощью можно обозначить точку опоры ассета.
Обзор ассета во время основного процесса создания цифрового контента
Ранее уже упоминалось, что ассет, созданный в Blender, может проходить и через другие программы, которые студия задействует в своём пайплайне при создании цифрового контента. И на этом этапе также существуют свои нюансы.
Для минимизации рисков возникновения проблем при экспорте Маттиас рекомендует воспользоваться обратным экспортом. Создайте самый простой ассет в основной программе (например, в Maya), проведите его через весь пайплайн для дальнейших манипуляций, а затем импортируйте в Blender. Таким образом у вас появится образец с готовыми стандартами данных, которые необходимо воссоздать в Blender. И в результате получится своего рода реверс-инжиниринг на основе цифрового контента, созданного в рамках пайплайна компании.
Самые распространённые проблемы при экспорте в другие программы
В большинстве компаний все манипуляции с игровыми ассетами в рамках пайплайна проводятся в Maya. Поэтому Маттиас разобрал специфику импорта в другие программы на примере этого софта. Сама подготовка к экспорту во многом схожа с аналогичным процессом, когда ассет готовят для переноса в игровой движок. Впрочем, в контексте приложений есть несколько нюансов, на которые стоит обратить внимание.
- Настройки трансформации. Здесь работает тот же подход, что и в случае экспорта в игровые движки.
- Различия в иерархии. Группы в Maya отличаются по структуре от коллекций Blender. Чтобы корректно сопоставить содержание, лучше проконсультироваться с техническими художниками студии.
- Специфика наименований. В Maya нельзя давать объекту и его составляющим одни и те же имена. Например, у объекта Cube не может быть материала Cube, в противном случае программа сгенерирует случайное название, что осложнит работу с контентом. Также стоит избегать использования специфических знаков вроде ».» или «|».
- Дублирование данных. Как правило, это происходит с материалами.
Упрощение контента с помощью геометрических нодов
В последнее время Маттиас стал практиковать следующий подход с использованием геометрических нодов: с их помощью он начал автоматизировать процесс упрощения структуры ассета для последующего экспорта. На основе связки нодов он создал собственный модификатор, который заменяет любой созданный меш готовой коллекцией. Работать с ним достаточно просто, независимо от геометрии ассета.
Чтобы создать связку геометрических нодов, нужно открыть меню Geometry Nodes, затем нажать кнопку Создать (+New). И на основе базовой связки Вход группы (Group Input) — Выход группы (Group Output) следует расширить цепочку компонентов.
Схема Маттиаса выглядит следующим образом. Вход группы (Group Input) надо связать с Collection Info (нод автоматически создаётся путём перетаскивания ярлыка коллекции в область графа), а его, в свою очередь, — с нодом Realize Instances (набирается в строке поиска при вытягивании нити из слота). Также необходимо отметить параметры, указанные на скриншоте ниже, и соединить с Выходом группы (Group Output).
Этот кастомный модификатор получает информацию от коллекции и преобразует экземпляры. К связке при желании можно добавить и другие функции.
Для наглядности в примере ниже Маттиас скрыл все коллекции и создал обычную плоскость. Художник применил к ней кастомную связку, нажав на кнопку Добавить модификатор (Add Modifier) и выбрав модификатор из списка в категории Geometry Nodes.
Примечательно, что действие фактически дублирует все манипуляции с подготовкой ассета на экспорт, о которых художник упоминал ранее, а сам процесс происходит намного быстрее.
У этого подхода есть своя специфика. В частности, Маттиас заметил следующие нюансы:
- Экземпляры сами по себе не экспортируются и нуждаются в преобразовании в геометрию.
- Преобразование (отмеченная галочка Realize All в ноде Realize Instances) сводит на нет действие ранее применённого модификатора Взвешенная нормаль (Weighted Normal), что можно увидеть в гифке ниже. Возможно, это баг, но в любом случае данный модификатор необходимо применить снова.
- Ограниченное отображение данных. Несмотря на то, что во вьюпорте материалы отображаются на объекте корректно, а UV-развёртка не изменилась, в самих настройках данные отсутствуют. Чтобы они появились, необходимо применить все модификаторы. Для этого следует навести курсор на поле модификатора и нажать Ctrl + A или выбрать опцию Применить (Apply), нажав на стрелку возле названия модификатора.
Чтобы в разделе модификаторов появилось меню с кнопкой Применить всё (Apply All), как у Маттиаса в кадрах выше, необходимо установить аддон Modify Tools.
Примечание
Применение модификаторов необходимо только для анализа составляющих ассета (то есть для проверки материалов, UV и так далее). Если ассет пойдёт на экспорт, это делать необязательно — достаточно просто отметить соответствующую опцию в настройках экспорта в разделе Геометрия (Geometry).
- Производительность может ухудшиться, особенно если сцена очень масштабная.
Ознакомившись с нюансами работы в Blender в контексте пайплайна студии, далее рассмотрим, как работать над ассетами в AAA-играх.
Создание ассета высокого качества
Работа с комплексной структурой объектов
В процессе создания подобного контента важно следить за общей сложностью конструкции. Процесс начинается с простых форм и определения их размеров, а затем дорабатывается дизайн модели.
От конструкции отделяют элементы, которые можно использовать повторно, что в итоге приводит к созданию экземпляров. Термин «экземпляр», или его аналог Instance в англоязычных программах, наверняка знаком многим 3D-художникам. Например, в Blender можно создать дубликат объекта комбинацией Alt + D, при этом у копии сохранятся те же данные, что и у оригинала.
Маттиас активно использует в работе экземпляры коллекций. За счёт них можно легко продублировать содержимое коллекций в сцене. Такой экземпляр можно создать в сцене, нажав Shift + A — Добавить (Add) — Экземпляр коллекции (Collection Instance) и далее выбрав желаемую коллекцию из списка. Плюс такого подхода в том, что можно по-разному манипулировать различными элементами.
Коллекции в сцене удобно размещать, привязав к ним Пустышку (Empty). В гифке ниже Маттиас открыл настройки Коллекции (Collection Properties), затем развернул вкладку в параметре Создание экземпляров (Instancing) в пункте Смещение экземпляра (Instance Offset) и выбрал Set Offset from Object. Таким образом он установил смещение экземпляра коллекции на основе положения активного объекта.
Модель станка Маттиаса, которая неоднократно демонстрировалась ранее на слайдах, также состоит из экземпляров коллекций. В гифке ниже представлены по отдельности все элементы, из которых художник собрал всю конструкцию.
В работе Маттиас использует несколько техник, упрощающих работу с ассетами. У него есть оператор, написанный на Python, который отключает связь расположения экземпляра ассета по отношению к оригинальному объекту. Необходимость в операторе возникла из-за того, что в процессе работы при перемещении какого-либо объекта экземпляры тоже начинали смещаться. И чтобы упростить себе задачу, Маттиас выделяет Пустышку (Empty), закреплённую за объектом, который нужно переместить, и нажимает Set the collection offset.
Примечание
В своём докладе Маттиас не упоминал, как написать подобный скрипт. Впрочем, все его наработки, в том числе скрипты для управления коллекциями, можно найти на GitHub.
Создание иерархий и вариаций
У сложных объектов может быть несколько тысяч элементов, а, как нам уже известно, перед экспортом необходимо упростить структуру. Ранее Маттиас упрощал объекты с помощью геометрического нода, о котором упоминалось ранее. Но проблема в том, что после преобразования экземпляров в меши ломалась структура объекта. Как итог — тысячи объектов разбиваются по разным категориям и ID-материалам.
Экспериментируя, художник нашёл способ, как с помощью всё того же геометрического нода упорядочить иерархию объекта и разделить его на логические части. Маттиас предварительно распределил типы деталей по разным коллекциям и вместо преобразования всего объекта начал преобразовывать экземпляры из разных коллекций, а затем отделять некоторые элементы или изменять их.
Таким образом можно создать несколько вариаций одного и того же меша и экспортировать выбранный дизайн в игровой движок.
Внесение изменений в реальном времени
Ещё один плюс в этом подходе — возможность вносить в коллекцию определённые изменения. Например, добавить некоторым элементам хаотичности с помощью функции Случайная трансформация (Randomize Transform), которую можно найти во вкладке Объект (Object) — Трансформация (Transform).
Все выполненные манипуляции распространяются и на остальные экземпляры в ассетах, которые можно в дальнейшем экспортировать в игровой движок или другое ПО для 3D-моделирования.
Моделирование и UV
Полигональная сетка изначально должна быть максимально простой: затем её структуру дорабатывают модификаторами, включая Логический (Boolean), Объёмность (Solidify), Триангуляция (Triangulate) и другие функции, которые требуются для данной модели.
Правда, этот процесс деструктивен. При изменении полигональной сетки необходимо доработать топологию и UV.
Этот процесс можно немного ускорить. Например, чтобы найти в полигональной сетке N-гоны, можно воспользоваться специальными аддонами. В качестве альтернативы в Blender заложена встроенная функция Выделить грани по количеству сторон (Select Faces by Sides). Она находится в Режиме редактирования (Edit Mode) во вкладке Выделение (Select) — Выделить всё по особенности (Select All By Trait) — Грани по количеству сторон (Faces by Sides). В Количестве вершин (Number of Vertices) указываем «4», а в Типе (Type) — Больше чем (Greater than). Таким образом в сетке покажутся все N-гоны.
В последних версиях Blender доступен улучшенный оверлей для отображения данных полигональной сетки во вьюпорте. Его можно найти в режиме редактирования в меню отображения вьюпорта (значок сетки). В режиме UV-развёртки также есть свой полезный оверлей. Интерфейс всех вышеперечисленных функций можно увидеть на кадре ниже.
Для проверки корректного отображения нормалей Маттиас рекомендует использовать MatCaps в настройках вьюпорта. Подробнее об этой функции можно узнать в одном из наших материалов.
Ознакомившись с теорией, далее рассмотрим, как ассет, созданный в Blender, попадает в производство AAA-проекта.
Примеры ассетов, задействованных в производстве
В качестве первого примера Маттиас продемонстрировал модели сценических ящиков в Alan Wake 2. Несмотря на то, что созданием подобного реквизита в проекте занимались hard-surface-моделлеры, художнику пришлось подключиться к созданию ассета из-за ограниченных ресурсов и времени команды.
Маттиас начал с моделирования примитивной формы, которую сразу же экспортировал в движок, чтобы убедиться, что ассет разместится на уровне корректно. Затем он разделил элементы объектов на отдельные компоненты, которые можно использовать несколько раз (например, замки, колёса и другие детали).
На гифке ниже можно увидеть, что в наборе коллекций Маттиаса можно быстро заменить high-poly-элементы на low poly, применив соответствующие экземпляры коллекции.
Благодаря вышеупомянутой связке геометрических нодов художник может экспортировать ассет в движок с любой точки производства — от момента с прототипом до этапа с высокополигональной моделью или промежуточным вариантом.
По этому же принципу можно быстро переназначить материалы с одной категории меша на другую. Например, у high poly могут быть только ID-материалы, которые не нужны для производства.
Для создания ассетов стеллажей в комнате архивов из дополнения Alan Wake 2: The Lake House Маттиас уже полноценно применял свой подход. На скриншоте ниже можно увидеть базовые модели шкафов и стеллажей, которые он загружал в движок, чтобы проверить масштабирование.
И по аналогии с прошлыми примерами в BLEND-файле этого ассета находились коллекции с high-poly-, low-poly- и mid-poly-вариациями.
Затем Маттиас распределил объекты по коллекциям и применил на них геометрический нод, чтобы объединить меши. После этих операций он мог отправить любую вариацию своим коллегам, а те, в свою очередь, благодаря чёткой структуре могли быстро определиться, какой ассет необходимо экспортировать в движок. Также при необходимости он мог быстро изменить дизайн ящиков, и эти изменения применялись на все стеллажи.
Ниже можно увидеть, как ассеты стеллажей выглядят в игре.
Итог
Пару лет назад наша редакция разбирала причины, мешающие Blender стать отраслевым стандартом. Тем не менее в рамках той статьи мы выяснили, что многие российские студии не против взять на работу моделлера, которому комфортнее работать в Blender. А опыт и наработки спикера текущего доклада доказывают, что к Blender лояльно относятся и крупные зарубежные студии.
Стоит уточнить, что Маттиас не просил своих коллег из Remedy перестроить пайплайн из-за своих предпочтений. Но художник очень рад, что компания позволила ему работать в софте, в котором ему по-настоящему комфортно и где он может достичь наилучшего результата.