Найти в Дзене
Аня про Unreal Engine

Настраиваем волны в Unreal Engine 5

Примечание: гайд написан на примере UE 5.6, но подходит и для других версий движка Если мелкую детализацию (рябь, блики, морскую пену и т.д.) обычно настраивают в материале воды, то такие параметры, как длина волны, высота и направление, задаются через Water Waves Asset. Это отдельный ассет плагина Water. Его возможностей обычно хватает, чтобы настроить простой водоем. Однако если хочется особой формы волны, нестандартного поведения или эффекта, то лучше создать свой генератор волн. Давайте создадим Water Waves Asset и посмотрим, какие параметры в нем доступны. Шаг 1. Создаем и настраиваем ассет
Add → Water → Water Waves. Назовем его, к примеру, WW_Ocean_Calm. Открыв его, можно увидеть мини-превью, показывающее, как влияет на волны каждый параметр. В панели Details доступны следующие настройки:
— Waves Source — по умолчанию здесь стоит стандартный генератор волн Герстнера (Gerstner Water Waves). Его можно заменить собственным генератором волн, созданным в C++ или блюпринте. — Num Wav

Примечание: гайд написан на примере UE 5.6, но подходит и для других версий движка

Если мелкую детализацию (рябь, блики, морскую пену и т.д.) обычно настраивают в материале воды, то такие параметры, как длина волны, высота и направление, задаются через Water Waves Asset. Это отдельный ассет плагина Water. Его возможностей обычно хватает, чтобы настроить простой водоем. Однако если хочется особой формы волны, нестандартного поведения или эффекта, то лучше создать свой генератор волн.

Давайте создадим Water Waves Asset и посмотрим, какие параметры в нем доступны.

Шаг 1. Создаем и настраиваем ассет
Add → Water → Water Waves. Назовем его, к примеру,
WW_Ocean_Calm.

Открыв его, можно увидеть мини-превью, показывающее, как влияет на волны каждый параметр.

В панели Details доступны следующие настройки:
— Waves Source — по умолчанию здесь стоит стандартный генератор волн Герстнера (Gerstner Water Waves). Его можно заменить собственным генератором волн, созданным в C++ или блюпринте.

— Num Waves — количество волн, которые накладываются друг на друга, формируя водную поверхность. По умолчанию используется 16 волн. Чем меньше волн, тем выше производительность, но и ниже детализация.
— Seed — число, которое отвечает за уникальный, но воспроизводимый набор волн.
— Randomness — добавляет небольшие случайные отклонения в длину и высоту отдельных волн, чтобы поверхность выглядела естественнее.

Wavelength (длина волны):
— Min Wavelength и Max Wavelength — минимальная и максимальная длина волны.
— Wavelength Falloff (Затухание) — параметр управляет тем, как плавно переходят длины волн между минимальным и максимальным значением.

Amplitude (амплитуда):
— Min Amplitude и Max Amplitude — минимальная и максимальная высота волн.
— Amplitude Falloff — параметр управляет тем, как плавно меняется высота волн между минимальным и максимальным значением.

Directions (направление течения):
— Dominant Wind Angle — направление ветра.
— Dominant Angular Spread — угол разброса вокруг основного направления. Добавляет небольшие случайные отклонения в направлении ветра, из-за чего волны идут не строго по одной линии, а чуть расходятся внутри этого диапазона.

Steepness (гребень волны):
— Small Wave Steepness — определяет, насколько заостренными будут гребни мелких волн. Чем выше значение, тем более колючими и резкими они будут выглядеть.
— Large Wave Steepness — регулирует гребни крупных волн.
— Steepness Falloff — регулирует, насколько плавно меняется заостренность гребней при переходе от мелких волн к крупным.

Шаг 2. Применение ассета
Чтобы созданный
WW_Ocean_Calm заработал в сцене, поместим его в поле Water Waves Asset в Details у актора водоема, в моем случае это актор океана.

Также у актора воды есть дополнительные настройки волн:
— Wave Attenuation Water Depth — глубина, на которой волны начинают затухать. К примеру, маленькое значение (5–50 м) приводит к тому, что волна начинает затухать сразу возле берега и вода выглядит спокойнее.
— Max Wave Height Offset — вручную добавляемый запас высоты к автоматически вычисленным габаритам волн, чтобы движок знал максимально возможное смещение поверхности воды через World Position Offset. Этот параметр не влияет на форму или высоту самих волн, а лишь расширяет рендер-границы, чтобы избежать обрезания, мерцания и артефактов при тенях, отражениях и LOD. Значение 0 означает движок не резервирует дополнительное пространств. Рекомендуется ставить значение примерно равным или чуть выше максимальной амплитуде волн с запасом 10-20%.

Создаем свой генератор волн

Шаг 1. Создаем блюпринт
Add → Blueprint Class → GerstnerWaterWaveGeneratorBase. Назовем его
BP_WaveGenerator_Custom.

Шаг 2. Прописываем логику блюпринта
Переходим во вкладку Functions, открываем список Override и выбираем Generate Gerstner Waves.

Внутри функции создаем нод Make Gerstner Wave, где есть такие параметры, как Wave Length — длина волны, Amplitude — амплитуда, Steepness — заостренность гребня, Direction — направление течения. В ноде Make Array через пин через Add pin можно добавить количество волн.

-2

Шаг 3. Подключаем генератор к водоему
Открываем ассет Water Waves, например, WW_Ocean_Calm, который создавали в начале статьи. Находим поле Gerstner Wave Generator и вставляем наш BP_WaveGenerator_Custom.

После этого назначаем Water Waves на сам актор воды: Details → Water Waves Asset.

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

-3