Оффтоп Стас Шиловский
486

Создание джипа «Виллис»

Martin Ostrolucky и Rudolf Herstek, основатели студии Cassa Game Industry, рассказали о создании модели знаменитого джипа «Виллис» времен Второй мировой войны.

В закладки

О проекте

Джип «Виллис» был одним из самых массовых транспортных средств Второй мировой. Мы создали первую 3D-модель автомобиля в 2013 и с тех пор она была несколько раз переработана, превратившись в полноценную модель для AAA-игры. Вы можете видеть, как по мере развития наших навыков модель становилась все более и более качественной:

Цель и референсы

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

3D-моделирование

Для реально существующих автомобилей и других средств транспорта почти всегда можно найти чертежи. Сайты вроде the-blueprints.com помогут вам выбрать дизайн ключевых элементов конструкции. В идеале чертеж должен демонстрировать объект со всех сторон.

Хай-поли модель

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

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

Сначала мы создали главные формы, а затем перешли к более мелким. В большинстве случаев создавать элементы из листового металла лучше всего из плоскости. Сначала вы деформируете ее, опираясь на чертеж, а затем используете Shell Modifier, чтобы добавить толщину. Чтобы сделать плоскость округлой мы использовали Turbosmooth с 2-3 уровнями сабдива.

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

Например, давайте посмотрим, как мы создавали покрышку. Мы начали с плоскости, на которой смоделировали один сектор шины. Поскольку этот паттерн повторяется 80 раз, мы просто сделали нужное количество копий.

С помощью функции Weld мы объединили все элементы и добавили два модификатора Bend. Первый нужен для того, чтобы сделать поверхность шины выпуклой, а второй — чтобы создать из плоскости окружность. В последнюю очередь мы использовали Weld Vertices. Если у вас возникают сложности с замыканием окружности, добавьте Reset Xform и правильно выставьте пивот объекта перед использованием модификатора Bend.

В итоге мы получили вот такую покрышку:

Объекты, созданные из ткани ( например, обивка сидений или кожух рычага переключения передач) лучше всего делать в Zbrush. Перед экспортом хай-поли модели из Zbrush воспользуйтесь Decimation Master. Он значительно сократит полигонаж без визуальных искажений, что упростит вам процесс запекания текстур.

Лоу-поли модель

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

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

Модель А: вы видите, что топология подходит для куба, но она создает жесткие грани на плоскости и у основания куба. Решением проблемы может быть добавление куба как отдельного элемента (В), но тогда будет не хватать фаски в месте соединения куба с плоскостью. Если наличие перехода между двумя формами важно, и вы не можете использовать дополнительные эдж лупы, то вы можете создать геометрию фаски отдельно (С).

Развертка модели

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

При компоновке UV-шеллов мы рекомендуем начинать с больших объектов, а потом переходить к более мелким, которые можно разместить на свободных участках.

Запекание текстур

Перед началом запекания необходимо убедиться, что вы придерживались следующих правил:

  • Швы UV-развертки сделать с учетом топологии объекта.
  • Группы сглаживания назначить с учетом использования модификатора Unwrap.
  • Использовать команду Explode на лоу- и хай-поли моделях, чтобы избежать артефактов.

После Explode мы экспортировали обе модели в формате .fbx и запекли их в Xnormal.

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

Мы загрузили карту нормалей и модель джипа в формате .fbx в Substance Painter и запекли дополнительные карты — Ambient, Curvature, World Space, Position и Thickness. Вместо того, чтобы запекать по хай-поли модели, мы использовали импортированную карту нормалей, потому что уже откорректировали все ее артефакты. Таким образом, мы предупредили возникновение артефактов на дополнительных картах.

При запекании дополнительных карт с карты нормалей не забудьте убрать галочку с Normal и отметить Use Low Poly Mesh as High Poly Mesh.

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

Благодаря референсам мы поняли из каких материалов сделан джип, какова их структура, где собирается грязь, как выглядит детализация поверхностей и какие части машины наиболее подвержены повреждениям. Для текстурирования мы использовали Substance Painter 2.6.2.

Перед импортом джипа в Substance Painter мы разделили UV развертку на два текстурных набора – Джип (непрозрачный материал) и Окна + Свет (светопрозрачный материал).

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

