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

ЛИЧНЫЙ КАБИНЕТ 

 

Здравствуйте гость!

 

Логин:

Пароль:

 

Запомнить

 

 

Забыли пароль? Регистрация

Повышение уникальности

Предлагаем нашим посетителям воспользоваться бесплатным программным обеспечением «StudentHelp», которое позволит вам всего за несколько минут, выполнить повышение уникальности любого файла в формате MS Word. После такого повышения уникальности, ваша работа легко пройдете проверку в системах антиплагиат вуз, antiplagiat.ru, etxt.ru или advego.ru. Программа «StudentHelp» работает по уникальной технологии и при повышении уникальности не вставляет в текст скрытых символов, и даже если препод скопирует текст в блокнот – не увидит ни каких отличий от текста в Word файле.

Результат поиска


Наименование:


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

Информация:

Тип работы: дипломная работа. Добавлен: 31.10.2012. Сдан: 2011. Страниц: 23. Уникальность по antiplagiat.ru: < 30%

Описание (план):


Федеральное агентство по образованию Российской Федерации
Государственное образовательное учреждение
высшего профессионального образования
Нижегородский государственный университет им. Н.И. Лобачевского 

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

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

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

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

     
     
     
     
     
     
     
         Работа допущена к защите Заведующий  кафедрой МО ЭВМ
    д.ф.-м.н., проф.
               _________________Стронгин Р.Г.
                    Подпись
    «____»_________________2008 г. 

         
    Исполнитель: студентка гр. 8403 фак-та ВМК
    _________________Лалакина  А.А.
         Подпись
    «____»_____________2008 г. 
     
     

    Научный руководитель: проф. каф. МО ЭВМ, д.т.н.
             _____________Турлапов В.Е.
                 Подпись
    «____»_____________2008 г. 

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

 

Оглавление 
 
 
 
 

 

    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 Постановка задачи

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

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 технологии:
    Рендеринг в текстуру (Render-To-Texture)
    Проекционное текстурирование (Projective Texturing)
    Далее рассмотрим их подробнее.

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

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

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

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

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

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

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

рис.16 Принцип работы метода проецирования текстуры 
 

    Здесь используется метод проекционного  текстурирования. Данный метод заключается  в том, что для каждой точки  поверхности вычисляется координата текстуры для последующего наложения (фактически, это координата точки в пространстве экрана камеры). Это делается путем применения преобразования, заданного матрицами вида, проекции и матрицей следующего вида, которая преобразует координаты точек пространства экрана в текстурные координаты, а именно:
    Перевод координат из интервала [-1.0; 1.0] в стандартный диапазон текстурных координат [0.0; 1.0]
    Инверсия координат по оси y (в пространстве экрана ось y направлена вверх, а в пространстве текстуры - вниз)
    

рис.17Различия в системах отсчета для пространств текстуры и экрана 

    Поэтому для правильного наложения текстур  на поверхность воды необходимо использовать матрицу 
matProjectTex = matView * matProjec t * matRemapping.
    Данное преобразование координат применяется к вершине поверхности воды в вершинном шейдере:
    float4 vProjTex = mul( vPos, matProjectTex );
    Затем текстурные координаты вычисляются на основе полученного результата в пиксельном шейдере:
    float2 vTexCoord = vProjTex.xy / vProjTex.w;
    После этого можно производить выборку из проецируемой текстуры на основе полученных координат.

