Имитация волн
Unreal Engine build 2107,2136 (UT2003 retail+patch)
Содержание
Начиная с 927 билда, в движке появилась возможность имитации волнистой поверхности при помощи специальной меш-сетки FluidSurfaceInfo. Этот туториал - обзор основных возможностей данного актора. (Примечание от переводчика: в UT2003 появился еще один подобный актор - xProcMesh, однако в виду отсутствия подробной информации на момент написания туториала, этот актор рассматриваться здесь не будет).
Для начала подготовьте место для вашего будущего водоема. В принципе размеры водоема не ограничены, однако FluidSurfaceInfo довольно "жадная" до ресурсов штука, поэтому в действие вступает принцип "Лучше меньше, да лучше". Мой (пока пустой) водоем выглядит так:
Теперь добавим на нашу карту актора FluidSurfaceInfo, для этого в Браузере Акторов ("Actor browser") найдите класс "Actor.Info.FluidSurfaceInfo"
Выберите этот класс, затем щелкните правой кнопкой мыши на вашем водоеме и в появившейся контекстной менюшке выберите "Add FluidSurfaceInfo Here". У вас на карте должен появится актор 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:
В FluidSurfaceInfo волны генерируются по всей поверхности, если вам необходимо создавать волны только в определенной части поверхности - используйте актор FluidSurfaceOscillator. В браузере акторов его можно найти в закладке Actor:
Вот свойства 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.
Прозрачность каждой вершины (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