- PVSM.RU - https://www.pvsm.ru -

Когда только начался переход с DX9 на DX10 стало появляться много игр с круто смоделированной водой с правильными эффектами. Тогда разница была очень заметной, особенно если сравнивать игры прошлых поколений и тот же Crysis. Поэтому когда наткнулся на гайд, как сделать простую, но реалистичную симуляцию реки через плагин Houdini для UE4, то даже не стал задумываться и быстро перевел.
Меня зовут Саймон. Я начал программировать на QBasic и Pascal еще в молодости (вот примеры [5]), сразу осознал, что кодить сложно, и перешел в 3D-искусство. При этом я всегда сохранял интерес к технической стороне создания игр — вылилось в то, что я стал VFX-художником. Эта профессия хорошо сочетает в себе искусство и технологии.
Я работал 3D-художником над Sacred 2 [6] и X:Rebirth [7], и VFX-художником над RiME [8], The Invisible Hours [9]. Сейчас работаю над WiLD [10].

У меня также есть несколько личных проектов, связанных с разработкой игр: блог Game Art Trick [11], немецкий Game Dev Podcast [12] и YouTube-каналы с туториалами по Unreal [13] и Houdini [14].
Я подружился с Houdini во время работы над The Invisible Hours. Тогда я сделал небольшой симулятор жидкости, который можно было приостановить, развернуть и воспроизвести задом наперед в реальном времени. Результат был таким:

Источник: Симуляция жидкости из The Invisible Hours [15]
Я понятия не имел, как добавить жидкое моделирование в Unreal. К счастью, удивительная технология под названием Vertex-Count-Agnostic Morph Target-Based Fluid Animation [16] была реализована в Houdini, и поэтому я смог добавить свою симуляцию жидкости в игру. Технология первоначально была разработана Норманом Шааром [17].

Источник: Vertex-Count-Agnostic Morph targets в UE4 Нормана Шаара [18]
Если вы хотите узнать больше о реализации, то посмотрите этот раздел моего доклада Cool Stuff with Textures:
Я хотел узнать, как сделать процедурно-генерируемую реку для Realtime VFX River Challenge [19], но понятия не имел, с чего начать. Случайно я наткнулся на шикарный туториал от Бена Шрайвера [3], где он рассказывает о реках в Horizon Zero Dawn. Меня зацепило и я решил попробовать!
Кстати, есть еще один очень крутой туториал по рекам Houdini от Андреаса Глада [20]:
Эти видео очень помогли мне в начале и стали фундаментом.
Рельеф был очень сложным. Проиллюстрирую процесс создания, чтобы все поняли:

Источник: Создание местности в Houdini [21]
Шучу. Это слишком просто.
Первые шаги на 100% скопированы из туториала Бена, и они крутые. Сначала вы создаете сплайн и даете ему «упасть» на местности. Это делается путем считывания высоты рельефа в точках сплайна, а затем перемещения точек на эту высоту:

Затем вы позволяете сплайн-точкам «скатиться» вниз по склону, чтобы лучше интегрировать реку в рельеф:

На самом деле, они не скатываются физическим способом. Вместо этого используется базовая нормаль поверхности и нормаль точки для вычисления локальной оси для каждой точки (которая перемещается от сплайна вниз по склону). Затем вы немного перемещаете точки вдоль расчетной оси (этот процесс очень хорошо показан в видео Бена).
Следующий шаг — убедиться, что река не течет вверх по течению из-за ландшафта (потому что есть небольшой холм, где река идет вдоль).

Небольшой скрипт на Python гарантирует, что точка сплайна в 3D-пространстве никогда не будет выше, чем предыдущая:

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

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

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

Опять же, это 100% рабочий процесс Бена, начинающийся с перемещения рельефа ниже геометрии реки, чтобы они никоим образом не пересекались:

Затем для каждой точки местности вы проводите лучи вверх. Если они попадают в геометрию реки, то эти точки переместятся вверх в место попадания:

Каждая точка, которая никуда не попала, получит первоначальную высоту.

На этой гифке видно, что происходит при изменении сплайна:

Затем область высоты ландшафта преобразуется в полигоны и повторно перемешивается. Теперь она готова для использования в Unreal:

Теперь поговорим о UV-преобразовании, материалах, картах течений и многом другом.
Геометрия реки, которую вы видели раньше, была использована только для вырезания местности. Настоящая река немного тоньше, имеет UV и была разделена (обратите внимание, что мои цвета склонов все еще там):

Поскольку сплайн всегда варьируется по длине, UV должен адаптироваться к этому. К счастью, это очень легко в Houdini. Сначала вы создаете UV в 0-1-UV-Space, а затем измеряете длину сплайна. Это значение можно использовать для масштабирования UV. Здесь вы видите, как я меняю сплайн, а в нижней части — как UV автоматически адаптируется. Поверьте мне, если вы однажды попробовали это, то больше никогда не захотите создавать UV вручную.

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

А вот пример с использованием маски в материале для присвоения различных значений расплывчатости и шероховатости:

Создать карту течения реки с Houdini очень легко. Вы просто говорите специальному ноду «это моя геометрия реки, а это сплайн, который указывает направление реки» и бум, геометрия внезапно получает цвета вершин, представляющие поток реки:

