Моделирование и визуализация водных поверхностей

Федеральное агентство по образованию Российской Федерации

Государственное образовательное учреждение

высшего профессионального образования

Нижегородский государственный университет им. Н.И. Лобачевского 

Факультет Вычислительной математики и кибернетики 

Кафедра математического обеспечения ЭВМ 
 
 
 
 

Выпускная квалификационная работа бакалавра 
 
 
 
 

Моделирование и визуализация водных поверхностей 
 
 
 

     
     
     
     
     
     
     
         Работа допущена к защите

    Заведующий  кафедрой МО ЭВМ

    д.ф.-м.н., проф.

               _________________Стронгин Р.Г.

                    Подпись

    «____»_________________2008 г. 

         
    Исполнитель:

    студентка гр. 8403 фак-та ВМК

    _________________Лалакина  А.А.

         Подпись

    «____»_____________2008 г. 
     
     

    Научный руководитель: проф. каф. МО ЭВМ, д.т.н.

             _____________Турлапов В.Е.

                 Подпись

    «____»_____________2008 г. 

         
 
 

Нижний  Новгород

2008 

 

Оглавление 
 
 
 
 

 

    1. Введение

    Задача  моделирования фотореалистичной воды в реальном времени является одной  из классических задач компьютерной графики. Это связано с тем, что вода является сложным природным объектом, и ее внешний вид зависит от многих факторов таких, как окружающий мир или положение наблюдателя. Поэтому очень важно знать основные факторы, влияющие на поведение и внешний вид воды. Но в различных ситуациях поведение воды может очень сильно различаться, поэтому нужно выделять категории эффектов, характерные для каждого случая (в основном, это относится только к физическому поведению поверхности воды).

    Среди множества видов природных водоемов можно выделить 2 основные группы:

  1. Большие неограниченные водоемы (моря, океаны)
  2. Небольшие водоемы с видимой границей (реки, озёра, бассейны, лужи)

    Водные  поверхности, характерные для этих водоемов, довольно сильно отличаются по своему физическому поведению. Поэтому способы их моделирования тоже различны. Поверхность воды в океане деформирована за счет сочетания постоянных волн небольшой амплитуды и частоты, а вода в озере является достаточно спокойной, т.е. там нет больших волн, но присутствуют неравномерные высокочастотные колебания, которые приводят к эффекту искажения отражаемых и преломляемых объектов. Для небольших водоемов также характерны такие явления, как интерференция колебаний от нескольких всплесков и отражение колебаний от границ. Поэтому необходимо определить, какую именно поверхность требуется смоделировать.

    Области применения моделей водных поверхностей очень широки: создание 3D-игр и других 3D-приложений, эмуляторы виртуальной реальности, индустрия кино и др.

    Существуют  различные методы имитации физического поведения поверхности воды, построенные на основе реальных физических моделей, но некоторые из них невозможно реализовать в реальном времени за счет слишком большого количества вычислений (уравнение Навье-Стокса). Поэтому большинство алгоритмов используют наиболее простые модели, чтобы уменьшить объем вычислений. Несмотря на то, что упрощение модели приводит к снижению реалистичности поведения воды, применение дополнительных эффектов при ее визуализации дает очень хорошие результаты. Кроме того, не всегда имеет смысл имитировать физику поверхности. Иногда достаточно обойтись лишь имитацией оптических эффектов. Правда, это применимо к таким водным поверхностям, деформация которых действительно невелика. В случае сильных деформаций, реалистичная имитация поведения водной поверхности невозможна хотя бы без простейшей физической модели.

    В ходе визуализации возникают некоторые  артефакты, которые сильно снижают  реалистичность изображения. Например, артефакты на границе между объектами  сцены и водой вследствие искажений поверхности воды.

