Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Chast_II_Osn_progr_trekhmernoy_grafiki.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1.83 Mб
Скачать

6.5 Изменение местоположения источников света

Местоположение и направление источников света, как и координаты вершин, в OpenGL могут подвергаться модельным преобразованиям. Точнее, при вызове функции glLight*() для задания местоположения или направления источника света переданные координаты преобразуются в соответствии с текущей видовой матрицей. В этом параграфе кратко описываются два варианта расположения источника света:

  • источник света находится в фиксированной точке;

  • источник света перемещается относительно неподвижного объекта.

В простейшем случае (например, в программе 5.1) положение (или направление) источника света не изменяется. Координаты (или направление) такого источника определяются сразу после выбора видовой матрицы:

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if ( width <= height )

glOrtho( -1.5, 1.5, -1.5*(float)height/width,

1.5*(float)height/width, -10.0, 10.0);

else

glOrtho( -1.5*(float)width/height,

1.5*(float)width/height, -1.5, 1.5, -10.0, 10.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

// Далее, внутри функции lightsInit()

float light_position[] = { 1.0, 1.0, 1.0, 0.0 };

glLightfv(GL_LIGHT0, GL_POSITION, light_position);

Итак, сначала задаются оконное преобразование и проекционная матрица. Затем в качестве видовой матрицы загружается единичная и затем определяется направление нулевого источника света. Т.к. используется единичная видовая матрица, то направление источника в мировой системе координат будет (1.0, 1.0, 1.0).

Предположим, что необходимо поворачивать и/или сдвигать локальный источник света так, чтобы он двигался относительно неподвижного объекта. Для это надо задавать координаты источника после видовых преобразований, точно так же, как это делается при размещении объектов сцены. Ниже приведена функция display(), в которой источник света поворачивается на угол spin вокруг неподвижного тора (переменная spin изменяется в фоновой функции или в обработчике событий).

void CALLBACK display()

{

  float light_position[] = { 0.0, 0.0, 1.5, 1.0 };

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glPushMatrix();

    glTranslatef(0.0, 0.0, -5.0);

    glPushMatrix();

      glRotated((double)spin, 1.0, 0.0, 0.0);

      glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glPopMatrix();

    auxSolidTorus(0.275, 0.85);

  glPopMatrix();

  glFlush();

}

4. Сводка результатов

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

В OpenGL используется приближенная модель освещения, дающая результаты приемлемого качества при не очень громоздких вычислениях. Световое излучение представляется в виде 4-х компонент: излучаемый свет, рассеянный свет, диффузно отраженный и зеркально отраженный. Эти световые компоненты являются свойствами источников света и материалов. В OpenGL у источников света и материалов довольно много свойств, влияющих на изображение сцены. В данной лекции подробно описаны свойства источников света.

5. Упражнения

Упражнение 1

С помощью программы 2.1 выясните различие между плавной и плоской закраской треугольника.

Упражнение 2

Проверьте, как будет работать программа 5.1 с каждым из трех изменений:

  • замените направленный источник света на локальный белый источник;

  • задайте синее фоновое освещение максимальной интенсивности;

  • к направленному белому источнику света добавьте еще один цветной прожектор (см. п.6.4).

Упражнение 3

С использованием функции display() из п.6.5 разработайте программу, показывающую тор, освещаемый вращающимся вокруг него локальным источником света. Затем измените эту программу следующим образом:

  • Сделайте так, чтобы источник света не вращался вокруг тора, а перемещался относительно него прямолинейно.

Подсказка: в функции display() вместо glRotated() примените функцию glTranslated() и заведите вместо spin подходящую переменную для хранения значения смещения источника света.

  • Задайте коэффициент затухания так, чтобы интенсивность света уменьшалась по мере удаления от источника. Подсказка: коэффициент затухания задается с помощью функции glLight*().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]