3.4 Отсечение объектов

    В процессе создания карт отражения и  преломления необходимо отсекать “лишние” объекты или части сцены, которые  не должны отражаться или преломляться. Есть два широко распространенных способа сделать такое отсечение в процессе рендеринга сцены: User Clip Planes  и Oblique Frustum Culling.
    Первый  способ – User Clip Planes. Данный механизм позволяет установить несколько плоскостей отсечения, в результате чего вывод точек возможен только в части пространства, ограниченной этими плоскостями. Но есть одна проблема: если использовать фиксированный графический конвейер, то уравнение плоскости отсечения должно быть задано в мировом пространстве, а в случае программируемого конвейера – в том же пространстве, что и вершины на выходе. Это оказывается очень неудобным в том случае, когда в процессе работы производится частое переключение с одного конвейера на другой (при отрисовке различных материалов и объектов).
    В связи с этим часто применяется  другой способ, который оказывается  более удобным за счет своей простоты и отсутствия вышеописанных проблем (Oblique Frustum Culling). Идея этого метода состоит в преобразовании матрицы проекции таким образом, что ближняя отсекающая плоскость переводится в плоскость водной поверхности, а это нам и нужно.
    Но  после отсечения возникает другая проблема, которая касается объектов, пересекающихся с водной поверхностью. Все дело в том, что в результате последующего искажения текстур на границе между водой и данными объектами будут видны “разрывы”. Чтобы избежать этого, наилучшим способом является специальный метод маски изображения. Он дает почти идеальный результат. Ни один из других алгоритмов не сможет полностью устранить артефакты.
    Суть  метода заключается в следующем: мы выводим всю сцену только в Z-буфер, при этом буфер кадра заполнен белым цветом. Затем мы рисуем воду черным цветом, не очищая Z-буфер. Таким  образом, часть воды, скрытая за другими  объектами, не выводится. В итоге мы получаем черно-белую текстуру, в которой все объекты, кроме воды, закрашены белым цветом. Это и есть наша “маска”, которая позволяет определить, где на экране вода, а где перекрывающие ее сплошные объекты.
    Теперь, когда есть маска, можно использовать ее в процессе искажения текстур отражения и преломления в шейдере водной поверхности следующим образом: если искаженные координаты соответствуют области с черным цветом, то все нормально; если же точка с этими координатами оказывается в области с белым цветом, то нужно использовать исходные координаты без искажений. Все эти операции можно записать следующим образом:
    float4 vReflectRefractTexCoord = saturate(vTexCoord + vOffset); 

    float mask1 = tex2D(MaskSampler, vReflectRefractTexCoord.xy).r;
    float mask2 = tex2D(MaskSampler, vReflectRefractTexCoord.zw).r; 

    float3 reflection = tex2D(ReflectSampler, vReflectRefractTexCoord.xy);
    float3 reflection2 = tex2D(ReflectSampler, vTexCoord.xy);
    float3 refraction = tex2D(RefractSampler, vReflectRefractTexCoord.zw);
    float3 refraction2 = tex2D(RefractSampler, vTexCoord.zw); 

    reflection = lerp(reflection, reflection2, mask1);
    refraction = lerp(refraction, refraction2, mask2); 

    Таким образом, можно легко устранить возникающие артефакты. При этом скорость работы приложения практически не изменяется, что говорит о высокой эффективности метода. Этот метод является расширением метода из [9], расширение предложено Рябчиковым А.В.