1.1 Обзор публикаций

    Существует  большое количество работ, где описаны  некоторые этапы создания реалистично  выглядящей водной поверхности. Основная часть материалов описывает способ имитации протяженных водных поверхностей (океан) на основе синусоидальных волн, их модификации (волны Gerstner) и метода быстрого преобразования Фурье (FFT – Fast Fourier Transform). [1], [2], [5], [7], [8].

    Практически во всех остальных случаях при  моделировании воды используются только способы визуального моделирования, т.е. сама поверхность воды остается плоской, а эффект волнения поверхности создается с помощью наложения искаженных текстур. [5], [6], [9], [10]. Основные принципы, которые применяются в таких случаях, являются достаточно простыми для понимания и реализации и не требуют особых затрат при их применении (в отличие от физического моделирования, когда нам постоянно нужно производить перерасчет позиций вершин по достаточно сложным формулам). Основой таких методов является применение карт нормалей и du-dv карт.

    В работе [2] предложена техника для генерации и анимации протяженных водных поверхностей с использованием GPU (Graphics Processing Unit). Детально описаны методы симуляции поведения водной поверхности. Описывается метод непрерывной детализации геометрической модели водной поверхности. Так же представлена техника генерации и анимации текстур водной поверхности. А именно, говорится, что поверхность моря можно представить в виде некоторой функции H(x,y,t) = z, заданной на двухмерном наборе данных. Наиболее простой метод представление данной функции на GPU - это суперпозиция нескольких синусоидальных волн с собственной амплитудой, периодом, начальной фазой и направлением распространения. Для управлением «остротой» волн использована формула Gerstner –модификация суперпозиции синусов, которая как бы “сдвигает” вершины волны.

    Статья  [1] охватывает принципы как физического, так и визуального моделирования водной поверхности. Имитация физики производится путем смешивания нескольких способов – быстрое преобразование Фурье, уравнение Навье-Стокса, волновое уравнение. Из визуальных эффектов рассматриваются:

    • зависимость цвета воды от глубины
    • глобальное отражение/преломление
    • локальное отражение/преломление
    • каустики и godrays
    • пена и мелкие брызги
 

рис.1 Каустики

рис.2 Godrays

рис.3 Пена и  брызги

 

    Отличием  работы [12] является то, что за основу авторы берут конечно-элементная линейно-упругая динамическая модель, являющаяся, по сути, системой пружин с демпферами, связывающих точечные узлы с сосредоточенной в них массой (spring-mass, пружинно-массовая модель). Авторы утверждают, что она является одной из наиболее подходящих, в силу ее простоты и как следствие небольшой вычислительной сложности. В то же время все преимущества физического подхода сохраняются.

Модель  в основе имеет структуру узлов, связанных линейно-упругой пружиной, представляющую, по сути, одноосный конечный элемент (рис. 4) 

рис. 4

Каждый  узел pi обладает следующим набором характеристик:

mi - масса узла;

- декартовы координаты узла;

- скорость узла;

- ускорение узла;

- cумма всех сил, действующих  на узел.

В свою очередь пружина Sk, k=k(pi, pj) соединяющая узлы pi и pj, характеризуется следующими величинами: - длина пружины в состоянии покоя; - текущая длина пружины; - коэффициент упругости пружины.

Выражение для Sk, действующий на узел pi , определяется по закону Гука.

 
 
 

рис. 5 Линейно-упругая динамическая модель

 

    Используя указанный метод моделирования, они получили описание динамики изображаемой поверхности в терминах механики (силы, скорости, ускорения), что позволяет сравнительно просто и быстро менять ее текущее состояние (внося возмущения по скорости и/или положению), накладывать ограничения на движение каких-либо точек поверхности (напр., фиксировать) и т.д.

    Авторами был осуществлен подбор параметров (массы, сосредоточенные в узлах, коэффициенты упругости связывающих эти узлы пружинок и т.д.) пружинно-массовой модели для визуализации движения водной поверхности. При этом, несмотря на существенное отличие процесса, описываемого данной моделью и реальной водой, удалось получить такие эффекты как распространение круговых волн, прохождение волн друг сквозь друга, их отражение от «береговой линии» и т.д.

