Реалистичная визуализация водной поверхности в трехмерных динамических сценах является довольно сложной, но вполне решаемой задачей. В настоящее время существует несколько хорошо известных типовых алгоритмов визуализации воды. Таких, например, как рельефное текстурирование плоскости с использованием сгенерированных заранее карт нормалей и высот, а так же более современные алгоритмы, основанные на анимации вершин, добавлении локальных отражений и преломлений и комбинировании этих подходов [1]. В результате водная поверхность получается достаточно реалистичной, создается ощущение глубины и движения волн. При этом, конечно, не последнюю роль играет и правильно выбранная модель освещения, например, модель освещения Блинна-Фонга, которая позволяет отрисовать реалистичные солнечные дорожки на поверхности воды. Но при всех замечательных результатах данные алгоритмы отличаются повышенной сложностью, а, следовательно, требуют от разработчика достаточно серьезного уровня подготовки и больших временных затрат.
Поэтому визуализация сравнительно реалистичной водной поверхности в небольших программных проектах, таких как курсовые или семестровые работы, остается достаточно актуальной задачей. И каждому с ней приходится справляться в одиночку, если, конечно, перед разработчиком стоит цель реализовать достойное 3D приложение. Для решения этой задачи в контрольной работе по дисциплине «Компьютерная графика» был предложен следующий алгоритм, который был реализован и протестирован на базе библиотеки OpenGL. Однако, метод этот является универсальным, и может быть реализован и в других графических библиотеках(например, DirextX). Результатом работы алгоритма является отрисовка поверхности реки с имитацией течения воды и смещения русла реки, что приводит к созданию достаточно реалистичного эффекта.
Алгоритм довольно прост и не требует большого количества аппаратных и системных ресурсов. Принцип его работы напоминает конвейерную ленту в магазине, где в любой момент времени мы можем видеть только ее верхнюю часть. Если перевести эту метафору на язык компьютерной графики, то аналог ленты – это текстура (воды в нашем случае), а аналог роликов – каркас, к которому привязывается часть текстуры.
Для программной реализации данного алгоритма потребуется описать каркас объекта, для чего были использованы два массива вершин (левый и правый берег), и текстура водной поверхности, которая накладывается на полигоны поверхности. Каждая вершина каркаса состоит из трех координат – x, y и z. Для реалистичной визуализации водной поверхности можно принять, что координата z любой точки постоянна, координаты по x отстают друг от друга на равную величину, а координата у пересчитывается от кадра к кадру с помощью тригонометрических функций. Таким образом достигается реалистичность отображения реки.
Рекомендуется устанавливать значение z вершин чуть больше высоты поверхности земли, для того чтобы избежать наложения двух текстур друг на друга. Чем меньше расстояние между соседними вершинами у тем менее заметны линейные составляющие контура реки. Опытным путем были получены следующие формулы, для вычисления х координаты вершин левого (1) и правого (2) берега, соответственно.
xi = sin(r)*LeftA*sin(z)-2 (1)
xi = sin(l+0.411)*RightA*sin(z)+0.2 (2)
В данных формулах параметр r влияет на скорость изменения амплитуды колебаний берегов, LeftA – амплитуда колебаний левого берега реки, RightA – правого. Формулу вычисления координаты х вершины можно изменить, ориентируясь конкретную ситуацию. В результате будет рассчитан каркас, графическое изображение которого представлено на рис. 1.
Рис. 1. Графическое представление каркаса водной поверхности
Полученный каркас водной поверхности используется для дальнейшего наложения текстур. Для каждого кадра сцены каркас реки должен быть рассчитан заново. Для двух массивов вершин размерностью N получаем N-1 прямоугольных полигонов. Перед очередным кадром сцены текстура накладывается на поверхность со смещением s (рис. 2). Благодаря такой «скользящей» текстуре возникает иллюзия течения реки, хотя на самом деле ее каркас находится на месте и никуда не движется.
Рис. 2. Смещение текстуры на заданный шаг
Итак, подытоживая вышеизложенное, можно сформулировать следующий алгоритм визуализации водной поверхности:
1. Записать текстуру в буфер приложения.
2. Создать два двухмерных массива размерностью Nx3.
3. Проинициализировать статические координаты вершин у и z.
4. Рассчитать координаты х вершин каркаса.
5. Рассчитать нормали для водной поверхности.
6. Привязать текстуру воды к поперечным полигонам реки со смещением step.
7. Вывести сцену на экран.
Для увеличения эффективности рассмотренного алгоритма можно предложить следующие рекомендации:
• для более реалистичного эффекта текстура водной поверхности должна быть однородной, без посторонних предметов, бликов, которые бросаются в глаза;
• при наложении текстуры желательно использовать ее размножение по заданной поверхности (каркасу реки);
• для увеличения плавности кривых линий и, соответственно, более реалистичной визуализации водной поверхности, можно увеличить количество точек в каркасе.
В предложенном алгоритме визуализации водной поверхности нет волн, потому что одним из основных достоинств этого алгоритма является простота реализации и расчетов не в ущерб конечному результату. Но алгоритм можно усложнить, добавив в каркас дополнительные массивы вершин, отвечающие за визуализацию волны, а так же выполняя расчет координаты z для вершин. В результате на водной поверхности будут сымитированы волны, что, конечно же, повысит ценность алгоритма и приведет к еще более реалистичной визуализации водной поверхности.
Библиографическая ссылка
Трифанов А.И., Абрамова О.Ф. РЕАЛИЗАЦИЯ СОБСТВЕННОГО МЕТОДА ВИЗУАЛИЗАЦИИ ВОДНОЙ ПОВЕРХНОСТИ «СКОЛЬЗЯЩАЯ ТЕКСТУРА» // Современные наукоемкие технологии. – 2013. – № 8-1. – С. 96-97;URL: https://top-technologies.ru/ru/article/view?id=32503 (дата обращения: 17.08.2024).