Можно добавить еще один нод, который заставит карту потока реагировать на препятствия. Теперь вода потечет вокруг них:

И самое крутое: вы можете вызвать запекание карты потока в Unreal! Нет необходимости переключаться между Unreal и Houdini. Просто выставьте кнопку Render в Houdini в качестве параметра. Здесь вы видите, как я меняю препятствия, а затем визуализирую новую карту потока (учтите, что запекание занимает больше времени, чем на гифке):

Чтобы сделать пену на воде вокруг препятствий, я использую так называемый нод isoOffset. В основном он хранит расстояние до объекта в цвет вершины реки. Затем я добавил немного шума и маска готова:

Чтобы сделать маску пены менее статичной, я использую простой облачный шаблон Photoshop, который перемещаю вдоль реки и вычитаю его из оригинальной маски:

И поскольку мы говорим о пене: каскады тоже имеют простую текстуру пены, которая показана только на склоне реки. Структура пены прокручивается быстрее, чем речная вода:

Я отметил, где находятся верхняя и нижняя части моего каскада, поэтому могу фильтровать эти элементы (линии использовались для создания геометрии реки), создать точку в их центре и скопировать в нее dummy-box. Позже заменим ее на систему частиц в Unreal:

Для частиц вокруг препятствий я использую нод под названием Intersection Analysis, чтобы получить пересечение препятствий и реки. Эти ребра пересечения имеют точки. К их случайному числу я снова копирую dummy-box (который позже обменивается с системой частиц в Unreal):

Так это выглядит, когда я заменю dummy-boxes в Unreal:

Так называемый движок Houdini представляет собой плагин для Unity, Unreal, 3ds Max, Maya и Cinema 4D и выполняет сети нод, которые вы создаете в Houdini непосредственно в указанных программах. Мне нужно сделать так, чтобы появилась местность и река для сохранения Houdini-файла как цифрового ассета. Его можно импортировать и использовать, как любой другой ресурс в Unreal:

Теперь я могу изменить параметры (которые я выставил в Houdini) или изменить сплайн, чтобы река текла другим путем:

Материалы по-прежнему создаются и назначаются в Unreal, но вы можете назначить их предварительно (ниже мой туториал об этом).
В Houdini предстоит многому научиться. Кроме того, эти геймдев-инструменты являются новыми, а в документации все еще встречаются неточности.
Но это обычная ситуация для разработчиков игр, не так ли? Мы часто работаем с передовыми технологиями, которые нужно сначала приручить. Самое главное: вы не одиноки. Thinking Procedural Discord [22] полон крутых ребят, которые которые помогут и научат. В этих чатах вы даже можете найти разработчиков SideFX!
Автор: azazelis
Источник [24]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/igry/299831
Ссылки в тексте:
[1] ассеты: https://data.simonschreibt.de/gat069/HoudiniRiver.zip
[2] тут: https://youtu.be/9nFlCxEx4XI
[3] Бена Шрайвера: https://www.sidefx.com/community/horizon-zero-dawn-guerrilla-games/
[4] Андреаса Глэда: https://vimeo.com/243733565
[5] примеры: https://twitter.com/simonschreibt/status/624316758686437376
[6] Sacred 2: https://store.steampowered.com/app/225640/Sacred_2_Gold/
[7] X:Rebirth: https://www.egosoft.com/games/x_rebirth/info_en.php
[8] RiME: http://www.tequilaworks.com/en/projects/rime/
[9] The Invisible Hours: http://www.tequilaworks.com/en/projects/the-invisible-hours/
[10] WiLD: http://wildsheepstudio.com/
[11] Game Art Trick: https://simonschreibt.de/
[12] Game Dev Podcast: https://gamedevpodcast.de/
[13] Unreal: https://www.youtube.com/channel/UC9go9jWq2w4iDdZ162ulmug/videos
[14] Houdini: https://www.youtube.com/channel/UCHKNOUwxyld0UVTIOk4E0zw/videos
[15] Симуляция жидкости из The Invisible Hours: https://youtu.be/aYZEmaQUrAo?t=2103
[16] Vertex-Count-Agnostic Morph Target-Based Fluid Animation: http://norman3d.com/TextureMorphTargets/Vertex-count-agnostic_Morph_Targets.pdf
[17] Норманом Шааром: https://twitter.com/norman3d
[18] Vertex-Count-Agnostic Morph targets в UE4 Нормана Шаара: https://www.youtube.com/watch?v=Tj3Bz9OFQlE
[19] Realtime VFX River Challenge: https://realtimevfx.com/c/Events/17-river
[20] Андреаса Глада: https://twitter.com/PartikelVFX
[21] Создание местности в Houdini: https://www.sidefx.com/products/houdini/
[22] Thinking Procedural Discord: https://discordapp.com/invite/b8U5Hdy
[23] Доклад о Liquid Implementation в The Invisible Hours: https://www.youtube.com/watch?v=aYZEmaQUrAo
[24] Источник: https://habr.com/post/430144/?utm_campaign=430144
Нажмите здесь для печати.