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

Как создавать ассеты в Blender, когда студия работает в других программах

Доклад Маттиаса Патшайдера, художника по окружению в Remedy Entertainment.

Иллюстрация: Оля Ежак для SKillbox Media

Арт-отделы многих крупных игровых студий не используют Blender при создании контента, так как у них зачастую уже есть ряд определённых программ, включённых в пайплайн. Если же начать интегрировать в этот процесс дополнительный софт, могут возникнуть самые разные сложности, и в результате разработка замедлится.

А что, если 3D-художник отлично работает в Blender и способен создавать контент в этой программе, не нарушая динамику общего рабочего процесса студии?

На Blender Conference 2024 художник по окружению в Remedy Entertainment Маттиас Патшайдер поделился своим опытом работы в Blender в рамках пайплайна, не предполагающего использование этой программы. Также он дал рекомендации, как при таких условиях взаимодействовать с командой, не усложняя общий процесс разработки. Делимся тезисами специалиста.

Полная версия доклада Маттиаса Патшайдера на Blender Conference 2024

Маттиас Патшайдер

Начал карьеру 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 не включена в общий пайплайн, важно помнить о характеристиках, которыми должен обладать ассет, созданный в чужеродной программе.

Личный проект Маттиаса — The Verdant Realms. В примерах, разобранных ниже, задействованы деревья из этой работы
Изображение: Matthias Patscheider / ArtStation

Доступность. Работая в команде, необходимо убедиться, что у каждого участника проекта есть доступ к файлу, одинаковые версии приложений и возможность делиться данными в GitHub, Perforce или других аналогичных репозиториях. Если компания всё же использует Blender вне общего пайплайна, у неё могут быть дополнительные инструменты для быстрой проверки и утверждения ассетов.

Удобство в применении. Созданный в Blender контент должен считываться без ошибок и свободно интегрироваться в программы. В качестве примера можно привести интуитивное размещение ассетов из Каталога ресурсов (Asset Browser) в сцену Unreal Engine 5 методом перетаскивания.

Кадр: Blender / YouTube

Редактирование. Не менее важно убедиться, что любой участник проекта сможет внести изменения в созданный ассет.

Один из самых важных аспектов пайплайна заключается в том, что в нём существует определённая классификация данных. В своём докладе Маттиас выделяет:

  • Рабочие данные (Work Data), то есть файл, где художник создаёт ассет. В данном случае это файл с расширением .blend;
  • Исходные данные (Source Data) — готовый контент, экспортированный в универсальный формат FBX или другой формат, обусловленный стандартами производства. В файле оставляют только самые важные элементы.
Кадр: Blender / YouTube

Приведём пример. Дизайнеру уровня или художнику по освещению нужен не BLEND-файл, а готовый файл с расширением .fbx, так как эти специалисты работают непосредственно в движке.

Примечание

В русском языке термины «рабочий файл» и «исходный файл» имеют прямо противоположные значения («исходный» — это первоначальный, оригинальный, а «рабочий» — это тот, который получился в результате изменений). И пусть терминология может различаться, принцип классификации данных не меняется. Поэтому во избежание путаницы в этом материале контент в рамках конкретной программы мы обозначим как исходный файл или исходник (то, что выше называется Work Data), а универсальный контент для экспорта — рабочий файл (то, что выше указано как Source Data).

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

Кадр: Blender / YouTube

Работа с файлами

У специалиста, работающего в Blender, есть несколько вариантов действий.

  • Экспорт данных из BLEND-файла напрямую в движок.

Самый простой способ, так как в этом случае не придётся взаимодействовать с другим ПО. Нужно только экспортировать файл для загрузки в движок: модели — в формате FBX, запечённые текстуры — в формате TGA или PNG.

Кадр: Blender / YouTube
  • Экспорт исходных данных для промежуточного этапа.

В этом случае у специалиста есть BLEND-файл, который он конвертирует в FBX для различных манипуляций.

  • Использование исходных файлов для создания цифрового контента.

Эта опция характерна для крупных проектов. И сам пайплайн в данном случае может быть самым разным.

Расширение пайплайна. Например, объект из Blender могут экспортировать в Maya, чтобы провести определённые итерации в рамках корпоративного пайплайна, а затем перенести в игровой движок. Таким образом связка расширяется и выходит за пределы BLEND FBX.