3.5 Цвет воды

    В простейшем случае цвет точки водной поверхности можно вычислить  на основе смешивания текстур отражения  и преломления с помощью формулы  Френеля (на самом деле берется некоторое  приближение формулы Френеля, которое  достаточно просто описывается). 


    рис.18 Сравнение приближений формулы Френеля
    На  рисунке показана разница между  двумя способами приближения  формулы Френеля (вертикальная ось  соответствует степени отражения):
    ,

    Здесь n1 и n2 – коэффициенты преломления соответствующих сред, - угол между нормалью и направлением взгляда. Для воздуха и воды .
    Обычно  используется первая формула, причем считается  , хотя второй способ аппроксимации дает меньшую погрешность при вычислении коэффициента Френеля. А иногда используется линейная зависимость , но это приводит к еще большей ошибке по сравнению с (1).
    Таким образом, с помощью следующей формулы вычисляется конечный цвет воды в данной точке (производится линейная интерполяция между двумя значениями с помощью коэффициента Френеля):
    color = lerp(RefractionColor, ReflectionColor, Fresnel)
    Если  остановится на этом, то получится, что вода абсолютно прозрачна. Для большей реалистичности нужно учитывать оттенок воды, который влияет на цвет преломляемых объектов. Одним из способов реализации этого эффекта (и наиболее правильным) является вывод объектов с учетом тумана при создании карты преломления. В этом случае получится, что цвет воды зависит от глубины в каждой точке.
    Есть  и более простой метод, но он дает менее реалистичный результат. Можно  просто задать 2 оттенка воды – один для отраженных, а другой для преломленных объектов, и перед смешиванием цветов, взятых из соответствующих текстур, умножить их соответственно на эти оттенки. В этом случае цвет дна не будет зависеть от глубины, но иногда этот способ очень удобен за счет своей простоты.
    
    Также, можно считать, что оттенок зависит от угла зрения на воду: чем меньше угол между нормалью к поверхности и вектором зрения, тем темнее цвет воды, и наоборот. Таким образом, можно интерполировать значение цвета в пределах двух крайних значений и применять его к каждой точке.
 

4. Описание приложения

    Базовое приложение использует DXUT framework. В качестве основы берется готовая 3D сцена, содержащая небольшой кратер для воды (ландшафт) и небесный купол (skybox) на основе кубической карты окружения. В приложение изначально было встроено управление камерой (camera) и вводом (input). Весь аппарат моделирования водной поверхности содержится в классах NXWaterCore и NXWater.
    Класс NXWaterCore содержит необходимые для работы матрицы, а именно, матрицу отражения m_mReflect; матрицу, которая преобразует координаты точек пространства экрана в текстурные координаты, m_mTex. Так же уровень воды и уровни, необходимые для отражения/преломления и методы для работы с ними.
    Класс NXWater отвечает за триангуляцию и визуализацию водной поверхности.
    Приложение  создано в среде Visual Studio 2005 с использованием расширения DirectX SDK 9.0с (2006).

