Автор работы: Пользователь скрыл имя, 11 Декабря 2011 в 07:50, дипломная работа
Задача моделирования фотореалистичной воды в реальном времени является одной из классических задач компьютерной графики. Это связано с тем, что вода является сложным природным объектом, и ее внешний вид зависит от многих факторов таких, как окружающий мир или положение наблюдателя. Поэтому очень важно знать основные факторы, влияющие на поведение и внешний вид воды. Но в различных ситуациях поведение воды может очень сильно различаться, поэтому нужно выделять категории эффектов, характерные для каждого случая (в основном, это относится только к физическому поведению поверхности воды).
1. Введение 3
1.1 Обзор публикаций 4
1.2 Постановка задачи 6
2. Имитация поведения поверхности воды 7
2.1 Выбор типа сетки для представления поверхности воды 7
2.2 Волновое уравнение поверхности 8
3. Имитация оптических эффектов 12
3.1 Оптические свойства воды 12
3.2 Создание текстур 13
3.3 Проекционное текстурирование 15
3.4 Отсечение объектов 16
3.5 Цвет воды 17
4. Описание приложения 19
4.1 HLSL – высокоуровневый язык шейдеров 19
4.2 Рендеринг в текстуру (Render To Texture) 21
4.3 Руководство пользователя 21
5. Заключение 23
6. Список литературы 24
,
где
wx (wz) – размер сетки по оси
x (z), а hx (hz) – шаг сетки по оси
x (z).
Радиальная сетка
Более сложный и оптимальный способ. Наблюдатель всегда находится в центре сетки, таким образом, детализация зависит от расстояния до камеры.
Для определения координат вершин такой сетки необходимо задать 2 параметра – количество колец (для разбиения сетки на концентрические области) и количество секторов (для разбиения кольца), а также необходимо задать некую функцию, которая будет определять изменение радиуса колец при увеличении дистанции до наблюдателя. В простейшем случае эта функция может иметь вид: , где а – некоторая константа, а i – номер кольца.
Поверхность воды – динамическая поверхность в трехмерном пространстве. Поэтому положение каждой точки поверхности в общем виде описывается функцией . Данная функция задает высоту поверхности в точке (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 определяется сеткой (h = 1/n, n – число
разбиений по х), t зададим произвольно
(так как время неограниченно).
Значения в узлах, отмеченных на рис.8, мы знаем из начальных условий. Таким образом, мы знаем весь нулевой слой. Применяя шаблон к узлу (1,0), мы найдем . Продвигая шаблон дальше, мы найдем значения сеточной функции на первом слое. Далее, применяя крестообразный шаблон, мы найдем второй слой и так далее. |
В
случае нашей разностной схемы мы
работаем в трехмерном пространстве.
Принимая, что значения сеточной функции
на 0 и 1 слое по времени равны нулю, мы можем
найти значения на 2 слое, зная его и значение
на 1 слое, найдем третий и так далее.
рис.9 |
рис.10 |
В
этом случае сетка представляет собой
«решетку». Некоторые части сетки
представлены на рисунках 9 и 10.
Рассмотренный алгоритм моделирования обладает некоторыми интересными особенностями.
Он легко позволяет имитировать точечные воздействия (падение капли на воду). Это происходит за счет отклонения нескольких узлов от состояния равновесия. Данный принцип позволяет создать эффект распространяющихся кругов на воде. Сначала произвольным образом и в произвольный момент времени выбирается центральная точка возмущения, которая отклоняется на некоторое значение. Затем берется некоторая окрестность выбранной точки (по всем направлениям), точки которой отклоняются по определенному нелинейному закону в зависимости от расстояния до центра возмущения.
рис.11
Другой спецификой метода является эффект отражения волн от стенок бассейна. Отражение возникает за счет граничных условий, накладываемых на рассматриваемую функцию. Зная этот факт, мы можем подобным образом вводить дополнительные области внутри водной поверхности (острова), узлы которых статичны, и получить отражения от этих областей. Кроме того, можно получить цикличную картину распространения волн, если предусмотреть выход волн за границу сетки и связь между противоположными границами бассейна.
Есть ещё одно интересное свойство. С его помощью можно создать картину расходящихся волн от движущегося по воде объекта, например лодки. Это достигается тем, что одновременно с самим объектом мы по траектории его движения перемещаем источник точечных возмущений, который и отвечает за появление волн.
рис.14 Волны от движущихся объектов
Рассмотрим основные и наиболее заметные природные эффекты, связанные с водой.
Вода является очень хорошим отражателем, поэтому при взгляде на нее мы видим отражения всех объектов, как в зеркале. При этом обычно отражения искажаются за счет неровностей поверхности воды, т.е. наблюдатель видит рябь на воде.
Вода является
достаточно прозрачной, поэтому мы
видим то, что находится под
водой. Но коэффициент преломления
воды не совпадает с аналогичным
коэффициента для воздуха, отсюда, объекты
выглядят в воде искаженными.
Это эффект прохождения
света сквозь водную поверхность, подверженную
колебаниям. В этом случае возникают некоторые
световые пятна на дне и объектах, находящихся
под водой.
Есть некоторая
зависимость между коэффициентом отражения
и преломления в конкретной точке поверхности
воды в зависимости от угла взгляда на
воду (так называемый коэффициент Френеля).
Если смотреть
на поверхность воды под разными
углами, то можно заметить, что при этом
цвет воды немного меняется. Также цвет
воды зависит от глубины: чем больше глубина,
тем хуже видно то, что расположено под
водой, и тем темнее цвет воды.
Ключом к созданию реалистично отражающей и преломляющей воды являются 2 технологии:
Далее рассмотрим их подробнее.
Основой для получения реалистичного результата в общем случае являются 2 текстуры: отражения и преломления, которые меняются в процессе работы приложения. Возможны и другие варианты: в качестве текстуры отражения можно использовать кубическую карту окружения (статическую или динамическую), а вместо текстуры преломления просто использовать прозрачность. Но описываемый способ дает наилучшие результаты.
Карту
отражения можно создавать только тогда,
когда камера находится над водой (предполагая,
что при взгляде из-под воды никакого отражения
нет), а карту преломления нужно строить
всегда, вне зависимости от расположения
наблюдателя.
При создании текстур мы считаем, что поверхность воды можно представить в виде плоскости. Для простоты будем считать, что поверхность воды параллельна плоскости , т.е. имеет вид .
рис.15
Положения камеры для
создания текстур отражения/преломления
При создании карты преломления нужно произвести вывод сцены в буфер из исходного положения камеры. Для получения карты отражения нам необходимо зеркально отразить камеру относительно плоскости воды. Матрица отражения принимает вид:
Матрица вида зеркально отраженной камеры: , где матрица maView задается положением камеры в сцене.
Теперь
можно производить вывод
При
создании карты преломления нужно
просто произвести отрисовку сцены
в буфер из исходной точки (т.е. в качестве
матрицы вида нужно использовать матрицу
matView).
Текстуры
отражения и преломления
Информация о работе Моделирование и визуализация водных поверхностей