
Когда речь заходит о воде в компьютерной графике, чтобы создать «настоящую» воду и подводные пространства, воду нужно симулить. Такие симуляции называются по-разному: Flip Simulation, Water Simulation, Fluid Simulation в зависимости от 3D программы.
Минус таких симуляций заключается в их комплексности: Fluid симуляции это типично симуляции, которые состоят из миллионов движущихся частиц, и все эти миллионы частиц программа должна просчитывать. Особенно заметно это сказывается на Real-Time движках, таких как Unreal Engine.
В случае, когда в сцене должна присутствовать вода, но вычислительные ресурсы ограничены, на помощь приходит историческая справка кинематографа, и воду снова попросту имитируют.
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
ИГРЫ И КИНЕМАТОГРАФ
Одной из первых игр, которая использовала текстуры вместо реальной симуляции воды с партиклами, стала игра «N64 Wave Race», выпущенная в 1996 г. студей Nintendo. На тот момент визуал и ощущение от воды в игре были потрясающими, водная гладь выглядела настолько реалистично, насколько это было возможно на консоли того времени.


«Wave Race N64» (Нинтендо)
Показательно, что при создании анимации волн в «Wave Race N64» использовались не просто анимированные карты текстур, а так называемый vertex displacement или дословно «перемещение вершин».

Сетка грида с демонстрацией волн. «Wave Race N64». (Нинтендо)
Анимация грида с помощью vertex displacement. «Wave Race N64». (Нинтендо)
В таких играх как «Расхитительница гробниц» 1996 г. студии Core Design хоть вода и была обычным плейном с текстурой, у студии были попытки создать симуляцию деформации изображения под водой.


Искажение подводного изображения. «Расхитительница гробниц». (Core Design)
Игра «Unreal» или «Нереальный», выпущенная в 1998 г. студиями Epic Games и Digital Extremes стала стала чуть ли не первой игрой, выполненной с помощью движка Unreal Engine 1. В глобальной перспективе метод создания флюидов без использования реальных симуляций не поменялся, а просто улучшался и дорабатывался, однако это был большой скачок вперёд с точки зрения визуальной презентациии и качества анимаций и текстур.


«Нереальный» (Epic Games и Digital Extremes)
Для экономии и упрощения часто используют linear displacement или по-другому dynamic displacement также для создания коллизии (взаимодействия) предметов с водой. Например, для того чтобы сделать симуляцию кругов на воде.
Он схож с vertex displacement, только использует не вертексы для создания анимации, а карты текстур. Этот метод использует шейдера, которые переносят информацию с текстур на 3D поверхность для деформации.
Взаимодействие предмета с картой.
Red Dead Redemtion 2. (Rockstar Games)
Похожий метод использовался в фильме «Водный мир» режиссёра Кевина Рейнольдса и в фильме «Титаник» Джеймса Кэмерона.


«Водный мир» (реж. Кевин Рейнольдс)
«Титаник» (реж. Джеймс Кэмерон)
ТЕХНИЧЕСКАЯ ЧАСТЬ
Displacement
Для экспериментальной части я создала несколько сцен с упором на разные элементы, чтобы понять, какие из них возможно сделать без использования Flip, а какие нет.
В этих сценах я буду рассматривать:
— Displacement: • Kelvin Wakes Deformer. • Ocean Spectrum.
— Коллизию.
— Пену.
Displacement
— Kelvin wakes deformer.
Kelvin wakes или Клин Кельвина — это математический термин, обозначающий «форму стационарного волнового возмущения в виде клина, возникающую за движущимся по поверхности воды судном.» (Большая Российская Энциклопедия, 2023)
Метод с деформацией вертексов стал основной ноды Kelvin wakes deformer. Она была создана SideFX целеноправленно для имитации волн от коллизии геометрии с водной поверхностью, где считывается информация от движущейся геометрии и передаётся на грид, деформируя точки.
Демонстрация ноды Kelvin_wakes_deformer.
Основные настройки Kelvin Wake Deformer: Falloffs и Spectrum
— Ocean spectrum.
Нода Ocean Spectrum используется в паре с нодой Ocean Evaluate. Она берёт грид и создаёт объёмы, деформируя вертексы, эти объемы содержат информацию, моделирующую влияние ветра или приливных сил на волны.


Kelvin Wake Deformer вместе с Ocean Spectrum.
Ocean Evaluate и Ocean Spectrum.
После анимации волн в первый вход ноды Kelvin_wakes_deformer подключается грид, а во второй вход предмет для коллизии, в данном случае лодка.
Для регулировки визуализации клина перед Kelvin_wakes_deformer использовалась нода Attribadjustvector, где умножалось значение скоростей точек для большей волнистости.
Настройки Ocean Spectrum.
Настройки вектора скорости.
Рендеры.
Коллизия
— Extract Transform.
Для отрабатывания коллизии объекта с гридом в Houdini существует нода Extracttransform. У ноды два входа, один для референсной геометрии, другой для таргетной. Нода считывает трансформации точек одной геометрии и переносит их на другую.
Для начала нужно задать простое движение объекта, это можно сделать либо обычной анимацией трансформов, либо с анимацией по курве с помощью ноды Copy-to-points.
Сетап анимации по курве.
Далее используется уже упомянутый ранее Ocean Evaluate с анимацией грида. Он подаётся на вход Target geometry в ноду Extract transform, а нижняя часть корабля подаётся на вход Reference geometry. Далее с помощью Copy-to-points берутся таргетные точки деформированного грида, и на них переносится геометрия корабля.
Отработка коллизии на волнах.
Рендер.
Пена
В первую очередь пена от бурного потока воды в CGI — это партиклы. К сожалению, при попытках создать пену используя текстуры и другие приёмы, она оказалась довольно неправдоподобной, поэтому самым лучшим способом для создания пены всё же является Flip.

Стоит учесть, что, при работе с Flip симуляцией необходимо правильно оптимизировать сцену: подготовить геометрию, удалить ненужные атрибуты и кэшировать разные этапы симуляции.
Для Flip симуляции с коллизией используются ноды Flip container, который задаёт размеры и настройки контейнера, Flip collide, куда подаётся коллизия, Flip solver, задающий симуляцию, и для компрессии перед кэшированием нода Fluid compress. Далее всё подключается к ноде Particle fluid surface для создания меша из партиклов.
Контейнер с Flip.
Флип симуляция и кэш.
Пена создаётся на основе партиклов созданной Flip симуляции. Для пены используются ноды White water source, которая создаёт партиклы в зависимости выбросов жидкости, и White water solver для последующей симуляции.
Отработка пены.
Перед кэшированием симуляций обязательно необходимо удалять все ненужные атрибуты нодой Attribdelete.
Создание пены и кэширование.
Демонстрация флюида с пеной.
Рендер.
Таким образом без использования Flip симуляции возможно сделать довольно убедительную поверхность воды с коллизией объекта в Houdini за счёт деформации вертексов и шейдера. Однако, нельзя создать сцену с пеной или брызгами без использования Flip.