^Back To Top
foto1 foto2 foto3 foto4 foto5 foto6 foto7 foto8 foto9 foto10 foto11 foto12 foto13 foto14 foto15 foto16 foto17 foto18 foto19 foto20 foto19

 

OpenGL в C++ для Ch--

 

 

Шары в направленном свете и «операторы-невидимки»

 

..... Для создания направления светового потока POSITION в зелёную зону функции Light надо добавить ещё два оператора:

..... Первые три числа в переменной pos - это координаты вектора q = {m, np}, указывающего на источник. Следовательно, световой поток направлен против вектора q. Четвертую цифру массива 0.0 оставим в покое.

..... Нарисуем шар в зеленом фоновом свете от источника, на который указывает вектор q = OA = {-1, -1, -1}. В этом случае свет направлен из точки A к центру. Нарисовать шар при таком освещении можно, используя четыре команды, приведенные справа от рисунка:

..... Первые два оператора задают зеленый фоновый свет, а следующие два - его направление. Вставляем эти команды в зеленую зону функции Light(), нажимаем F5 и получаем белый шар, освещенный слева снизу «зеленым фоновым светом» (левый рисунок).

 

..... А теперь направим на шар оранжевый диффузный свет против вектора q = OC = {1, 0, 0}:

..... В данном случае свет направлен справа (точка С) к центру Куба видимости. Вставляем эти команды в зеленую зону функции Light(), нажимаем F5 и получаем белый шар, освещенный оранжевым диффузным светом (средний рисунок).

..... В качестве третьего примера нарисуем синий зеркальный шар, освещенный белым светом от источника, на который указывает вектор q = OD = {1, 1, 1}:

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

..... Информация к размышлению. Независимо от местоположения источника света
наблюдатель всегда находится в точке B Куба видимости.

 

«Операторы-невидимки» в зеленой зоне функцииLight()

..... А теперь рассмотрим следующие пять «зелёных» операторов:

 

GLfloat col[ ]={0.0, 0.0, 0.0, 1.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, col);
GLfloat pos[ ]={0.00.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
gluLookAt(0.0, 0.0, 1.0,   0.0, 0.0, 0.0,   0.0, 1.0, 0.0);


 

..... Расшифруем, какую они несут информацию. В первом операторе в фигурных скобках код (0.00.0, 0.0) задает белый свет, a единица определяет параллельность его лучей. Второй оператор декларирует фоновую модель освещения AMBIENT. Третий и четвертый операторы утверждают, что свет распространяется против вектора {0, 0, 1}, то-есть в отрицательном направлении оси Oz.

..... Пятый оператор gluLookAt() с девятью параметрами фиксирует положение зрителя. Первые три цифры - это координаты точки, из которой мы смотрим на шар (точка B Куба видимости). Вторые три - это координаты центра шара. В трёх последних цифрах содержатся координаты вектора, направленного «вверх».

..... Как было установлено в первой части статьи, если нажать F5 при пустой зелёной зоне функции Light(), то получим шар, освещённый белым светом. Вставляем пять «зелёных» операторов в зеленую зону функции Light(), нажимаем F5, и на дисплее по-прежнему красуется шар, освещённый белым светом!

..... «Зелёные» операторы - это «операторы-невидимки». Они всегда находятся в зелёной зоне функции Light() и выполняются по умолчанию, пока в эту зону не будут вставлены другие команды!