Кадр: Blender / YouTube

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

Параллельное использование цифрового контента. Принцип заключается в том, что ассет всегда можно изменить, экспортируя содержимое из Blender в предусмотренный пайплайном софт (например, в ту же Maya) и затем импортируя обратно. Таким образом можно вносить правки в ассет до того, как он попадёт в движок.

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

Кадр: Blender / YouTube

Стандарты хранения BLEND-файлов

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

  • Стандартизированная структура. В Blender она порой бывает довольно сложной, достаточно вспомнить иерархию коллекций. Когда контент после экспорта получает человек, не знакомый со спецификой Blender, он должен чётко понимать содержимое элементов сцены.
  • Независимое содержимое (без связанных ассетов из других BLEND-файлов). Это позволит поделиться с коллегами всего одним файлом без необходимости ссылаться на другой контент, также созданный в Blender.
  • Чёткое обозначение элементов для экспорта в аутлайнере. В сцене могут присутствовать вспомогательные объекты (к примеру, меши для булевых операций), которые не нужны в итоговом контенте. Пример корректного оформления элементов в аутлайнере можно увидеть на слайде ниже, где представлено содержимое BLEND-файла Маттиаса.
Кадр: Blender / YouTube

В аутлайнере проекта можно заметить много коллекций, отмеченных разными цветами. В соответствии с легендой слева, в синей коллекции собраны low-poly-модели, которые можно экспортировать для запекания. В жёлтой — high poly, которые также задействованы в этом процессе. Коллекция, отмеченная зелёным цветом, содержит mid-poly-модели, а также элементы, задействованные в сборке различных вариаций ассетов (в данном случае ветки дерева). В оранжевой коллекции находятся различные вариации деревьев. И наконец, в красной представлено несколько видов ассета для экспорта.

На кадре выше можно заметить, что все комплексные объекты в сцене привязаны к Пустышке (Empty). Маттиас практикует этот лайфхак для быстрого масштабирования, а также размещения объектов в сцене, используя Пустышку (Empty) в форме Куба (Cube).

Кадр: Blender / YouTube

Сравним классическую систему экспорта объектов с новой системой экспорта коллекций.

При стандартном подходе экспорта объектов в Blender, то есть при действии Файл (File) — Экспортировать (Export), могут возникнуть сложности, так как в настройках необходимо выбрать, какие именно объекты необходимо экспортировать. К тому же в меню находится много настроек, в которых легко запутаться.

С новой функцией Exporters во вкладке Коллекции (Collection Properties) можно автоматически экспортировать всю коллекцию объектов, не прибегая к дополнительным настройкам, так как они уже заложены в выбранном содержимом. Всё, что нужно, — просто отметить элементы, которые должны быть в сцене, и нажать кнопку Export All. Полученный файл в формате FBX можно сразу отправить коллеге, и у того загрузится сцена со всеми выбранными ранее настройками.

Сравнение способов экспорта
Скриншот: Blender / Blender Foundation

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

Ознакомившись со всеми нюансами экспорта, рассмотрим примеры оптимизации вывода данных из Blender в другие приложения.

Совместимость

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

Изображение: Matthias Patscheider / ArtStation

Арт — это набор данных

Художник отмечает, что в контексте комплексных моделей важно абстрагироваться от художественной цели и представить созданный объект в виде набора данных. Эти данные необходимо перенести из точки A в точку B и сохранить всю заложенную в них информацию. Как и в случае с ассетами деревьев из предыдущей главы, у станка есть чёткая иерархия коллекций объектов с определёнными характеристиками, включая параметры Трансформации (Transform).

Кадр: Blender / YouTube

Данные полигональной сетки включают следующие составляющие:

  • Топологию — Вершины (Vertices), Рёбра (Faces) и Грани (Faces). Прочие структуры — например, кривые — для игрового движка также конвертируют в полигональную сетку.
  • Нормали — нормали граней, известные как Face Normals, в которых одна сторона грани рендерится, а другая нет. Также есть нормали вершин — Vertex Normals.
Кадр: Blender / YouTube

Стоит рассказать немного подробнее о специфике переноса нормалей вершин, так как с этим процессом могут возникнуть сложности. Так, в гифке, расположенной ниже, изначально представлен вариант проекта с «поломанными‎» нормалями. Подключение геометрического нода, регулирующего остроту углов, значительно улучшило вид объекта, а после подключения модификатора Взвешенная нормаль (Weighted Normal) шейдеры корректно ложатся на объект даже без использования карт нормалей.

