Курсовая работа: Построение реалистичных трехмерных изображений в стандарте OpenGL

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

void glNormal3 [b s i f d] (type coords)

void glNormal3 [b s i f d]v (type coords)

которые присваивают значения координат, заданных параметрами coords, вектору нормали. Аргументы типов GLbyte, GLshortи GLintпреобразуются в формат с плавающей точкой и ограничиваются диапазоном [-1.0, 1.0]. В общем случае нормаль, определяемая этими командами, не имеет единицы длины. Однако если включен режим нормализации (выполнена команда glEnableс аргументом GL_NORMALIZE), то нормали, определенные при помощи этой команды, нормализуются после трансформации. По умолчанию нормализация заблокирована, а вектор нормали имеет координаты (0.0, 0.0, 1.0).


Рис. 5.Векторы нормали Рис. 6.Грань и нормаль к ней

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

Свойства материала

Различные материалы по-разному отражают свет. Металл это делает хорошо, а пластиковые поверхности обычно выглядят тусклыми. Кроме того, некоторые поверхности сами излучают свет, например, фосфор. Задавая различные параметры материала, можно управлять тем, насколько блестящим он будет выглядеть, и будет ли он сам излучать свет. На рис. 7 изображены 24 чайника, освещаемые одним источником света.

Рис. 7 Объекты с различными свойствами материала


Что здесь для нас интересно? Прежде всего – сами свойства. В приведенном фрагменте мы устанавливали рассеянный, диффузный и зеркальный цвета материала, причем, только для его лицевой поверхности. Можно ли задавать какие-нибудь еще параметры? Для ответа на этот вопрос рассмотрим команды:

void glMaterial [i f] (GLenum face, GLenum pname, GLtype* params)

и

void glMaterial [i f] v (GLenum face, GLenum pname, GLtype* param)

которые позволяют определить различные свойства материала. Какие именно – зависит от используемых параметров. Параметры материала, как и во многих других случаях, различаются для лицевой и обратной поверхностей. Параметры лицевой поверхности используются для точек, линий, битовых массивов и всех многоугольников, когда заблокировано двустороннее освещение или только для лицевых, если двустороннее освещение разрешено. Параметры для обратных поверхностей определяют затенение невидимых многоугольников, только когда разрешено двустороннее освещение. К каким поверхностям применяются задаваемые параметры, определяется аргументом face:

GL_FRONT лицевые

GL_BACK обратные

GL_FRONT_AND_BACK и те и другие

Аргумент рnameопределяет, какие параметры материала будут обновляться и может принимать только одно значение – GL_SHININESS, задающее степень зеркального отражения материала для первой версии команды и следующие значения для второй:


Параметр Значение

GL_AMBIENT

Параметр paramsсодержит четыре целых или вещественных значения цветов RGBA, которые определяют рассеянный цвет материала. По умолчанию значение рассеянного цвета равно (0.2, 0.2, 0.2, 1.0)

GL_DIFFUSE

Параметр paramsсодержит четыре целых или вещественных значения RGBA, которые определяют цвет диффузного отражения материала. По умолчанию значение диффузного цвета равно (0.8, 0.8, 0.8, 1.0)

GL_SPECULAR

Параметр paramsсодержит четыре целых или вещественных значения RGBA, которые определяют цвет зеркального отражения материала. По умолчанию значение зеркального цвета равно (0.0, 0.0, 0.0, 1.0)

Последний аргумент – param (s) содержит значение(я), которые присваиваются соответствующему параметру.

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

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

Is = w (i, λ) cosn α,


где w (i, λ) – кривая отражения, представляющая отношение зеркально отраженного света к падающему как функцию угла падения i и длины волны λ, а n– степень, аппроксимирующая пространственное распределение зеркально отраженного света. Зачем я все это описываю? Дело в том, что в OpenGL имеется возможность косвенного управления углом зеркального отражения. Осуществляется это при помощи параметра GL_SHININESS, позволяющего определять именно значение n.

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

К-во Просмотров: 156
Бесплатно скачать Курсовая работа: Построение реалистичных трехмерных изображений в стандарте OpenGL