Смекни!
smekni.com

Построение реалистичного изображения методом обратной трассировки лучей (стр. 5 из 6)

Все классы – потомки TPrimitive предоставляют следующие функции:

float getT(TPoint3d p0, TPoint3d viewDir) – возвращает расстояние от точки начала(p0) луча viewDir до ближайшей точки пересечения с примитивом void getTArr(float* arr, int& n, TPoint3d p0, TPoint3d viewDir) – заполняет массив arr расстояниями от точки начала(p0) луча viewDir до ближайшей всех точек пересечения с примитивом void getNormal(TPoint3d& n, const TPoint3d& p) – возвращает координаты вектора нормали к примитиву в точке p void getColor(TRGBColor& c, const TPoint3d& p) - возвращает цвет примитива точке p (с учетом текстуры).


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

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

При разработке программы был использован язык программирования высокого уровня C++ в составе среды визуального программирования CBuilder6.

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

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

Описание интерфейса программы


Главное меню программы:

- Файл

- Сохранить картинку – записать в файл содержимое окна вывода изображения

- Выход – выход из программы

- Настройки

- Опции – открытие формы «Опции»

- Инструменты

- Лупа – открытие формы «Лупа»

- Генерировать – запуск генерации изображения

- Помощь

- О программе – сведения о разработчике и версия программы

Для генерации изображения нажмите кнопку ГЕНЕРИРОВАТЬ или выберите аналогичный пункт в главном меню.

В нижней строке во время генерации изображения выдается сообщение ИДЕТ ГЕНЕРАЦИЯ ИЗОБРАЖЕНИЯ. По завершении генерации здесь будет отображено время, затраченное на генерацию.


На этой вкладке находятся средства по настройке освещения сцены.

Координаты источника – координаты в мировой системе координат источника света, выбранного в выпадающем списке.

Интенсивность источника – значения трех компонент интенсивности источника света, выбранного в выпадающем списке.

Фоновая интенсивность – значения трех компонент фоновой интенсивности.

Кнопка “+” (рядом с выпадающим списком) – добавление нового источника света.

Кнопка “ (рядом с выпадающим списком) – удаление источника света, выбранного в выпадающем списке.

ФОРМА «ОПЦИИ». ВКЛАДКА «КАМЕРА».

На этой вкладке находятся средства по настройке опций камеры.

Предосмотр – здесь можно увидеть примерный вид изображения до его генерации.

Навигация – настройки положения камеры.

Дополнительно – при нажатии на эту кнопку появляется форма Свойства камеры с дополнительными параметрами камеры.

ФОРМА «СВОЙСТВА КАМЕРЫ».

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

Шаг изменения радиуса – приращение радиуса камеры при однократном нажатии кнопки “–” на вкладке “Камера” формы “Опции” (или уменьшение при однократном нажатии кнопки “+”).

ФОРМА «ОПЦИИ». ВКЛАДКА «МАТЕРИАЛЫ».


При нажатии на кнопку «Стекло» отображаются свойства материала стакана.

Цвет – цвет материала стакана.

Коэф. диффузного отражения – коэффициент KD материала стакана (см. раздел 2.2.1). Коэф. преломления – абсолютный коэффициент преломления материала стакана. Дополнительно – при нажатии на эту кнопку появляется форма Свойства стекла с дополнительными параметрами материала стакана.

ФОРМА «СВОЙСТВА СТЕКЛА».

Коэффициент блика – коэффициент KS материала стакана (см. раздел 2.2.1). Размытость блика – показатель степени p материала стакана. Расстояние затухания – максимальное расстояние, которое может пройти свет в материале до полного затухания. При нажатии на кнопку «Стол» отображаются свойства материала стола.


Цвет – цвет материала стола.

Коэф. диффузного отражения – коэффициент KD материала стола (см. раздел 2.2.1).

Текстура – если галочка установлена, то на столе будет отображаться текстура.

Выбрать текстуру – выбор файла изображения (*.bmp), который будет использоваться как текстура стола.

Дополнительно – при нажатии на эту кнопку появляется форма Свойства стола с дополнительными параметрами материала стола.

ФОРМА «СВОЙСТВА СТОЛА».

Коэффициент блика – коэффициент KS материала стола (см. раздел 2.2.1).

Размытость блика – показатель степени p материала стола.

Повторения текстуры – сколько раз текстура стола будет повторяться вдоль осей OX и OY.


ФОРМА «ОПЦИИ». ВКЛАДКА «СИСТЕМНЫЕ».

На этой вкладке можно настраивать алгоритмы, реализованные в программе.

Глубина рекурсии – этот параметр устанавливает глубину рекурсии в алгоритме трассировки. При бОльших значениях этого параметра качество сгенерированного изображения улучшается.

ВНИМАНИЕ!

Глубина рекурсии СИЛЬНО влияет на скорость генерации изображения. Не рекомендуется ставить значения этого параметра больше 10.

Анитиалиазинг – включение алгоритма сглаживания изображения.

Тип тени – выбор алгоритма построения теней.

Лупа позволяет рассмотреть сгенерированное изображение в увеличенном виде.

Можно менять масштаб увеличения лупы (1:1, 1:2, 1:4, 1:8, 1:10, 1:16) в выпадающем меню.

3. Исследовательская часть

Исследования проводились на компьютере со следующей конфигурацией:

CPU AMD Athlon 2100+

512 Mb DDR SDRAM

WindowsXP

Зависимость времени генерации от глубины рекурсии

В этом тесте исследовалась зависимость времени генерации изображения от глубины рекурсии. Исследования проводились для сцены освещенной одним источником света.

T1 – время генерации без тени в секундах.

T2 – время генерации со сплошной тенью в секундах.

T3 – время генерации с реалистичной тенью в секундах.

N – глубина рекурсии.

Зависимость времени генерации от количества источников

Анализ результатов исследований

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

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

Во втором исследовании показано, что зависимость времени генерации от количества источников света линейна. Из полученных значений можно вычислить время, необходимое для расчета одного источника. На машине, на которой проводились исследования, при глубине рекурсии 5 это время примерно равно 0,8 секунды.


Заключение

В этой программе были продемонстрированы результаты роботы алгоритма генерации реалистичных изображений – обратной трассировки лучей.

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

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

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