4.1 HLSL – высокоуровневый язык шейдеров

    Шейдер - это микропрограмма на языке низкого уровня (как ассемблер), исполняющаяся на графическом процессоре видеокарты (GPU) и обрабатывающая поток данных, а это значит, что у шейдерной программы есть "вход" и есть "выход", а "посередине" - набор команд, выполняющих обработку. Под "потоком данных" подразумевается информация о координатах вершин полигонов, освещении каждой вершины, нормалях, текстурных координатах, и т.п., непрерывно поступающая блоками в шейдерную программу.
    Шейдеры полностью программируемы и позволяют  нам реализовать техники, которые  отсутствуют в фиксированном  конвейере функций. В результате количество доступных техник значительно расширяется.
    Написание шейдеров на низкоуровневом языке очень трудоемко и неудобно, поскольку даже для реализации простых эффектов приходится писать достаточно большое количество кода, что, в свою очередь, мешает пониманию и изменению кода. Но возникновение языков высокого уровня программирования шейдеров (HLSL / GLSL) сделало процесс написания шейдеров максимально простым и удобным, т.к. появилась возможность разработки шейдеров на языке высокого уровня, похожем на С.
    Программируемые HLSL-шейдеры используют компилятор HLSL, чтобы сгенерировать ассемблерный код по исходному высокоуровневому коду. Таким образом, данный язык позволяет программировать шейдеры на алгоритмическом уровне.
    Графический эффект обычно состоит из нескольких компонентов: вершинный и/или пиксельный шейдер, список режимов устройства, которые должны быть установлены, и один или несколько проходов визуализации. Кроме того, часто для графических эффектов желательно наличие механизма обработки сбоев, позволяющего эффекту выполняться на различных видеокартах (то есть, необходимо наличие нескольких версий эффекта, которые реализуют его или пытаются достичь наиболее близкого соответствия реализации, используя возможности установленного оборудования). Ясно, что все эти задачи связаны с одним эффектом. Следовательно, логичным шагом будет попытка объединения всех этих задач в один блок.
    Каркас  эффектов Direct3D предоставляет подобный механизи для объединения связанных  с визуальным эффектом задач в  один файл эффекта. Такая реализация эффектов имеет ряд преимуществ. Во-первых, она позволяет нам менять реализацию эффекта без перекомпиляции исходного кода приложения. Это делает процесс обновления эффектов гораздо проще, независимо от того, вызван ли он исправлением обнаруженных ошибок, или усовершенствованиями, связанными с появлением нового оборудования. Во-вторых, мы объединяем все компоненты эффекта в одном файле.
    Файл  эффекта состоит из одной или  нескольких техник (techniques). Техникой называется конкретный способ реализации спецэффекта. Другими словами, файл эффекта описывает один или несколько способов реализации одного и того же спецэффекта. Зачем надо несколько различных реализаций одного и того же эффекта? Дело в том, что установленное на компьютере оборудование может не поддерживать определенную реализацию эффекта. Следовательно необходимо реализовать несколько версий одного и того же эффекта, ориентированных на различное оборудование.
    Возможность реализовать все версии эффекта  в одном файле дает нам более полную инкапсуляцию эффекта в целом, а объединение реализации эффекта это и есть одна из целей каркаса эффектов.
    Каждая  техника объединяет один или несколько  проходов визуализации (rendering passes). Проход визуализации объединяет режимы устройства, режимы выборки и шейдеры, используемые для визуализации на данном этапе. Причина наличия нескольких проходов в том, что для реализации некоторых эффектов необходимо визуализировать один и тот же объект несколько раз с различными режимами визуализации, шейдерами и т.д. для каждого прохода.
    Файл  эффектов не ограничивает нас только использованием программируемого конвейера. Например, можно использовать фиксированный конвейер для управления режимами устройств, такими как освещение, материалы и текстуры.
    Мы  решаем волновое уравнение численно с помощью шейдеров. Для этого мы используем текстуру. По сути, текстура - это массив цветовых точек. Текстуры бывают разного формата, есть RGB, есть с альфа-каналом (RGBA), монохромные и много других. Мы используем текстуру формата RGBA. В ней мы будем хранить вычисленное значение и значение с предыдущего шага, так как оба эти значения нужны для последующих расчетов. Так же будем вычислять нормали к поверхности воды и составлять карту нормалей. Для этого нам понадобится техника рендеринга в текстуру.

4.2 Рендеринг в текстуру (Render To Texture)

    Данный  метод достаточно широко распространен  в компьютерной графике и является одной из продвинутых техник. С  одной стороны, это не очень сложно, но с другой стороны этот способ является мощным средством создания многих визуальных эффектов (например, эффект свечения вокруг объекта – glow effect, карты окружения и карты теней, эффекты постобработки, а также многое другое).
    Принцип использования метода очень прост:
    Создать текстуру с одним уровнем детализации и флагами D3DUSAGE_RENDERTARGET и D3DPOOL_DEFAULT
    Получить поверхность текстуры (surface)
    Сохранить backbuffer, чтобы в конце восстановить исходное состояние
    Установить созданную текстуру в качестве объекта рендеринга
    Произвести отрисовку сцены
    Восстановить состояние, установив сохраненный backbuffer в качестве объекта рендеринга
    Для упрощения процесса можно использовать интерфейс ID3DXRenderToSurface. В таком случае не нужно будет заботиться о сохранении backbuffer’a, а кроме того появится возможность  производить рендеринг с включенным аппаратным сглаживанием.
    Исходя  из вышесказанного, можно утверждать, что данный метод является вполне простым, но, тем не менее, мощным средством  создания некоторых эффектов.

4.3 Руководство пользователя

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