1.2 Постановка задачи

    Задачу  визуализации воды можно разделить  на две части:

  1. Имитация поведения поверхности воды (динамика поверхности)
  2. Имитация оптических эффектов, характерных для воды

    Для имитации поведения поверхности  воды необходимо изучить основные физические модели. Физическое моделирование также  является основой создания некоторых  эффектов (например, взаимодействие с  другими объектами, следы от дождя  на поверхности воды).

    Для создания фотореалистичной картины  необходимо изучить основные оптические свойства воды, которые необходимо учитывать при ее визуализации, и  способы имитации этих свойств.

    Таким образом, задачу визуализации можно сформулировать так:

    1. Реализация одной (нескольких) физических моделей с использованием шейдеров.
    2. Имитация некоторого набора оптических эффектов, характерных для воды
    3. Разработка системы для имитации таких явлений, как пена, брызги, следы от дождя на воде
    4. Модификация рассмотренных методов, направленная на ускорение процесса визуализации (за счет оптимизации шейдеров, уменьшения количества проходов рендеринга и т.п.) или на повышение реалистичности конечного изображения

    Также можно отметить, что визуализация воды выполняется в реальном времени.

 

2. Имитация поведения поверхности воды

    При имитации физики водной поверхности  большую роль играет правильно выбранная  триангуляция поверхности. При этом каждый тип сеток может быть использован  для реализации одной или нескольких моделей, но не в любом случае. Иногда физическая модель требует конкретного вида сетки.

2.1 Выбор типа сетки для представления поверхности воды

    Поверхность воды можно представить в виде сетки множеством способов. Рассмотрим самые простые (очевидные) и эффективные  методы.

 

рис.6 Регулярная сетка

рис.7 Радиальная сетка

 

Регулярная (равномерная) сетка

    Наиболее  простой и естественный выбор, но не самый эффективный и оптимальный, т.к. детализация никак не зависит  от положения наблюдателя. Для создания равномерной сетки достаточно указать ее размер и количество точек по каждому из двух измерений.

     ,

    где wx (wz) – размер сетки по оси x (z), а hx (hz) – шаг сетки по оси x (z). 

Радиальная  сетка

    Более сложный и оптимальный способ. Наблюдатель всегда находится в центре сетки, таким образом, детализация зависит от расстояния до камеры.

    Для определения координат вершин такой  сетки необходимо задать 2 параметра  – количество колец (для разбиения  сетки на концентрические области) и количество секторов (для разбиения кольца), а также необходимо задать некую функцию, которая будет определять изменение радиуса колец при увеличении дистанции до наблюдателя. В простейшем случае эта функция может иметь вид: , где а – некоторая константа, а i – номер кольца.

    

