Создание поверхности воды у берега
Вступление
Прежде всего, хочется отметить, что предлагаемый способ создания воды ни в коем случае не претендует на универсальность. При его использовании есть достаточно много ограничений, определяемых, в основном, используемыми материалами. В конце изложения мы остановимся на некоторых из них. Также хочется отметить, что некоторые нюансы создания материалов в данной сцене были, при написании урока, опущены в связи большим объемом получившегося материала.
1. Окружение
Так как в данном уроке мы будем рассматривать только создание воды, то будем считать, что все остальное (небо, облака, камни и пр.) мы уже сделали. Создание некоторого окружения (хотя бы частично) именно до начала работы над водной поверхностью существенно облегчит задачу, так как при работе над материалом воды мы должны видеть отражение в ней чего-либо, причем (желательно) максимально реалистичного. При желании можно даже использовать фотографию, помещенную в качестве фона (горизонт фона и нашей сцены должны, конечно, совпадать), с последующей заменой ее на что-то, сделанное собственными руками.
2. Вода у берега
Честно говоря, это оказалось самым сложным в работе. Сначала определимся с материалом отражения. Мы хотим сделать воду, набегающую на песок, на ней много маленьких волн, геометрическое задание которых (с помощью сетки) приведет к очень большому количеству полигонов в сцене. Последующее использование Raytrace в качестве отражения повергнет в глубочайшую задумчивость (переходящую в летаргический сон) самый современный процессор, поэтому от такого способа мы вынуждены отказаться, хотя он и является наиболее универсальным. Мы же изберем другой путь - представим воду в сцене как QuadPatch, а в качестве материала отражения выберем Flat Mirror. Почему именно этот материал? Благодаря его двум особенностям: возможности искажать отражение в зависимости от Bump и с помощью Blur. Но, в тоже время, это нас очень ограничивает - мы не сможем изменить геометрию воды, она останется плоской, к тому же искажения отражений при использовании Bump не совсем точны. Что ж, попробуем справиться с этим, создав для начала правильные текстуры прозрачности и bump.
Текстуры
Для создания текстур нам не понадобиться каких-либо художественных способностей, а только владение основами Photoshop и немного терпения. Все, что будет нарисовано, получено опытным путем в результате проб и ошибок, поэтому, наверняка, можно создать и более "правильные" с точки зрения реалистичности текстуры.
.
Откроем Photoshop и создадим новое изображение где-нибудь 2000х1300. Закрасим его белым и на отдельном слое нарисуем линию воды у берега. Закрасим часть, соответствующую берегу, черным. Добавим несколько серых пятен у берега для создания "отмелей". Это будет текстурой прозрачности.
В этом же проекте создадим bump карту. Для этого на новом слое проведем мягкой кистью черную линию, повторяющую береговую, но выше, там, где у нас уже будет вода. Это будем граница песка и воды. Сделаем белый noise на этой линии, который будет задавать проступающий песок или неровности воды на самой границе .
Теперь нарисуем волны. Каждая волна представляет из себя чуть искривленную линию (у нас - серую), имеющую несколько неравномерную толщину и прозрачность и плавно исчезающую к краям. Как ни странно, но добиться нужной линии (волны) достаточно сложно. Автор нарисовал огромное количество разнообразного вида червяков, прежде чем добился, наконец, приемлемого результата. Создав несколько различных волн, сдублируем их, получив:
Но волны идут не только параллельно берегу. Поэтому скопируем слой волн, повернем его на 90 градусов, увеличим примерно в 2.5 раза и сделаем его более прозрачным. Теперь опять сделаем тоже самое, но увеличим уже гораздо сильнее и повернем под углом градусов 30 к линии берега. При этом получим следующее:
Назовем это Bump_map, и, в очередной раз, убедившись, что Айвазовского из нас не получится, закрываем Photoshop и переходим в МAX.
Материал воды
И так, вода у берега будет у нас сделана из QuadPatch. Берег тоже будет QuadPatch, но совсем чуть-чуть ниже и абсолютно черный. И то, и другое наклоняем чуть-чуть в сторону моря.
Теперь начинается самое сложное. Создаем материал воды.
Начнем с прозрачности. Понятно, что мы ее уже нарисовали, но не все так просто. Во-первых, прозрачность воды зависит от угла, под которым мы на нее смотрим. Чем ближе к нам вода (начиная с некоторого угла или расстояния), тем она прозрачней. Во-вторых (здесь я немного утрирую), чем дальше от нас линия берега, тем она четче, а чем ближе - тем более размыта. Осознав весь трагизм создавшейся ситуации с прозрачностью (а ведь это далеко не самое сложное в нашем материале воды), приступим. Создадим карту прозрачности Bitmap. В качестве изображения для нее возьмем уже нарисованную нами прозрачность.
В зависимости от пропорций, которые имеет QuadPatch воды (полоска воды у берега длинная), сделаем соответствующий tiling (у меня он равен 6) по U-координате.
Зададим значение Blur = 10 (размытие линии берега вдали).
Теперь создадим Mix, взяв в качестве одной карты только что получившуюся, в качестве второй - такую же, но с Blur = 70 (размытие линии берега вблизи), а в качестве Mix Amount - карту Falloff.
Этим мы задали изменение размытия линии берега от расстояния.
Теперь полученный Mix мы берем в качестве map для карты Mask
В качестве маски берем опять карту Falloff, но с немного другими параметрами.
Таким образом, чем вода к нам ближе (начиная с некоторого расстояния), тем она прозрачней.
Теперь - Bump. Здесь все достаточно просто. В качестве Bump берем нарисованные нами в Photoshop многочисленные кривые полоски по маске noise. Tiling соответственно тоже = 6. Маска по noise делает наши волны немного "неправильными". Bump Amount = 700.
Теперь создаем карту отражений. Как уже говорилось выше, в основе ее будет Flat Mirror.
Но чем выше волна (или близость кромки берега), тем меньше (слабее) отражение. Поэтому опять делаем Mix. В качестве map1 берем Noise (как бы рябь в местах большой волны и у берега), в качестве map2 - наш Flat Mirror, в качестве Mix Amount - нарисованный нами Bump. Так как сила отражения воды противоположна ее прозрачности, то берем полученный нами материал по маске ранее сделанной нами прозрачности.
В принципе, то же самое надо сделать и с Specular Level - там, где вода прозрачней, блик волны на ней слабее, но это не имеет большого значения, потому что солнца как такового у нас нет.
Если кто-либо, кроме меня, не заснув на полпути, все же выполнил все описанное выше (а в этом я очень сомневаюсь J ), то он получил бы примерно следующее.
Поставим SuperSampling получше, нажмем Render и, в зависимости от мощности нашего компьютера, пойдем пить кофе, смотреть телевизор, или приляжем на часок поспать.
Вернувшись к компьютеру, получим:
3. Волны
Здесь все гораздо проще. Волны не могут быть плоскими, а, следовательно, Flat Mirror мы применить не можем. Значит Raytrace. Но геометрия волн может быть не очень сложной, к тому же они все-таки далеко. Для создания одной волны возьмем Box с достаточным для последующего Edit Mesh количеством точек. С помощью Edit Mesh зададим основные выпуклости и впадины волны, а потом при помощи Displace сделаем небольшие неровности. В качестве карты для Displace возьмем опять Mix из двух noise_ов, различающихся размерами зерна. Если длины волны не хватает, и мы видим ее край, то сдублируем ее и положим "сбоку" еще одну такую же.
Материал волны гораздо прозаичнее, чем у воды. В качестве отражения - Raytrace(с глубиной трассировки = 1), Bump - dent
Считаем то, что у нас получается.
Таким же образом сделаем несколько "рядов" волн, при этом каждый последующий ряд, делая больше предыдущего. Будем делать это до тех пор, пока мы не дойдем до самого "горизонта".
В качестве заключительного штриха добавим две полоски чистой воды вдали у берега. Сделаем это при помощи тех же QuadPatch. Материалом для них будет сильно упрощенный материал воды без bump и прозрачности.
Ну и, наконец, для тех, кто дочитал до конца - финальный просчет (уже с облаками).
4. Недостатки метода
1. Невозможность задания "неплоской" прибрежной воды. Все волны, неровности ее задаются при помощи Bump.
2. Не совсем корректное отражение Flat Mirror. Например, в данной сцене нельзя поставить камень близко к точке камеры - отражение его в воде будет неправильным, так как угол между направлением камеры и поверхностью воды будет достаточно большой.
3. Сложность анимации полученной воды.