Начало работы Strand-based Hair Unity
Предисловие
Данная статья пишется ввиду малого количества информации на просторах интернета. И в поисках ответа решений можно сломать себе голову, если ты никогда не занимался этим ранее. Задаваясь вопросом, как сделать реалистичную симуляцию волос, остановимся наDemoTeam
и их решению Strand-based Hair.
С момента выхода синематика Enemies прошло 7 месяцев (на момент написания статьи). По итогу пользователи получили репозиторий на GitHub с решением для симуляции волос, использующемся в представленном синематике ссылка.
Данная версия является довольно сырой, и в ней встречаются множество проблем, но для ознакомления, и возможности «потыкать» вполне сгодится.
Подготовка
Естественно, для симуляции волос нам нужны сами волосы. Бесплатных, готовых решений для ознакомления, на просторах интернета, опять же, очень мало, по этому делаем все своими руками. В этом не легком пути нам поможет Maya xGen. Благо материала по созданию волос достаточно много, в том числе и на русском языке.
Важно! Автор не является профессиональным Hair Artist’ом, и нечего кроме Blender ранее не запускал, и волосы никогда ранее не делал, поэтому опыт в Maya был для него в новинку. Сильно не кидайтесь камнями.
После долгих ухищрений и переделок вышло нечто подобное:
Рекомендации:
Не увлекайтесь параметром Density, Unity плохо переваривает большое количество волос;
Разделяйте части волос на отдельные Description в рамках одной коллекции. Это поможет задать разные настройки для отдельных частей;
Статичные волосы, не требующие симуляции, можно сделать подходом Game Ready Hair.
Далее нам необходимо экспортировать наши волосы в нужном формате. Тут разгуляться не получится, у нас есть только один подходящий формат, это Alembic. Тут нам поможет документация Unreal Engine, но если коротко:
1) Выделяем в Outliner нужную коллекцию;
2) На верхней панели выбираем вкладку Generate;
3) Выбираем пункт Convert to Interactive Groom;
4) Нажимаем кнопку Convert;
5) Выделяем в Outliner сгенерированные сплайны;
6) Переходим по той же вкладке Generate, выбираем подменю Cache, пункт Export Cache;
7) Выставляем настройки, выбираем путь.
Готово. Теперь мы можем переходить в Unity.
Установка
Для начала нам нужно установить пакет Alembic. Находится он во вкладке Unity Registry. Далее импортируем пакет симуляции волос. Делается это по средствам Git URL. На данный момент, актуальной ссылкой является https://github.com/Unity-Technologies/com.unity.demoteam.hair.git. После необходимо создать Hair Asset (правая кнопка мыши в окне Project => Create/Hair/Hair Asset). Пока его не настраиваем, к этому перейдем позже. Импортируем наши волосы в формате .abc (alembic) в проект.
Добавляем компонент HairInstance на нужную модель персонажа. Лучше всего делать это на отдельном GameObject. Устанавливаем ссылку на Hair Asset и разворачиваем настройки.
Настройка
Для начала изменим Type на Alembic. Procedural подходит больше для шерсти. Устанавливаем параметр Root UV на Resolve From Mesh и даем ссылку на меш головы. Нажимаем конпку Build strand groups (в дальнейшем нажимаем ее после каждого обновления Hair Asset). Должно выйти нечто подобное:
Объяснять каждый пункт нет смысла, т.к. их достаточно много и статья станет походить на роман. Но необходимо выделить главные пункты в настройке:
1) Добавление Hair Assets:
Можно составлять свою прическу из разных частей. Довольно сильно помогает при кастомизации. Создаем разные хвосты, челки и прочее, и экспериментируем.
2) Переопределение настроек:
Присутствует возможность определить свои настройки для каждой группы локонов (для этого мы разделяли их в Maya). Необходимо нажать кнопку Add override block, выбрать группы и пункты настроек, которые хотим переопределить:
Если нужно узнать какую именно группу мы переопределяем, то можем выбрать ее в иерархии сцены, Unity любезно нам ее подсветит.
3) Производительность:
а) Resample Curves. При высоких показателях примерно в 3–5 раз урезает FPS. Отключаем;
б) Вкладка Solver, параметры Iterations и Substeps. Убивает производительность в ноль. На презентации GDC команда использует значение параметров равное 3. Используем в этом районе;
в) Grid Resolution. В пределах 32–64 вполне достаточно, в активных сценах сильно снижает частоту кадров;
г) Staging Subdvision. Значения 1 или 0, по опыту, вполне достаточно в 99% случаев.
Материал и Шейдер
Разноцветные волосы, конечно, очень задорно, но хотелось бы попробовать и другие. Здесь на помощь приходит ShaderGraph. Описывать создание шейдера здесь не стоит, т.к. это не тема данной статьи, но выделить очень важный пункт, без которого волосы не примут материал, стоит:
Необходимо добавить HairVertex node и установить связи как показано на изображении ниже:
Для самых ленивых можно установить шейдер волос от Unity и добавить HairVertex. Удалив расчет нормалей.
Материал устанавливается в компоненте HairInstance во вкладке Settings Strands.
Проблемы
В ходе эксплуатации были замечены такие проблемы:
Подергивание волос при движении персонажа. В билде данной проблемы нет. Возможно, скоро исправят;
При использовании большинства IK Assets волосы могут уехать вверх и пытаться вернуться в верное расположение. Для исправления необходимо прописать расчет IK до LateUpdate.
Итог
Прикоснуться к данной технологии может каждый и вовсе не обязательно тратить огромные суммы и многие месяцы на это. Конечно, для создания высококачественных волос требуется большое количество времени и работа специалистов, но за пару чашек кофе и с хорошим настроем можно добиться неплохих результатов.
Благодарность Ida Faber за прекрасную модель персонажа.