Новости/News | | Туториалы/Tutorials | | Форум/Forum | | ЧаВо/FAQ | | Файлы/Downloads | | Ссылки/Links | | Авторы/About |

Имитация волн

Unreal Engine build 2107,2136 (UT2003 retail+patch)

Содержание

Обзор

Начиная с 927 билда, в движке появилась возможность имитации волнистой поверхности при помощи специальной меш-сетки FluidSurfaceInfo. Этот туториал - обзор основных возможностей данного актора. (Примечание от переводчика: в UT2003 появился еще один подобный актор - xProcMesh, однако в виду отсутствия подробной информации на момент написания туториала, этот актор рассматриваться здесь не будет).

Подготовка

Для начала подготовьте место для вашего будущего водоема. В принципе размеры водоема не ограничены, однако FluidSurfaceInfo довольно "жадная" до ресурсов штука, поэтому в действие вступает принцип "Лучше меньше, да лучше". Мой (пока пустой) водоем выглядит так:

Заготовка

FluidSurfaceInfo

Теперь добавим на нашу карту актора FluidSurfaceInfo, для этого в Браузере Акторов ("Actor browser") найдите класс "Actor.Info.FluidSurfaceInfo"

FluidSurfaceInfo в Actor Browser

Выберите этот класс, затем щелкните правой кнопкой мыши на вашем водоеме и в появившейся контекстной менюшке выберите "Add FluidSurfaceInfo Here". У вас на карте должен появится актор FluidSurfaceInfo в виде меш-сетки с хексами (ячейки в форме треугольника/шестиугольника). Вызовите свойства этого актора, дважды щелкнув левой кнопкой мыши по сетке.

Дефолтные свойства FluidSurfaceInfo

Свойства FluidSurfaceInfo

Краткое описание свойств FluidSurfaceInfo.

AlphaCurveScale Соотношение между "кривизной" и результирующей величиной прозрачности (alpha) в вершинах сетки.
AlphaHeightScale Соотношение между высотой вершин сетки и результирующей величиной прозрачности (alpha) в вершинах сетки. Суммируется с альфой по кривизне (?)
AlphaMax Максимальное значение прозрачности в вершинах сетки.
bShowBoundingBox Показать рамку ограничивающую сетку.
bUseNoRenderZ "Включить" параметр NoRenderZ
ClampTerrain Ландшафт (TerrainInfo) ограничивающий распространение волн. Подробнее см. ниже.
FluidColor Цвет меш-сетки в редакторе.
FluidDamping Быстрота затухания волн. Значения в пределах: 0 .. 1.
FluidGridSpacing Расстояние между вершинами сетки. За счет этого параметра можно сделать сетку FluidSurfaceInfo довольно большой.
FluidGridType Тип ячеек сетки: FGT_Hexagonal - смотрится лучше, чем FGT_Square, но работает медленнее.
FluidHeightScale Масштаб высоты случайно генерируемых волн (1.0 - нормальная высота, 2.0 - в два раза больше и т.д.)
FluidNoiseFrequency Число случайно генерируемых волн на поверхности воды (в секунду). Держите значение в пределах 50 (60).
FluidNoiseStrength Минимальное и максимальное значения распределения высоты случайно генерируемых волн.
FluidSpeed Скорость волн распространяющихся по поверхности. Имеется в виду скорость возрастания их амплитуды.
FluidXSize Число вершин в сетке по оси Х.
FluidYSize Число вершин в сетке по оси Y.
NoRenderZ ?
OrientShootEffect Определяет направление актора ShootEffect. true - ориентировать ShootEffect в направлении выстрела, false - ориентировать в направлении FluidSurfaceInfo.
OrientTouchEffect Определяет направление актора TouchEffect. true - ориентировать TouchEffect в направлении вектора скорости touch актора, false - ориентировать в направлении FluidSurfaceInfo.
RippleVelocityFactor Соотношение между скоростью актора, движущегося в воде, и высотой создаваемых волн (чем больше значение, тем выше будут волны).
ShootEffect Какой эффект создавать при выстреле в поверхность.
ShootRadius Радиус волн создаваемых при выстреле (?).
ShootStrength Высота волн создаваемых при выстреле.
TestRipple "Включить" тестовую волну (только в редакторе).
TestRippleRadius Радиус тестовой волны.
TestRippleSpeed Скорость движения тестовой волны по поверхности.
TestRippleStrength Высота тестовой волны.
TouchEffect Какой эффект создавать, если другой актор "коснулся" (touch) поверхности.
TouchStrength Высота создаваемых волн при первом касании поверхности.
UOffset Смещение текстуры поверхности воды (Skins[0]) по оси X (?).
UpdateRate Частота обновления сетки. Увеличьте, если эффект волн происходит недостаточно плавно. Обычно не требуется указывать значения большие 60Гц.
UTiles Число повторов текстуры поверхности воды по оси X.
VOffset Смещение текстуры поверхности воды по оси Y (?).
VTiles Число повторов текстуры поверхности воды по оси Y.
WarmUpTime Время предварительной эмуляции (в секундах) воды при инициализации FluidSurfaceInfo (генерация шумов на поверхности и т.д.). Обычно требуется пара секунд.

