{"id":3848,"url":"\/distributions\/3848\/click?bit=1&hash=c73ad010e3b1f69a991b33d449a53ced396eb00d60200c75b4005510cdd28980","title":"\u00ab\u042f\u043d\u0434\u0435\u043a\u0441 \u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u043c\u00bb \u0438\u0449\u0435\u0442 \u043d\u0430\u0441\u0442\u0430\u0432\u043d\u0438\u043a\u043e\u0432. \u041c\u043e\u0436\u0435\u0442, \u044d\u0442\u043e \u0432\u044b?","buttonText":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c","imageUuid":"2d5b949a-5ac1-587d-aac5-43560e643b30","isPaidAndBannersEnabled":false}
Gamedev
Даниил Малянов

Стилизуем готовые модели под полигональный Low Poly в Maya + UE4

Рестайлинг

С чего все начиналось

Так как мы маленькая инди-студия, то нам интересно максимально сэкономить средств и получить при этом достойный результат. Мы разрабатываем на Unreal Engine, и, благодаря этому, нам доступно довольно много хороших бесплатных ассетов от Epic. Однако, поскольку визуал нашей игры основывается на сверхпопулярных паках Synty Studios в полигональном стиле, большинство прочих ассетов нам не подходят, если их не рестайлить.
В игре не хватало негуманойдных врагов, а среди пака Infinity Blade: Adversaries есть отличные паучки, медведь и волчара с мощными лапищами, у которых, в свою очередь, уже есть риг и анимации.

Начинаем начинать, полигонизация и текстурирование

Мы закинули пак в проект UE4, и сделали экспорт скелетал меша медведя в формате FBX. Создали новую сцену в Maya, сделали file - import и приступили к обработке.

Оригинальный медведь из пака
Сглаженный импортированный медвед

Наша модель открылась, и в outliner мы видим, что модель состоит из самого объекта (меша) и костей (рига), помещенных в одну группу. Эта группа (Enemy_Bear) создается самим Unreal Engine в момент экспорта в FBX. Забегая вперед, скажу, что у очень многих начинающих разработчиков это вызывает проблему при импорте обратно в UE4, так как он воспринимает группу как кость, и ее просто обязательно надо удалять.

Статистика в правом верхнем углу подсказывает, что эта модель уже low poly (vertex 3306), однако совсем не полигональная.

Начинаем разбираться за счет чего в данной модели было достигнуто сглаживание. Первым делом включаем отображение soften/harden edges на нашей модели (display - polygons - hard edges (color)). Выделяем модель и видим, что сглаживание объекта происходит за счет смягчения ребер (мягкие ребра - синие, жесткие - фиолетовые).

Мягкие ребра - синие, жесткие - фиолетовые

При этом видно, что в модели имеются жесткие ребра “невпопад”, что вызывает артефакты отображения.

Видно артефакты из-за того, что некоторые жесткие ребра не сгладились

Начинаем “облегчать” нашу модель. Первым делом исправляем жесткость ребер - делаем их все жесткими. Выделяем объект, переходим в режим редактирования ребер (ПКМ - edges), далее выбираем все ребра, переходим в контекстное меню (shift + ПКМ) и выбираем пункт soften/harden - harden.

Одна кнопка - и моделька превращается в полигональную

Наша модель уже стала похожа на полигональный low poly. Теперь необходимо её разукрасить. Экспортируем модель (выделяем объект, file - export selection через option box, выбираем fbx). Отправляемся красить модель в Substance painter, либо в Blender (мы сделали и так и так). Так как модель состоит из разных мешей объединенных через combine, покраска модели занимает не более 20 минут. Развертку можно автоматически создать в сабстансе, она получается довольно неплохая для однотонных покрасок. Не обращайте внимание на шейдер, в UE4 в итоге все будет немножко иначе выглядеть.

Медведь в Substance Painter за 20 минут
Медведь в Blender за час

Модель выглядит как надо. Теперь нам необходимо забрать отсюда модель в формате fbx (здесь находится нужная нам uv развертка) и текстуру base color (file - export texture - base color).

Продолжаем продолжать, риггинг и развесовка

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

Теперь нам необходимо соединить меш медведя с его ригом (для дальнейшей работы с анимациями, которые уже были приложены к медведю в UE4). Переходим в режим работы rigging, включаем отображение костей поверх объекта.

Наш риг

Перед тем как соединить медведя с костями, ОБЯЗАТЕЛЬНО вытаскиваем всё из группы (при экспорте в fbx UE4 объединяет риг и меш в группу (Enemy_Bear), а при импорте он считает группу костью, что полностью ломает всю логику работы). Немного подредактируем риг: раскрываем root кость, в ней лежат все кости нашего мишки в кости body, вытаскиваем body из root, сам root удаляем, затем body и сам меш объединяем в группу, которую и называем root (этот танец с бубном даст нужную иерархию).

Медведя немного развернуло (на изначальной группе стоял rotate, это фишка UE4), но это поправимо, - разблокируем редактирование трансформаций и применяем медведь rotate по Х на -90.

У нас получилась правильная иерархия root-body  и так далее до когтей на лапах

Пришло время соединять меш с костями. Выделяем body и Enemy_Bear1 - skin - bind skin (настройки по умолчанию). Кости рига стали разноцветными, значит все прошло хорошо и теперь при повороте костей за ними двигается и сам медведь.

Потягушки

Проблемы готовых моделей на финише

Снова экспортируем нашего мишку, но уже просто выделяя группу root (file - export selection через option box, формат fbx). Импортируем модель в UE4, и видим как нашего медведя начало пучить, будто он бахнув пельменiв, хвост свернулся калачиком, а левое полужопие стало как у Ники Минаж. Важный момент, что это происходит ТОЛЬКО во время некоторых анимаций.

Бахнув пельменiв
THICC

Начинаем проверять причины такого поведения модели. Первое, что приходит в голову - это некорректное соединение рига и меша. Выделяем модель, skin - unbind skin, начинаем менять конфигурации bind skin (открываем через option box), меняем bind method на Geodesic voxel (до этого перебрали все возможные методики из документации Maya), снова соединяем риг с мешем, экспортируем модельку, импортируем в UE4 и видим что теперь медведя вовсе разорвало по швам, как и наши жёпы, поскольку к этому моменту с учетом самых первых попыток импорта мы перебрали уже более 50 итераций, прочитав более 20 статей в интернетах о проблемах таких же, как наша.

Оооооо либераху порвало

Такое поведение полностью повергло в шок и закралось подозрение, что артефакты - это не единственный сюрприз, оставленный в изначальной модели. Выделяем модель, переходим в режим выделения вершин (ПКМ - vertex), переходим в контекстное меню (shift + ПКМ - merge vertex - merge vertex), так мы смерджили все вершины и их количество уменьшилось с 3306 до 2552 (как оказалось медведь буквально был дырявый). Снова импортируем в UE4. Проигрываем анимации, видим, что пузо почти не надувается (в пределах допустимого), но теперь у мишки при ходьбе висит курдюк и позвоночник все так же перекошен.

Пузеня отвисла

Возвращаемся в Maya и начинаем пробовать разные комбинации соединения рига с мешем (ведь частично это решило проблему). Спустя несколько часов и перебранных комбинаций ничего толкового не вышло, и мы решили попробовать дефолтный метод closest distance, вместо geodesic voxel, и увеличить количество max influences, результат стал получше, но раздувание все еще недопустимо большое.

5 influences
15 influences

Развесовка

Ничего не остается как проверить силу влияния костей на отдельные части тела мишки. Выделяем объект, skin - paint skin weight (через option box). И там нас ждал сюрприз, - распределение весов костей лап имеет очень сильное влияние на его пузо и при их отведении, естественно, пузо отвисает. Чиним ошибку при помощи ручного рисования весов, а именно проходимся кистью с value 0 по всем верхним костям лап медведя и убираем влияние. Так же необходимо поправить заднюю часть медведя, там мы, наоборот добавляем влияния кости левой ноги на спину медведя (в месте, где идет перекос) и симметрично немного добавляем веса на правую ногу и хвостик.

Было
Стало

Снова импортиурем модель в UE4 и, вуаля, - наш медведь корректно стал вести себя на анимациях (пузико не отвисает, хвост почти идеально (можно еще поработать над весами).

Пузо ОК
Жёпа ОК

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

Медведь готов

Послесловие

В большинстве своем, Game ready модельки уже сведены к лоуполи, поэтому наша методика сработает.
В случае же, когда лоупольностью не пахнет, можно использовать метод Quad draw, и просто обвести модельку сделав ретопологию.

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

0
19 комментариев
Написать комментарий...
Валера Чумаков

*процесс лоупоулирования активирован*

Ответить
Развернуть ветку
Даниил Малянов
Автор

Лоуполизирую всё что вижу

Ответить
Развернуть ветку
WizarD

Деполигонизация.

Ответить
Развернуть ветку
Айнур Зиннатов

Еще один способ сделать все быстрее, это воспользоваться встроенным генератором LODов UE4. Анимации при этом работают корректно)

Ответить
Развернуть ветку
Даниил Малянов
Автор

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

Рестайлинг это все же другое, мы не упрощали геометрию, а сделали её жёсткой. А самое главное, сделали свои текстуры. Так как каждый проект имеет свою стилистику, то готовые модельки очень редко в неё попадают

Ответить
Развернуть ветку
Ярослав Голубев

1-2 уровней лоды часто используют в качестве моделей для слабых машин... при выборе низких настроек графики

Но если дело касается персонажей - то ЛОДЫ лучше делать ручками
все программы для оптимизации не очень хорошо реагируют на внутренние пустоты - вроде рта , глаз...
А вот окружение можно и через лоды пускать

Благо Эпики придумали - Наниты - по сути систему динамических лодов

Ответить
Развернуть ветку
EkZo UE4

Что на счёт текстуры под лоу по?

Ответить
Развернуть ветку
Alex Smith

У меня вопрос: Substance paint обязателен в 3д?

Ответить
Развернуть ветку
Даниил Малянов
Автор

Нет, наш моделлер любит сабстанс, а мне например привычно в блендере UV развертку на атлас с готовыми цветами натягивать
Однако в сабстансе в общем то тот же результат был за 20 минут, а в блендере за час
Если говорить не про полигональный стиль, то сабстанс - пожалуй лучший инструмент для текстурирования
Вот пример довольно быстрой работы в сабстансе от нашего моделлера

Ответить
Развернуть ветку
Alex Smith

Спасибо за развернутый ответ

Ответить
Развернуть ветку
Parfen

Если речь про трудоустройство в геймдев, то да.

Ответить
Развернуть ветку
Арсений Мирный

Как-то всрато выглядит, может просто из-за освещения, экспозицию не дотянули.

Ответить
Развернуть ветку
Даниил Малянов
Автор

Шейдер и освещение вообще не настраивались, это уже про конкретный проект, в посте чисто история о методике рестайлинга моделек

Ответить
Развернуть ветку
EkZo UE4

Сколько весят модели До и После?

Ответить
Развернуть ветку
Artem Mordanov

Что-то очень сложно( не придумали методики работать с моделью и при этом сохранить скелет, риг, развесовку и всякое такое?

Ответить
Развернуть ветку
Даниил Малянов
Автор

Буквально вот сегодня нашли, сделаем новую статейку чуть позже, когда все протестируем

Ответить
Развернуть ветку
RenardTheDev

А есть неполигональный лоу-поли?

Ответить
Развернуть ветку
Даниил Малянов
Автор

Конечно. LowPoly это состояние модели, когда моделлер оптимизировал её и максимально снизил количество полигонов. Например зачастую в исходных моделях (с которых снимают карту нормалей например) количество полигонов выше 200тыс, а в оптимизированной модели около 5-10тыс, но при наложении карты с хайполи модели и сглаживании создается ощущение будто перед тобой высокодетализированная модель
Прикладываю пример из работы нашего же моделлера, где подписано количество полигонов

Ответить
Развернуть ветку
Даниил Малянов
Автор

Слева HighPoly, справа LowPoly с normal map

Ответить
Развернуть ветку
Читать все 19 комментариев
null