Кадр: Blender / YouTube

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

У нормалей вершин существует своя система координат переноса текстуры в мировое пространство, где X — тангент, Y — битангент, и Z — нормаль. Векторы X и Y определяют, как интерпретировать рельеф поверхности и шейдинг в целом. Если знать об этом, понять причину некорректного наложения нормалей станет проще.

Большинство современных программ для 3D-моделирования и игровых движков использует векторное пространство битангента, то есть Y+ или Y−. Список софта и пример ошибки с синхронизацией векторного пространства можно увидеть на слайде ниже.

Кадр: Blender / YouTube

Важно понимать, что в данном случае не имеет значения, на какое пространство Y ориентируется программа — на + или (Substance поддерживает оба варианта). Главное — инвертировать зелёный канал в карте нормалей, отвечающий за выпуклость/вогнутость, при необходимости. В большинстве программ уже встроена эта опция, но также операцию можно выполнить и в графическом редакторе — например, в Photoshop.

Из списка выше видно, что существует много программ, которые поддерживают систему координат Y+ или Y−. К слову, в приложениях Substance 3D используют терминологию OpenGL или DirectX, подразумевающую те же самые векторы. Из всего этого можно сделать вывод, что если нормали в другой программе имеют выпуклую поверхность вместо вогнутой, то стоит обратить внимание на специфику векторного пространства данного софта.

Ещё одна загвоздка может возникнуть при использовании UV-координат, которые отвечают за распределение текстур на мешах. В проекте может существовать несколько таких UV-развёрток, закреплённых за разными сегментами. В результате могут образоваться перекрытия. К тому же у каждого материала объекта могут быть свои UV-координаты.

В примере Маттиаса ниже есть отдельная UV-развёртка, которая охватывает весь объект. А также отдельная UV-развёртка для наложения карт освещения или масок, если в процессе шейдинга возникнет необходимость наложения дополнительного слоя на весь объект. При этом, когда художник выбирает один из мешей во вьюпорте, в окне UV отображается только развёртка, закреплённая конкретно за выделенным сегментом, без отображения сторонних UV-координат.

Для упаковки UV Маттиас использует аддон UVPackmaster.

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

В правой части кадра указаны настройки для отображения материалов по цветовым категориям
Кадр: Blender / YouTube

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

В зависимости от специфики движка вам могут понадобиться опциональные данные:

  • набор уровней детализации, подготовленный художником;
  • данные физики (коллайдеры, физика твёрдых тел);
  • точки соприкосновения, известные как Attachment Points, которые определяют, как меш будет взаимодействовать с объектами и могут ли те остаться на его поверхности, как в сцене с цветными кубиками ниже.
Кадр: Blender / YouTube

Рассмотрим основные сложности, с которыми может столкнуться художник при дальнейшем экспорте.

Причины возможных неполадок

Перенос всех данных в игровой движок

Как уже упоминалось ранее, данные переносятся из BLEND-файла в другие программы или напрямую в игровой движок. И чаще всего проблема может возникнуть на стадии импорта или экспорта. Самый простой способ выявить причину ошибочного отображения контента — попробовать вновь импортировать ассет в Blender (то есть сразу после экспорта из BLEND-файла). Если после реимпорта объект загрузился некорректно — значит, проблема не в специфике сторонних программ и не в движке.

Кадр: Blender / YouTube

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

  • найти все экземпляры;
  • конвертировать их в меши;
  • применить все модификаторы, за исключением Взвешенной нормали (Weighted Normal);
  • проверить, есть ли отрицательные значения в параметрах Трансформации (Transform), и применить трансформации: Правка (Edit) — Применить (Apply) — Трансформации (Transform);
  • объединить все элементы.

После всех этих манипуляций количество данных заметно сократится, и их станет проще анализировать.

Кадр: Blender / YouTube

На слайде выше Маттиас упростил ранее упомянутый объект, в том числе применил трансформации. После этого действия на некоторых сегментах нормали граней стали отображаться с изнаночной стороны. Это связано с тем, что у некоторых сегментов до применения операции были отрицательные значения в пункте Масштаб (Scale).

Кадр: Blender / YouTube