Материал поверхности назначается как нулевой элемент массива Skins в разделе Display (FluidSurfaceInfo.Display.Skins[0]).

Итак, вот как выглядит наш пример после назначения соответствующего материала и установки FluidNoiseFrequency в 50:

Готовый водоем

FluidSurfaceOscillator

В FluidSurfaceInfo волны генерируются по всей поверхности, если вам необходимо создавать волны только в определенной части поверхности - используйте актор FluidSurfaceOscillator. В браузере акторов его можно найти в закладке Actor:

Actor.FluidSurfaceOscillator

Вот свойства FluidSurfaceOscillator:

Свойства FluidSurfaceOscillator

FluidInfo FluidSurfaceInfo, к которому "привязывается" данный FluidSurfaceOscillator.
Frequency Частота колебаний осциллятора.
Phase Фаза колебаний осциллятора (используется, если у вас к одной FluidSurface привязано несколько осцилляторов).
Radius Радиус создаваемого эффекта.
Strength Высота генерируемых волн.

Для того чтобы привязать осциллятор к соответствующей FluidSurface, в свойствах FluidSurfaceOscillator выберите FluidInfo и нажмите кнопку "Find", затем кликните на нужный FluidSurfaceInfo в редакторе (эффект от осциллятора будет генерироваться в той точке, куда вы кликнули). Вот как выглядит наш пример с добавленным осциллятором:

Водоем с осциллятором

"Подгонка" ландшафта (TerrainInfo) и FluidSurfaceInfo

Как вы, наверное, уже заметили, на вышеприведенном рисунке волны от осциллятора проходят сквозь ландшафт. Это довольно нереалистично. К тому же волны не "отталкиваются" от действительных границ водоема. Чтобы исправить это, в свойствах FluidSurfaceInfo выделите свойство ClampTerrain, нажмите кнопку Find и кликните на ландшафт, окружающий водоем (UnrealEd в поле ClampTerrain подставит название выбранного объекта TerrainInfo). Затем необходимо перестроить уровень (Rebuild All) чтобы обновить массив вершин сетки, которые не будут создавать волн (так называемые clamped вершины). В эту категорию попадают все вершины которые блокируются ландшафтом, указанным в ClampTerrain, либо находящиеся внутри blocking volumes.

В конце концов, мой водоем выглядит так:

Водоем, финальная версия

Обратите внимание, что теперь волны не проходят сквозь ландшафт. Замечание: необходимо обновлять массив clamped вершин (Rebuild All) после каждой смены размеров/положения FluidSurfaceInfo.

Surface alpha

Прозрачность каждой вершины (VertexAlpha) сетки FluidSurfaceInfo рассчитывается следующим образом:

VertexAlpha = MIN(AlphaMax, (Curvature * AlphaCurveScale) + (Height * AlphaHeightScale))

Где AlphaMax, AlphaCurveScale, AlphaHeightScale берутся из свойств FluidSurfaceInfo, Height - высота вершины относительно уровня сетки (?), Curvature - степень "кривизны" в данной вершине (?).

Взаимодействие объектов и FluidSurfaceInfo

Другие акторы могут взаимодействовать с FluidSurfaceInfo следующими способами:

Замечание: FluidSurfaceInfo не оказывает влияния на физику движения акторов, для этого, вам необходимо использовать WaterVolume (т.е. FluidSurfaceInfo имитирует поверхность воды, а WaterVolume имитирует "водную" физику).

Автор

James Golding
jamesg@epicgames.com
Unreal Developer Network

Перевод: Shadow

Хостинг от uCoz