
- •Г.М. Набережнов, н.Н. Максимов трехмерное моделирование полигональными сетками
- •Казань 2008 Задания для самостоятельного выполнения
- •1. Понятие полигональнОй сетки
- •2. Построение полигональной сетки
- •3. Рисование полигональной сетки
- •4. Введение в модели закрашивания
- •5. Использование источников света в OpenGl
- •5.1. Создание источника света
- •5.2. Прожекторы
- •5.3. Ослабление света с расстоянием
- •5.4. Перемещение источников света
- •6. Работа со свойствами материалов в OpenGl
5.2. Прожекторы
Источники света по умолчанию являются точечными источниками. Это означает, что они излучают свет равномерно по всем направлениям. Однако OpenGL позволяет превратить их в прожекторы, так чтобы они излучали свет в ограниченном числе направлений. На рис. 5.1 показан прожектор, нацеленный в направлении d c «углом пропускания» («cutoff angle») α. Угол пропускания α может принимать значения диапазона [0, 90].
В точках, лежащих вне конуса пропускания, свет не виден вообще. Для таких вершин, как Р, которые лежат внутри этого конуса, количество света, достигающего точки Р, пропорционально множителю cosε(β), где β – угол между вектором d и прямой, соединяющей источник с точкой Р. Показатель степени ε лежит в диапазоне [0, 128] и выбирается пользователем так, чтобы обеспечить нужное уменьшение интенсивности света в зависимости от угла.
Параметры прожектора устанавливаются следующим образом: с помощью функции glLightf(…) задается его единственный параметр, а с помощью функции glLightfv(…) – вектор:
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0); // угол пропускания равен 45о
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 4.0); // ε = 4.0
GLfloat myDirection[] = {2.0, 1.0, -4.0}; // направление прожектора
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, myDirection);
По умолчанию установлены следующие значения этих параметров: d = (0, 0, -1), α = 180о; ε = 0, что соответствует действующему во всех направлениях точечному источнику света.
5.3. Ослабление света с расстоянием
OpenGL также дает возможность задавать скорость ослабевания света при удалении от источника. В OpenGL предусмотрено ослабление силы позиционного источника света с помощью так называемого коэффициента ослабления (attenuation factor):
,
где kc, kl, kq – коэффициенты, а D – расстояние между точкой расположения источника света и рассматриваемой вершиной. Это выражение является достаточно гибким, чтобы позволить смоделировать любую комбинацию постоянной, линейной и квадратичной (точнее, обратно-квадратичной) зависимости от расстояния до источника. Параметры управляются с помощью вызовов функции
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
и подобным же образом для GL_LINEAR_ATTENUATION и GL_QUADRATIC_ATTENUATION. Значения по умолчанию составляют kc = 1, kl = 0, kq = 0, что исключает какое-либо ослабление света.
Коэффициент ослабления отключен в случае источников направленного света, поскольку они находятся бесконечно далеко.
5.4. Перемещение источников света
Источники света проходят через матрицу моделирования-вида наряду с вершинами. Следовательно, источники света могут быть перемещены с помощью соответствующих вызовов различных версий функций glRotate(…) и glTranslate(…). Массив pos, заданный подпрограммой glLightfv(GL_LIGHT0, GL_POSITION, pos), изменяется с помощью матрицы моделирования-вида, что происходит в момент вызова функции glLightfv(..). Поэтому для изменения положения источника света с помощью преобразований и для независимого перемещения камеры команду позиционирования источника нужно вставить внутрь стековых скобок «push – pop», как это сделано в следующем коде:
Листинг 4. Пример перемещения и вращения источников света
void display()
{ GLfloat myLightPosition[] = {1.0, 2.0, 2.0, 1.0};
// начальное положение источника света
Зачищаем буферы цвета и глубины
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(…); // задаем положение наблюдателя
glPushMatrix();
glRotatef(…); // вращаем источник света
glTranslatef(…); // перемещаем источник света
glLightfv(GL_LIGHT0, GL_POSITION, myLightPosition);
glPopMatrix();
<Рисуем объект>
glutSwapBuffers();
}