Также после объединения элементов осталось много лишних материалов, которые больше не нужны. Их необходимо удалить из общего списка в настройках материала.

Кадр: Blender / YouTube

В разделе UV-карты (UV Maps) поменялись названия UV-развёрток. Такое иногда встречается, когда разным UV-картам дают одно и то же название. В этом случае необходимо привести в порядок атрибуты UV-развёрток и дать им корректные названия, чтобы игровой движок смог их распознать. При объединении объектов в один ассет алгоритмы Blender способны распределить все детали в одном наборе.

Кадр: Blender / YouTube

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

Осмотр ассета в игровом движке

Закончив со всеми перечисленными выше манипуляциями, необходимо проверить ассет в игровом движке. Первое, на что нужно обратить внимание, — настройки трансформации и экспорта в Blender. В программе существует ряд опций, и порой наиболее подходящий вариант для экспорта в движки приходится искать экспериментальным путём — либо смотреть видеоуроки в Сети. Иногда ситуация упрощается, если в движке есть настройки импорта, где можно откорректировать параметры трансформации, как, например, в Unreal Engine.

Кадр: Blender / YouTube

Но на практике бывают случаи, когда даже при указании корректных данных о трансформации настройки могут не сработать. В практике Маттиаса встречалось несколько подобных случаев во время экспорта контента в Unreal Engine и Unity. При экспорте из Blender художник учитывал все параметры масштабирования, указав размер 1×1×1, но после импорта в Unity движок по умолчанию выставил объекту масштаб величиной 100×100×100 единиц.

Параметры трансформации объекта после импорта в Unity
Кадр: Blender / YouTube

Если у вас встречаются аналогичные проблемы с конвертацией масштабирования при экспорте, Маттиас рекомендует привязать к объекту Пустышку (Empty) в виде куба, вызвать вкладку Инструмент (Tool) кнопкой N и в разделе Трансформировать (Transform) поставить галочку напротив пункта Влиять только на (Affect Only) Родители (Parents). И после этого можно экспортировать ассет в движок — трансформации в Unity будут отображаться корректно. Этот лайфхак Маттиас открыл для себя много лет назад и пользуется им до сих пор.

Кадр: Blender / YouTube

К тому же, как уже отмечалось ранее, использовать Пустышки (Empty) довольно удобно в целом, так как с их помощью можно обозначить точку опоры ассета.

Обзор ассета во время основного процесса создания цифрового контента

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

Для минимизации рисков возникновения проблем при экспорте Маттиас рекомендует воспользоваться обратным экспортом. Создайте самый простой ассет в основной программе (например, в Maya), проведите его через весь пайплайн для дальнейших манипуляций, а затем импортируйте в Blender. Таким образом у вас появится образец с готовыми стандартами данных, которые необходимо воссоздать в Blender. И в результате получится своего рода реверс-инжиниринг на основе цифрового контента, созданного в рамках пайплайна компании.

Кадр: Blender / YouTube

Самые распространённые проблемы при экспорте в другие программы

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

  • Настройки трансформации. Здесь работает тот же подход, что и в случае экспорта в игровые движки.
  • Различия в иерархии. Группы в Maya отличаются по структуре от коллекций Blender. Чтобы корректно сопоставить содержание, лучше проконсультироваться с техническими художниками студии.
  • Специфика наименований. В Maya нельзя давать объекту и его составляющим одни и те же имена. Например, у объекта Cube не может быть материала Cube, в противном случае программа сгенерирует случайное название, что осложнит работу с контентом. Также стоит избегать использования специфических знаков вроде ».» или «|».
Примеры неправильного и правильного наименования элементов в аутлайнере Blender и то, как они отображаются после импорта в Maya
Кадр: Blender / YouTube
  • Дублирование данных. Как правило, это происходит с материалами.

Упрощение контента с помощью геометрических нодов

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

Чтобы создать связку геометрических нодов, нужно открыть меню Geometry Nodes, затем нажать кнопку Создать (+New). И на основе базовой связки Вход группы (Group Input) — Выход группы (Group Output) следует расширить цепочку компонентов.

Схема Маттиаса выглядит следующим образом. Вход группы (Group Input) надо связать с Collection Info (нод автоматически создаётся путём перетаскивания ярлыка коллекции в область графа), а его, в свою очередь, — с нодом Realize Instances (набирается в строке поиска при вытягивании нити из слота). Также необходимо отметить параметры, указанные на скриншоте ниже, и соединить с Выходом группы (Group Output).