рис.19 Внешний вид приложения
    Для успешного запуска приложения необходимо, чтобы видеокарта поддерживала Shader Model 2.0. 

    Управление  производится с помощью клавиатуры и мыши:
    WASD или стрелки   – движение
    SHIFT (при движении)  – быстрое перемещение
    SPACE     – прыжок (в режиме хождения по ландшафту)
    Правая  кнопка мыши – переключение режимов GUI и управления камерой 

    Приложение  позволяет настраивать: силу искажений и дождя, коэффициент вязкости жидкости. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

           
 

5. Заключение

    Итак, в результате работы были изучены некоторые способы физического моделирования и реализован один из них (численное решение волнового уравнения)
    Кроме физических моделей были также рассмотрены  способы визуального моделирования  водной поверхности: создание текстур  отражения и преломления и их смешивание по формуле Френеля, влияние глубины на цвет воды и  применение эффекта каустик.
    В итоге, мы получили реализацию физической модели, позволяющей эффективно имитировать движение водной поверхности и ее взаимодействие с объектами (а именно, точечное воздействие на поверхность воды), а так же реализовали основные оптические свойства воды.
    Будущие исследования будут вестись в  следующих направлениях.
    Во-первых, реализация других физических моделей (например, волны Gerstner или быстрое преобразование Фурье).
    Во-вторых, увеличение реалистичности и детальности  отображения воды. Здесь открывается  широкий простор для творчества. Например, для увеличения реалистичности можно добавить механизм моделирования брызг на основе систем частиц, пены, каустик, а также так называемого эффекта «godrays». Так же можно добавить объекты, движущиеся в воде и механизм образования расходящихся волн от этих объектов.
 

