- •Часть II. Основы программирования
- •Введение
- •Лекция 1. Библиотека OpenGl
- •1. Назначение библиотеки OpenGl
- •2. Основные возможности OpenGl
- •3. Макет консольного приложения, использующего библиотеку glaux
- •Программа 1.1
- •4. Имена функций OpenGl
- •5. Системы координат
- •5.1 Матрицы преобразований
- •5.2 Видовые и модельные преобразования
- •5.3 Проекционное преобразование
- •5.4 Оконное преобразование
- •6. Пример выполнения модельных преобразований
- •6.1 Параллельный перенос
- •Фрагмент программы 1.2
- •6.2 Поворот
- •Фрагмент программы 1.3
- •7. Сводка результатов
- •8. Упражнения Упражнение 1
- •Упражнение 2
- •Упражнение 3
- •Упражнение 4
- •Упражнение 5
- •Упражнение 6
- •Лекция 2. Генерация движущихся изображений
- •1. Анимация с двойной буферизацией
- •2. Обработка событий клавиатуры и мыши
- •2.1 Пример обработки события от мыши: изменение цвета вращающегося объекта по нажатию левой кнопки мыши
- •3. Композиция нескольких преобразований
- •3.1 Модель солнечной системы
- •3.2 Модель манипулятора робота
- •4. Сводка результатов
- •5. Упражнения Упражнение 1
- •Упражнение 2
- •Упражнение 3
- •Упражнение 4
- •Упражнение 5
- •Лекция 3. Геометрические примитивы
- •1. Служебные графические операции
- •1.1 Очистка окна
- •1.2 Задание цвета
- •1.3 Удаление невидимых поверхностей
- •2. Описание точек, отрезков и многоугольников
- •2.1 Точки
- •2.2 Отрезки
- •2.3 Многоугольники
- •2.4 Прямоугольники
- •2.5 Кривые
- •2.6 Задание вершин
- •2.7 Геометрические примитивы OpenGl
- •3. Свойства точек, отрезков и многоугольников
- •3.1 Точки
- •3.2 Отрезки
- •3.3 Многоугольники
- •4. Сводка результатов
- •Лекция 4. Полигональная аппроксимация поверхностей
- •1. Векторы нормали
- •2. Некоторые рекомендации по построению полигональных аппроксимаций поверхностей
- •3. Пример: построение икосаэдра
- •3.1 Вычисление нормалей к граням икосаэдра
- •3.2 Повышение точности аппроксимации сферической поверхности
- •3.3 Алгоритм разбиения треугольной грани произвольной поверхности
- •4. Плоскости отсечения
- •6. Сводка результатов
- •7. Упражнения Упражнение 1
- •Упражнение 2
- •Упражнение 3
- •Упражнение 4
- •Лекция 5. Цвет и освещение
- •1. Цветовая модель rgb
- •2. Задание способа закраски
- •3. Освещение
- •4. Освещение в реальном мире и в OpenGl
- •4.1 Излучаемый, рассеянный, диффузно отраженный и зеркально отраженный свет
- •4.2 Цвет материала
- •4.3 Значения rgb для источников света и материалов
- •5. Пример: рисование освещенной сферы
- •5.1 Вектора нормали в вершинах объектов
- •5.2 Создание, расположение и включение источников света
- •5.3 Выбор модели освещения
- •5.4 Задание свойств материалов для объектов сцены
- •6. Создание источников света
- •6.1 Цвет
- •6.2 Местоположение и затухание
- •6.3 Прожекторы
- •6.4 Использование нескольких источников света
- •6.5 Изменение местоположения источников света
- •4. Сводка результатов
- •Лекция 6. Свойства материала и спецэффекты освещения
- •1. Задание свойств материала
- •1.1 Диффузное и рассеянное отражение
- •1.2 Зеркальное отражение
- •1.3 Излучаемый свет
- •1.4 Изменение свойств материала
- •1.5 Имитация реальных материалов
- •2. Смешение цветов и прозрачность
- •2.1 Множители source (исходный пиксел) и destination (результирующего пиксела)
- •2.2 Области применения смешения цветов
- •2.3 Пример использования смешения цветов
- •3. Туман
- •3.1 Использование тумана
- •4. Сводка результатов
- •5. Упражнения Упражнение 1
- •2. Назначение текстур
- •3. Создание текстуры в оперативной памяти
- •4. Автоматическое повторение текстуры на плоском многоугольнике
- •5. Наложение текстуры на произвольную поверхность
- •6. Сводка результатов
- •7. Упражнения Упражнение 1
- •Упражнение 2
- •Задание 1.1
- •2. Объемный "тетрис"
- •Задание 2.1
4. Плоскости отсечения
Кроме 6-ти плоскостей отсечения, образующих видимый объем (левая, правая, нижняя, верхняя, ближняя и дальняя), OpenGL позволяет задать до 6-ти дополнительных плоскостей отсечения. Эти плоскости накладывают дополнительные ограничения на видимый объем (рис. 4.3), что может быть полезно для удаления посторонних объектов сцены, например, при построении сечения объекта.
Каждая плоскость
задается коэффициентами общего уравнения:
.
При модельных преобразованиях плоскости
отсечения преобразуются автоматически.
Отсеченный видимый объем принимается
равным пересечению видимого объема и
полупространств, задаваемых дополнительными
плоскостями отсечения. При выполнении
отсечения многоугольников, попадающих
в видимый объем частично, OpenGL
автоматически рассчитывает координаты
новых вершин.
Рис. 4.3. Дополнительные плоскости отсечения и видимый объем.
Для задания плоскости отсечения применяется функция:
void glClipPlane( GLenum plane, const double* equation );
Указатель equation
указывает на массив из 4-х коэффициентов
уравнения плоскости
.
Параметр plane
равен GL_CLIP_PLANEi,
где i
– это целое число от 0 до 5, обозначающее
одну из 6-ти возможных плоскостей
отсечения. При выполнении отсечения
будут оставлены только те вершины
,
для которых выполняется условие:
,
где M – это видовая матрица на момент вызова функции glClipPlane().
Каждую из плоскостей отсечения надо включить с помощью вызова:
glEnable( GL_CLIP_PLANEi );
Для выключения плоскости надо вызвать:
glDisable( GL_CLIP_PLANEi );
В программе 4.4 демонстрируется применение плоскостей отсечения для рисования каркасного сферического сегмента объемом в четверть сферы (рис. 4.4).
Рис. 4.4. Сегмент каркасной сферы, построенный с помощью плоскостей отсечения.
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void CALLBACK resize( int width, int height );
void CALLBACK display();
void main()
{
auxInitDisplayMode( AUX_SINGLE | AUX_RGBA );
auxInitPosition( 0, 0, 400, 400 );
auxInitWindow( "Лекция 4, Программа 4.4" );
auxReshapeFunc( resize );
auxMainLoop( display );
}
void CALLBACK resize( int width, int height )
{
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 60.0, (float)width/(float)height, 1.0, 20.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
void CALLBACK display()
{
double eqn1[4] = {0.0, 1.0, 0.0, 0.0}; // y < 0
double eqn2[4] = {1.0, 0.0, 0.0, 0.0}; // x < 0
glClear( GL_COLOR_BUFFER_BIT );
glColor3d( 1.0, 1.0, 1.0 );
glPushMatrix();
glTranslated( 0.0, 0.0, -5.0 );
glClipPlane( GL_CLIP_PLANE0, eqn1 );
glEnable( GL_CLIP_PLANE0 );
glClipPlane( GL_CLIP_PLANE1, eqn2 );
glEnable( GL_CLIP_PLANE1 );
glRotated( 90.0, 1.0, 0.0, 0.0 );
auxWireSphere( 1.0 );
glPopMatrix();
glFlush();
}
Программа 4.4. Использование плоскостей отсечения для построения
каркасного сферического сегмента.
6. Сводка результатов
Произвольную гладкую поверхность можно аппроксимировать с помощью сетки из многоугольников, например, из треугольников. Чтобы полигональная аппроксимация поверхности выглядела похожей на требуемую поверхность, в OpenGL необходимо задавать нормали в вершинах полигональной сетки. Направление нормалей учитывается при вычислении количества света, отраженного поверхностью в окрестности вершины по направлению наблюдателя.
В лекции приведен пример построения икосаэдральной аппроксимации сферы. Для улучшения вида аппроксимированной поверхности надо уменьшать размеры граней в областях поверхности с большой кривизной. В лекции приведен алгоритм рекурсивного разбиения треугольной сетки, аппроксимирующей произвольную параметрически заданную поверхность.
В OpenGL можно наложить ограничения на форму видимого объема. Для этого используются дополнительные плоскости отсечения.