Кадр: Blender / YouTube

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

Для наглядности в примере ниже Маттиас скрыл все коллекции и создал обычную плоскость. Художник применил к ней кастомную связку, нажав на кнопку Добавить модификатор (Add Modifier) и выбрав модификатор из списка в категории Geometry Nodes.

Демонстрация модификатора Маттиаса в действии
Кадр: Blender / YouTube

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

У этого подхода есть своя специфика. В частности, Маттиас заметил следующие нюансы:

  • Экземпляры сами по себе не экспортируются и нуждаются в преобразовании в геометрию.
  • Преобразование (отмеченная галочка Realize All в ноде Realize Instances) сводит на нет действие ранее применённого модификатора Взвешенная нормаль (Weighted Normal), что можно увидеть в гифке ниже. Возможно, это баг, но в любом случае данный модификатор необходимо применить снова.
Можно заметить, что в сцене шейдинг отображается корректно, но стоит отметить галочкой Realize All — нормали ломаются
Кадр: Blender / YouTube
  • Ограниченное отображение данных. Несмотря на то, что во вьюпорте материалы отображаются на объекте корректно, а UV-развёртка не изменилась, в самих настройках данные отсутствуют. Чтобы они появились, необходимо применить все модификаторы. Для этого следует навести курсор на поле модификатора и нажать Ctrl + A или выбрать опцию Применить (Apply), нажав на стрелку возле названия модификатора.
Кадр: Blender / YouTube

Чтобы в разделе модификаторов появилось меню с кнопкой Применить всё (Apply All), как у Маттиаса в кадрах выше, необходимо установить аддон Modify Tools.

Примечание

Применение модификаторов необходимо только для анализа составляющих ассета (то есть для проверки материалов, UV и так далее). Если ассет пойдёт на экспорт, это делать необязательно — достаточно просто отметить соответствующую опцию в настройках экспорта в разделе Геометрия (Geometry).

  • Производительность может ухудшиться, особенно если сцена очень масштабная.

Ознакомившись с нюансами работы в Blender в контексте пайплайна студии, далее рассмотрим, как работать над ассетами в AAA-играх.

Создание ассета высокого качества

Работа с комплексной структурой объектов

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

Построение общих форм конструкции
Кадр: Blender / YouTube

От конструкции отделяют элементы, которые можно использовать повторно, что в итоге приводит к созданию экземпляров. Термин «экземпляр», или его аналог Instance в англоязычных программах, наверняка знаком многим 3D-художникам. Например, в Blender можно создать дубликат объекта комбинацией Alt + D, при этом у копии сохранятся те же данные, что и у оригинала.

Создание экземпляров объектов
Кадр: Blender / YouTube

Маттиас активно использует в работе экземпляры коллекций. За счёт них можно легко продублировать содержимое коллекций в сцене. Такой экземпляр можно создать в сцене, нажав Shift + A — Добавить (Add) — Экземпляр коллекции (Collection Instance) и далее выбрав желаемую коллекцию из списка. Плюс такого подхода в том, что можно по-разному манипулировать различными элементами.

Создание экземпляров коллекции
Кадр: Blender / YouTube

Коллекции в сцене удобно размещать, привязав к ним Пустышку (Empty). В гифке ниже Маттиас открыл настройки Коллекции (Collection Properties), затем развернул вкладку в параметре Создание экземпляров (Instancing) в пункте Смещение экземпляра (Instance Offset) и выбрал Set Offset from Object. Таким образом он установил смещение экземпляра коллекции на основе положения активного объекта.

Кадр: Blender / YouTube

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

Кадр: Blender / YouTube

В работе Маттиас использует несколько техник, упрощающих работу с ассетами. У него есть оператор, написанный на Python, который отключает связь расположения экземпляра ассета по отношению к оригинальному объекту. Необходимость в операторе возникла из-за того, что в процессе работы при перемещении какого-либо объекта экземпляры тоже начинали смещаться. И чтобы упростить себе задачу, Маттиас выделяет Пустышку (Empty), закреплённую за объектом, который нужно переместить, и нажимает Set the collection offset.

Кадр: Blender / YouTube

Примечание