2.2 Волновое уравнение поверхности

    Поверхность воды – динамическая поверхность  в трехмерном пространстве. Поэтому  положение каждой точки поверхности  в общем виде описывается функцией . Данная функция задает высоту поверхности в точке (x,y) в момент времени t.

    Рассматривается регулярная сетка, т.к. метод построен на численном решении волнового  уравнения.

    Каждая  точка сетки называется узлом. Расстояние между двумя соседними узлами – шаг сетки. Примем, что шаг сетки по x и y одинаков и постоянен. Шаг сетки по времени можно задавать произвольно, так как временной интервал неограничен.

    В качестве уравнения колебаний водной поверхности можно взять простейшее волновое уравнение:

     , где c – скорость поверхностных волн.

    Основная  идея численного решения заключается  в том, что производные приближаются значениями сеточной функции (i – номер шага по x, j - номер шага по y, k - номер шага по времени, h – шаг сетки по x и y, p – шаг сетки по времени):

    

    После этого, подставляя данные значения в уравнение, мы получаем формулу, которая описывает положение узла в следующий момент времени через его положения в два предыдущих момента времени:

    

    Но  эта формула не учитывает эффект затухания волн. Поэтому рассмотрим усложненную модель, учитывающую вязкость жидкости.

     , где  - вязкость жидкости.

    Первую  производную по времени  приблизим центральным разностным оператором.

     .

    В результате получим формулу, которая  описывает положение узла в следующий  момент времени через его положения  в два предыдущих момента времени  и учитывает эффект затухания  волн:

     .

    Для граничных узлов необходимо отдельно выписать условия перемещения. Наиболее реалистичным условием для краев  поверхности являются условия упругого соединения (или условия 3-го рода, если смотреть в теорию мат. физики).

    

    Приближения первых производных записываются в следующем виде:

    

    С учетом этого для граничных точек  сеточной функции условия примут вид:

    

    (1-ая  строка - формулы для узлов с  x=0 и x=L, 2-ая строка – для y=0 и y=L)

    Осталось  указать начальное условие. Можно считать его нулевым (в начальный момент времени водная поверхность находится в состоянии покоя).

    Полученная  разностная схема является условно-устойчивой, т.е. она сходится не при любых  p и h, а именно, должно выполняться ограничения

      либо  . [13]

    Разностная  схема может быть решена послойно. Поясним это на более простом  уравнении, а затем рассмотрим наше уравнение.

    Пусть нам необходимо решить уравнение  , Приблизив производные по приведенным выше формулам, получим следующую разностную схему:

    

, где h и p, соответственно, шаги по x и t.

    

    При этом h определяется сеткой (h = 1/n, n – число разбиений по х), t зададим произвольно (так как время неограниченно). 

     Значения в узлах, отмеченных     на рис.8, мы знаем из начальных условий. Таким образом, мы знаем весь нулевой слой. Применяя шаблон к узлу (1,0), мы найдем . Продвигая шаблон дальше, мы найдем значения сеточной функции на первом слое. Далее, применяя крестообразный шаблон, мы найдем второй слой и так далее.
рис.8

                                        

    В случае нашей разностной схемы мы работаем в трехмерном пространстве. Принимая, что значения сеточной функции на 0 и 1 слое по времени равны нулю, мы можем найти значения на 2 слое, зная его и значение на 1 слое, найдем третий и так далее.  

рис.9

рис.10

 

    В этом случае сетка представляет собой  «решетку». Некоторые части сетки представлены на рисунках 9 и 10. 
 
 

    Рассмотренный алгоритм моделирования обладает некоторыми интересными особенностями.

    Он  легко позволяет имитировать  точечные воздействия (падение капли  на воду). Это происходит за счет отклонения нескольких узлов от состояния равновесия. Данный принцип позволяет создать эффект распространяющихся кругов на воде. Сначала произвольным образом и в произвольный момент времени выбирается центральная точка возмущения, которая отклоняется на некоторое значение. Затем берется некоторая окрестность выбранной точки (по всем направлениям), точки которой отклоняются по определенному нелинейному закону в зависимости от расстояния до центра возмущения.

    

           рис.11                                      рис.12                            рис.13 След от капли 

    Другой  спецификой метода является эффект отражения  волн от стенок бассейна. Отражение  возникает за счет граничных условий, накладываемых на рассматриваемую  функцию. Зная этот факт, мы можем подобным образом вводить дополнительные области внутри водной поверхности (острова), узлы которых статичны, и получить отражения от этих областей. Кроме того, можно получить цикличную картину распространения волн, если предусмотреть выход волн за границу сетки и связь между противоположными границами бассейна.

    Есть  ещё одно интересное свойство. С  его помощью можно создать  картину расходящихся волн от движущегося  по воде объекта, например лодки. Это  достигается тем, что одновременно с самим объектом мы по траектории его движения перемещаем источник точечных возмущений, который и отвечает за появление волн.

