Реалистично изобразить, как течет вода, ударяется о камни, как летят брызги это крайне сложная задача. Алгоритм просчитывает гидродинамику миллионов точек, учитывая траекторию, силу удара, взаимодействие с другими точками.
В процессе работы важно видеть, каким получается кадр в программе, чтобы понимать, нужно ли больше света или стоит сдвинуть виртуальную камеру. Но делать такие расчеты в реальном времени крайне дорого: компьютер не может сразу показать, как будет выглядеть вода в итоговой сцене, аниматоры видят кадр из грубых сеточек и точек, по которым нужно представить, как будет выглядеть пена в финале. Процесс похож на пилотирование самолета в тумане, когда надо полагаться на приборы. Тут примерно так же - выстраиваешь кадр, рендеришь, потом смотришь, не нужно ли подвинуть камеру, и снова все пересчитываешь.
Конечно, можно заметить некоторые недочеты в изображении воды, некритичные для зрительского восприятия. Например, местами пена была менее реалистичной, чем в жизни, где-то не хватало мелких капель. Но такое способен заметить только специалист, работающий с графикой. Прорывом второго «Аватара» являются объемы работы с графикой в водяных сценах, их количество и сроки, которые заняло ее производство; это, безусловно, заслуживает уважения.
Создание воды в Блендер
Способ 1: Displacement map Потребуется обычный плейн с UV-развёрткой. Добавляем Texture Noise Texture и → подключаем его к узлу Displacement у Material Output’а. Теперь при переключении режима просмотра в «Rendered» можно наблюдать некую рябь на воде (изменять её вид можно, меняя параметры Noise Texture). Для наилучшей наглядности сделать плейну зеркальный материал (типа Glossy) и добавить карту окружения (Environment map). Правда, такая рябь будет статичной (разве что попробовать анимировать какие-то параметры у Noise Texture, но сам не пробовал).
Создание материала
Теперь, когда поверхность создана понравившимся способом, создадим материал воды. 0. Добавляем новый материал плейну.
1. Difuse BSDF удаляем.
2. Вместо него ставим Mix Shader.
3. Создаём Glass BSDF и подключаем на верхний инпут Shader у Mix Shader’а. Roughness — на ноль, IOR — 1.333. Этот параметр отвечает за степень искажения объекта, на который мы смотрим через воду. Для воды он равен 1.333, для других материалов таблицы можно найти в интернете (гуглить «показатель преломления»).
4. Добавляем Transparent BSDF и подключаем на нижний инпут Shader у Mix Shader’а.
5. Добавляем узел Layer Weight, аутпут Fresnel подключаем к инпуту Fac у Mix Shader’а.
6. Между Layer Weight и Mix Shader’ом втыкаем узел RGB Curves. Как настраивать? Как больше нравится. Включите режим просмотра Rendered и играйтесь с кривыми, пока результат не начнёт нравится.
7. Теперь желательно сделать так, чтоб по мере увеличения глубины становилось темнее. Для этого добавляем Volume Absorption и подключаем к инпуту Volume у узла Material Output. Цвет и Density, опять же, подбираем сами по вкусу и ситуации.