Смекни!
smekni.com

Реализация алгоритма обратной трассировки лучей для моделей с большим числом полигонов (стр. 1 из 7)

Факультет информатики и систем управления

Кафедра "Программное обеспечение ЭВМ и информационные технологии"

Курсовой проект

по машинной графике

Расчетно-пояснительная записка

Тема:

"Реализация алгоритма обратной трассировки лучей для моделей с большим числом полигонов"

Москва 2004

Оглавление

1. Введение

2. Конструкторская часть

2.1 Обоснование использованных алгоритмов

2.2 Структура данных

2.2.1 Источники света

2.2.2 Объекты для визуализации

2.2.3 Текстуры

2.3 Алгоритм обратной трассировки лучей

2.3.1 Описание алгоритма

2.3.2 Математическая основа обратной трассировки лучей

2.3.3 Составление матрицы

2.3.4 Программная реализация

2.3.5 Определение пересечения луча с треугольником

2.3.4 Формирование отраженного луча

2.3.5 Формирование преломленного луча

2.4 Оболочки

2.4.1 Алгоритм построения иерархических оболочек

2.4.2 Алгоритм обхода оболочек в трассировке лучей

2.5 Текстурирование

2.5.1. Процедуры для работы с текстурами

2.5.2. Собственно текстурирование

2.6 Закраска Фонга

2.7 Освещение

2.7.1. Модель освещения Уиттеда

2.7.2 Диффузное отражение

2.7.3 Зеркальное отражение

2.7.4 Фоновая освещенность

2.7.5 Прозрачность

2.7.6 Процедуры расчета освещенности

3. Технологическая часть

3.1 Выбор языка программирования и обоснование выбора

3.2 Модульная структура программы

3.3 Интерфейс программы

4. Экспериментально-исследовательская часть

Тест № 1

Тест № 2

Тест № 3

Заключение

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

1. Введение

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

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

Целью моей курсовой было так же сделать алгоритм обратной трассировки как можно более быстрым. Для этого я применил метод иерархических оболочек. Его применение позволяет сделать время рендеринга, пропорциональным логарифму от числа объектов, а не числу объектов. Добиться с помощью этого реального времени, конечно, не удастся, но делает время ожидания приемлемым, равным порядка 5-30 секунд для 30000 треугольников на сцене.

Модуль Engine программы, может быть использован отдельно, в других программах Delphi. С помощью всего нескольких функций пользователь сможет задать сцену любой сложности и произвести рендеринг сцены. Модуль содержит функции для:

управления камерой

управления источниками света

задания объектов на сцене.

поворота объектов

рендеринга сцены

вывода изображения в задаваемое окно

По использованию модуль Engine очень похож на модуль OpenGL.

2. Конструкторская часть

2.1 Обоснование использованных алгоритмов

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

Достоинством алгоритма является то, что он не требователен к памяти, в отличие от алгоритма z-буфера. А недостатком является то, что работает он сравнительно долго и не позволяет строить изображения в реальном времени.

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

Для сглаживания изображения применен алгоритм закраски Фонга. Он является самым затратным по времени. Метод Гуро, например, быстрее Фонга примерно в 5 раз. Но время его выполнения от общего времени рендеринга не превышает 3 процентов. Зато он дает великолепные результаты. В частности, блики выглядят куда реалистичнее, чем если использовать метод Гуро.

2.2 Структура данных

Сцена представляется набором объектов двух типов: источников света и собственно объектов, которые необходимо визуализировать.

2.2.1 Источники света

Источники света не имеют никаких геометрических размеров, они являются точечными и не рисуются при рендеринге. Информация об источниках света хранится в массиве Svet. В i-ом элементе массива хранится информация об i-ом источнике света. Элемент массива представляет собой запись:

TLight=record

tip: integer;

lim: real;

Center: TPoint;

R,G,B: real;

DirX,DirY,DirZ: real;

end;

Поле tip содержит информацию о типе источника. Если оно равно 1, то источник светит во все стороны. Если оно равно 2, то источник светит внутри конуса, направляющая которого DirX, DirY, DirZ, а угол при вершине равен 2*Lim. Угол измеряется в радианах. Если тип источника - 3, то источник также светит в конусе, но по мере отклонения от образующей его интенсивность уменьшается и на угле Lim равна нулю.

Поле Center содержит координаты источника в глобальной системе координат.

Поля R,G,B содержат интенсивность источника по красной, зеленой и синей компоненте. Они могут принимать значения от 0 до 1.

Если источник первого типа, то нет необходимости вводить поля DirX, DirY, DirZ и Lim, так как они не требуются для расчета интенсивности.

2.2.2 Объекты для визуализации

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

Objects (массив объектов), Vse (массив треугольников), Toch (массив точек).

Массив Objects

Элемент массива представляет собой запись:

TObj=record

StartT,EndT: integer;

StartG,EndG: integer;

XC,YC,ZC,R: real;

nnn,NPr: real;

end;

StartT, EndT соответствуют индексам в массиве точек. Они указывают, что точки с номером, большим или равным StartT и меньшим или равным EndT, принадлежат данному объекту.

StartG, EndG соответствуют индексам в массиве треугольников. Они указывают, что треугольники с номером, большим или равным StartG и меньшим или равным EndG, принадлежат данному объекту.

В NPr содержится показатель преломления данного объекта.

В nnn содержится коэффициент затухания света в данном объекте.

Массив Toch

Элемент массива представляет собой запись:

TApex=record

X,Y,Z: real;

nx,ny,nz: real;

end;

Поля X,Y,Z содержат координаты точки.

Поля nx, ny, nz содержат значение нормали в данной точке. Эти поля используются при закраске по методу Фонга.

Массив Vse

Массив содержит полную информацию обо всех треугольниках сцены.

Элемент массива представляет собой запись:

TGran=record

Nom: array [1. .3] of integer;

ColorR,ColorG,ColorB: Byte;

KOt,KPr,KRas,KDif,KBlik: real;

Tek: array [1. .3] of array [1. .2] of integer;

TNom: integer;

PaintType: boolean;

XC,YC,ZC,R: real;

O: integer;

p: real;

end;

Массив Nom содержит номера точек, которые являются вершинами треугольника.

ColorR, ColorG, ColorB содержат цвет треугольника.

Поля KOt, KPr, KRas, KDif, KBlik, содержат оптические коэффициенты поверхности треугольника.

O - номер объекта, которому принадлежит данный треугольник.

XC, YC, ZC, R - координаты центра и радиус сферической оболочки треугольника.

PaintType - способ закраски треугольника.

TNom - номер текстуры, которая наложена на треугольник.

Массив Tek содержит текстурные координаты, каждой вершины треугольника.

Запись треугольника не содержит координат вершин, она содержит ссылки на вершины. Таким образом, сразу несколько треугольников, могут ссылаться на одну и ту же вершину.

Это дает большую экономию памяти, так как общую для всех треугольников вершину нужно описать всего один раз.

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

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