рис.14 Волны от движущихся объектов

 

3. Имитация оптических эффектов

3.1 Оптические свойства воды

     Рассмотрим основные и наиболее заметные природные эффекты, связанные  с водой.

    • Отражение.

    Вода  является очень хорошим отражателем, поэтому при взгляде на нее  мы видим отражения всех объектов, как в зеркале. При этом обычно отражения искажаются за счет неровностей  поверхности воды, т.е. наблюдатель  видит рябь на воде.

    • Преломление / прозрачность

    Вода является  достаточно прозрачной, поэтому мы видим то, что находится под  водой. Но коэффициент преломления  воды не совпадает с аналогичным  коэффициента для воздуха, отсюда, объекты  выглядят в воде искаженными. 

     

    • Каустики

    Это эффект прохождения света сквозь водную поверхность, подверженную колебаниям. В этом случае возникают некоторые световые пятна  на дне и объектах, находящихся под водой. 
     
     
     
     
     
     

    • Зависимость коэффициента отражения / преломления  от угла взгляда
 

    Есть некоторая  зависимость между коэффициентом отражения и преломления в конкретной точке поверхности воды в зависимости от угла взгляда на воду (так называемый коэффициент Френеля). 
     

    • Зависимость цвета воды от угла взгляда и глубины

    Если смотреть на поверхность воды под разными  углами, то можно заметить, что при этом цвет воды немного меняется. Также цвет воды зависит от глубины: чем больше глубина, тем хуже видно то, что расположено под водой, и тем темнее цвет воды. 

    Ключом  к созданию реалистично отражающей и преломляющей воды являются 2 технологии:

  1. Рендеринг в текстуру (Render-To-Texture)
  2. Проекционное текстурирование (Projective Texturing)

    Далее рассмотрим их подробнее.

3.2 Создание текстур

    Основой для получения реалистичного  результата в общем случае являются 2 текстуры: отражения и преломления, которые меняются в процессе работы приложения. Возможны и другие варианты: в качестве текстуры отражения можно использовать кубическую карту окружения (статическую или динамическую), а вместо текстуры преломления просто использовать прозрачность. Но описываемый способ дает наилучшие результаты.

    Карту отражения можно создавать только тогда, когда камера находится над водой (предполагая, что при взгляде из-под воды никакого отражения нет), а карту преломления нужно строить всегда, вне зависимости от расположения наблюдателя. 

    При создании текстур мы считаем, что  поверхность воды можно представить  в виде плоскости. Для простоты будем  считать, что поверхность воды параллельна  плоскости  , т.е. имеет вид .

рис.15 Положения камеры для создания текстур отражения/преломления 

    При создании карты преломления нужно  произвести вывод сцены в буфер  из исходного положения камеры. Для  получения карты отражения нам  необходимо зеркально отразить камеру относительно плоскости воды. Матрица отражения принимает вид:

    

    Матрица вида зеркально отраженной камеры: , где матрица maView задается положением камеры в сцене.

    Теперь  можно производить вывод объектов сцены, которые будут отражаться в воде (предварительно изменив режим отсечения невидимых граней). Перед отрисовкой объектов в текстуру отражения необходимо изменить режим отсечения невидимых граней на противоположный. Это связано с тем, что из-за учета зеркального отражения в матрице вида сменится порядок обхода вершин геометрических примитивов. Соответственно, после завершения процесса создания карты отражения, нужно вернуть исходный режим отсечения.

    При создании карты преломления нужно  просто произвести отрисовку сцены  в буфер из исходной точки (т.е. в качестве матрицы вида нужно использовать матрицу matView). 
 

3.3 Проекционное текстурирование

    Текстуры  отражения и преломления представляют собой снимки сцены с позиций  двух камер. Чтобы их использовать, необходимо правильно их спроецировать на поверхность воды.

Моделирование и визуализация водных поверхностей