6. Список литературы

    Lasse Staff Jensen and Robert Golias. Deep-Water Animation and Rendering. Gamasutra, September 26, 2001 [HTML] 
    (
    http://www.gamasutra.com/gdce/2001/jensen/)
    Н.А. Елыков, И.В. Белаго, С.А. Кузиковский. Методы визуализации и анимации моделей протяженных водных поверхностей в системах виртуальной реальности. GRAPHICON 2005 [PDF]
    Cass Everitt. Projective Texture Mapping. NVIDIA [PDF]
    John Isidoro, Alex Vlachos, Chris Brennan. Rendering Ocean Water. ShaderX  [PDF]
    John Isidoro, Alex Vlachos, Chris Oat. Rippling Reflective and Refractive Water. ShaderX [PDF]
    Ben Humphrey. Realistic Water Using Bump Mapping and Refraction. [PDF] (http://www.gametutorials.com)
    Mark Finch. Effective Water Simulation from Physical Models. NVIDIA GPU Gems, 2004, p. 5-29
    Yuri Kryachko. Using Vertex Texture Displacement for Realistic Water Rendering. NVIDIA GPU Gems 2, 2005, p. 283-294
    Tiago Sousa. Generic Refraction Simulation. NVIDIA GPU Gems 2, 2005, p. 295-305
    Kurt Pelzer. Advanced Water Effects. ShaderX2, 2003, p. 207-225
    Static Water Simulation [HTML] (http://collective.valve-erc.com/)
    Маркичев А. С., Супиков А.М. Физическое моделирование деформируемых поверхностей в игровых и анимационных приложениях. Анимация водной поверхности. International Conference Graphicon, 1999. [PDF]
    Материалы сайтов для разработчиков игр [HTML] (http://www.gamedev.ru/)
    Frank D. Luna. Introduction to 3D Game Programming with DirectX 9.0
 

 

Приложение

NXWater.h
#ifndef _NX_WATER_
#define _NX_WATER_ 

#include <d3dx9.h> 

#include "NXCommon.h" 

//--------------------------------------------------------------------------
HRESULT    NXCreateRegularGrid(LPD3DXMESH* ppMesh, LPDIRECT3DDEVICE9 pDevice,
                               UINT iXCount, UINT iZCount, float fXWidth, float fZWidth,
                               D3DXVECTOR3 vCenter);
D3DXMATRIX NXObliqueFrustumCulling(D3DXPLANE& plane, D3DXMATRIX& view, D3DXMATRIX& proj); 

//--------------------------------------------------------------------------
class NXWaterCore
{
    protected:
        D3DXMATRIX m_mReflect; // reflection matrix (about water plane)
        D3DXMATRIX m_mTex;     // remapping matrix (to transform texture coords)
        D3DXMATRIX m_mProj;    // extended projection matrix (increased FOV) 

        D3DXPLANE  m_plNormal; // real water plane
        D3DXPLANE  m_plLower;  // clip planes for rendering reflection & refraction
        D3DXPLANE  m_plUpper; 

        float      m_fLevel;   // water level
        float      m_fShift;   // clip planes shift
        float      m_fFOV;     // current field-of-view for projection matrix 

    public:
        NXWaterCore();
        ~NXWaterCore(); 

        void Init(float fLevel, float fShift);
        void RebuildProjectionMatrix(float fFOV);
        void InitProjectionMatrix(float fFOV, D3DXMATRIX* pMatrix); 

        inline void SetLevel(float fLevel)      { Init(fLevel, m_fShift); }
        inline void SetPlaneShift(float fShift) { Init(m_fLevel, fShift); } 

        inline float GetLevel() { return m_fLevel; } 

        inline D3DXPLANE&  LowerPlane() { return m_plLower; }
        inline D3DXPLANE&  Plane()      { return m_plNormal; }
        inline D3DXPLANE&  UpperPlane() { return m_plUpper; } 

        inline D3DXMATRIX& ReflectionMatrix()  { return m_mReflect; }
        inline D3DXMATRIX& ScreenToTexMatrix() { return m_mTex; }
        inline D3DXMATRIX& ProjExMatrix()      { return m_mProj; }
};
//--------------------------------------------------------------------------
class DepthTexture
{
public:
        ID3DXRenderToSurface* m_RTS;
        IDirect3DSurface9*    m_TopSurface;
public:
        DepthTexture(int iWidth, int iHeight,D3DFORMAT TexFormat);
       ~DepthTexture(); 

        void BeginScene();
        void EndScene(); 

        void OnLostDevice();
        void OnResetDevice(IDirect3DDevice9* pDevice); 

        IDirect3DTexture9* m_Texture; 

        int           m_iWidth;
        int           m_iHeight;
        int           m_iMipLevels;
        D3DFORMAT     m_TexFormat;
        bool          m_bUseDepthBuffer;
        D3DFORMAT     m_DepthFormat;
        D3DVIEWPORT9* m_ViewPort;
        bool          m_bAutoGenMip;
};
//--------------------------------------------------------------------------
class NXWater
{
    protected:
        IDirect3DDevice9*  m_pDevice;
        ID3DXEffect*       m_pEffect;
        ID3DXMesh*         m_pMesh;
        IDirect3DTexture9* m_pReflectTex;
        IDirect3DTexture9* m_pRefractTex;
        IDirect3DTexture9* m_pMaskTex;
        DepthTexture*     m_pDepthTex;
        DepthTexture*      m_pDepthTex2;
       
        IDirect3DTexture9* m_pFresnelTex;
        IDirect3DTexture9* m_pNormalsTex;
        IDirect3DSurface9* m_pBackBuffer;     

        NXWaterCore        m_Core;
       
    public:
        NXWater();
        ~NXWater(); 

        void Init(float fLevel = 0.0f,
и т.д.................


Перейти к полному тексту работы


Скачать работу с онлайн повышением уникальности до 90% по antiplagiat.ru, etxt.ru или advego.ru


Смотреть полный текст работы бесплатно


Смотреть похожие работы


* Примечание. Уникальность работы указана на дату публикации, текущее значение может отличаться от указанного.