В своём докладе Маттиас не упоминал, как написать подобный скрипт. Впрочем, все его наработки, в том числе скрипты для управления коллекциями, можно найти на GitHub.

Создание иерархий и вариаций

У сложных объектов может быть несколько тысяч элементов, а, как нам уже известно, перед экспортом необходимо упростить структуру. Ранее Маттиас упрощал объекты с помощью геометрического нода, о котором упоминалось ранее. Но проблема в том, что после преобразования экземпляров в меши ломалась структура объекта. Как итог — тысячи объектов разбиваются по разным категориям и ID-материалам.

Кадр: Blender / YouTube

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

Кадр: Blender / YouTube

Таким образом можно создать несколько вариаций одного и того же меша и экспортировать выбранный дизайн в игровой движок.

Кадр: Blender / YouTube

Внесение изменений в реальном времени

Ещё один плюс в этом подходе — возможность вносить в коллекцию определённые изменения. Например, добавить некоторым элементам хаотичности с помощью функции Случайная трансформация (Randomize Transform), которую можно найти во вкладке Объект (Object) — Трансформация (Transform).

Кадр: Blender / YouTube

Все выполненные манипуляции распространяются и на остальные экземпляры в ассетах, которые можно в дальнейшем экспортировать в игровой движок или другое ПО для 3D-моделирования.

Моделирование и UV

Полигональная сетка изначально должна быть максимально простой: затем её структуру дорабатывают модификаторами, включая Логический (Boolean), Объёмность (Solidify), Триангуляция (Triangulate) и другие функции, которые требуются для данной модели.

Кадр: Blender / YouTube

Правда, этот процесс деструктивен. При изменении полигональной сетки необходимо доработать топологию и UV.

Деталь в режиме редактирования и её UV-развёртка
Кадр: Blender / YouTube

Этот процесс можно немного ускорить. Например, чтобы найти в полигональной сетке 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-развёртки также есть свой полезный оверлей. Интерфейс всех вышеперечисленных функций можно увидеть на кадре ниже.

Кадр: Blender / YouTube

Для проверки корректного отображения нормалей Маттиас рекомендует использовать MatCaps в настройках вьюпорта. Подробнее об этой функции можно узнать в одном из наших материалов.

Ознакомившись с теорией, далее рассмотрим, как ассет, созданный в Blender, попадает в производство AAA-проекта.

Примеры ассетов, задействованных в производстве

В качестве первого примера Маттиас продемонстрировал модели сценических ящиков в Alan Wake 2. Несмотря на то, что созданием подобного реквизита в проекте занимались hard-surface-моделлеры, художнику пришлось подключиться к созданию ассета из-за ограниченных ресурсов и времени команды.

Кадр: Blender / YouTube

Маттиас начал с моделирования примитивной формы, которую сразу же экспортировал в движок, чтобы убедиться, что ассет разместится на уровне корректно. Затем он разделил элементы объектов на отдельные компоненты, которые можно использовать несколько раз (например, замки, колёса и другие детали).

Кадр: Blender / YouTube

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

Кадр: Blender / YouTube

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

По этому же принципу можно быстро переназначить материалы с одной категории меша на другую. Например, у high poly могут быть только ID-материалы, которые не нужны для производства.

Для создания ассетов стеллажей в комнате архивов из дополнения Alan Wake 2: The Lake House Маттиас уже полноценно применял свой подход. На скриншоте ниже можно увидеть базовые модели шкафов и стеллажей, которые он загружал в движок, чтобы проверить масштабирование.

Кадр: Blender / YouTube

И по аналогии с прошлыми примерами в BLEND-файле этого ассета находились коллекции с high-poly-, low-poly- и mid-poly-вариациями.

Кадр: Blender / YouTube

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

Тот же самый проект в Maya
Кадр: Blender / YouTube

Ниже можно увидеть, как ассеты стеллажей выглядят в игре.

Итог

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

Стоит уточнить, что Маттиас не просил своих коллег из Remedy перестроить пайплайн из-за своих предпочтений. Но художник очень рад, что компания позволила ему работать в софте, в котором ему по-настоящему комфортно и где он может достичь наилучшего результата.

Любите игры? Попробуйте себя в геймдеве!

❓ Кто вы: геймдизайнер, разработчик, концепт-художник? Узнайте на бесплатном курсе

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

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

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