Мы начинаем текстурирование с назначения базовых материалов. Вы можете использовать те, что находятся на полке или загрузить их на Substance source. Сначала мы назначили каждому элементу джипа (кузов, колеса, сиденья) только один материал – металл, листовой металл, резина, пластик, кожа и тд, и создали 18 основных групп.

У нас получилась первая версия материалов. Чтобы сохранить логику текстурирования, мы шли от макро- к микроструктуре. Иными словами, сначала мы определились с материалами, а затем добавляли детализацию.

Так мы организовали слои в группе «Сиденья»:

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

Мы хотели сделать нашу модель уникальной. С помощью кистей и проецирования мы перерисовали маски. Таким образом, они больше не выглядели сгенерированными и сделанными наугад.

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

Презентация и рендер

Чтобы определиться с презентацией модели, мы использовали референсы концептов и фото автомобилей. Это помогло нам выбрать положение камеры и освещение джипа. Для рендера мы использовали Vray.

Сначала мы не могли получить оптимальный цвет и настройки. Путем проб и ошибок мы выработали следующие правила:

  • В настройках Gamma and LUT установите Gamma Correction на 2.2, поставьте галочку для Gamma/LUT, Affect Color Selector и Material Editor.
  • Экспортируйте текстуры из Substance Painter с настройками для Vray. Используйте формат .tif 16bit.
  • Импортируйте карту Diffuse в 3ds Max cо значением Override 2.2.
  • Импортируйте остальные текстуры со значением Gamma Override 1.0 (Normal, Glossiness, Reflection, IOR, Height).
  • В параметрах BRDF выберите Microfacet GTR (GGX) – только для новых версий Vray.
  • Включите эффект Glossy Fresnel в настройках материалов Vray.
  • Вы можете использовать текстуру Height как карту Displacement, но это потребует больше ресурсов памяти при рендере.
  • Подключите импортированные текстуры: Diffuse=Diffuse map │ Reflection=Reflect map │ Glossiness=RGlossiness map │ IOR=Fresnel IOR map │ Bump (value 100)=VRayNormalMap=Normal map

Ниже вы видите настройки материалов Vray:

Мы использовали два светильника VRayLight, и один VRayLightDome с подключенной HDRI-картой для создания реалистичных отражений.

Подведение итогов

Не существует «наилучшего» или «универсального» способа создания игровой модели. Если вы замените хотя бы одну программу в пайплайне, это приведет к значительному его изменению со своими сильными и слабыми сторонами. Главное – это итоговый результат.

Спасибо за внимание. Удачи вам в мире моделирования и текстурирования!

Чтобы быть в курсе последних новостей про наши проекты, подписывайтесь на нашу страницу на Facebook, а если захотите связаться с нами, пишите на info@cassagi.com.

Оригинал статьи находится тут.

Подписывайтесь на нас в Facebook, Telegram, Vkontakte, Pinterest.

#3d #gamedev #making_of

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Стас Шиловский", "author_type": "self", "tags": ["gamedev","3d","making_of"], "comments": 7, "likes": 40, "favorites": 27, "is_advertisement": false, "subsite_label": "flood", "id": 29465, "is_wide": false, "is_ugc": true, "date": "Wed, 17 Oct 2018 15:11:26 +0300" }
{ "id": 29465, "author_id": 34176, "diff_limit": 1000, "urls": {"diff":"\/comments\/29465\/get","add":"\/comments\/29465\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/29465"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64955 }

7 комментариев 7 комм.

Популярные

По порядку

Написать комментарий...
2

Мне кажется под такими постами без этой картинки никак

Ответить
1

Ну ту скорее нюансы пайплайна для тех, кто умеет вертексы давить и кисточками в браше мазюкать. А в конце реклама пейнера - там заебатые маски, хохо! :D

Ответить
0

Блин, круто) Работаешь в геймдеве?

Ответить
0

Спасибо. Да, работаю.

Ответить
0

Спасибо за материал.

Ответить
0

Оп-па... Explode... что-то упустил я в своей жизни... но тут выходит, что лоуполи под эксплод не получится как-то дополнительно сшивать ради оптимизации и, напротив, нельзя совсем уж позволять себе крайности с хайполи. :)

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
В Steam появилась функция продажи
подержанных цифровых копий игр
Подписаться на push-уведомления