- •Часть 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
3. Макет консольного приложения, использующего библиотеку glaux
В отличие от обычной консольной программы Win32, в проект программы, использующей OpenGL, надо добавить три файла с расширениями .lib из каталога DEVSTUDIO\VC\LIB: opengl32.lib, glu32.lib и glaux.lib. В этих файлах содержатся данные, с помощью которых компоновщик организует в исполняемом файле программы вызовы функций OpenGL из динамических библиотек opengl32.dll и glu32.dll (они расположены в каталоге WINDOWS\SYSTEM).
Показанная ниже программа 1.1 выполняет анимацию сферы, которая движется в экранном окне в направлении "слева направо". Генерация изображения трехмерной сцены выполняется в функции display(). Консольные приложения, которые будут рассматриваться в данной лекции, имеют похожую структуру и различаются содержанием функции display().
#include <windows.h> // Заголовочный файл с описаниями функций Windows
#include <GL/gl.h> // Заголовочные файлы библиотеки OpenGL
#include <GL/glu.h>
#include <GL/glaux.h>
// Прототипы функций обратной связи (для автоматического вызова из GLAUX)
void CALLBACK resize( int width, int height );
void CALLBACK display( void );
void main()
{
// Параметры обсчета сцены в OpenGL: цветовой режим RGBA, удаление
// невидимых поверхностей и линий, двойная буферизация
auxInitDisplayMode( AUX_RGBA | AUX_DEPTH | AUX_DOUBLE );
// Создание окна OpenGL с заголовком "Программа 1.1"
// Размер окна – 400х400 пикселей. Левый верхний угол окна
// задается экранными координатами (50, 10).
auxInitPosition( 50, 10, 400, 400);
auxInitWindow( "Программа 1.1" );
// В случае, когда окно не получает сообщений от клавиатуры, мыши или
// таймера, то будет вызываться функция display. Так можно получить
// анимацию. Если анимация не нужна, то эта строка лишняя.
auxIdleFunc( display );
// Задание функции, которая будет вызываться при изменении
// размеров окна Windows.
auxReshapeFunc( resize );
// Включение ряда параметров OpenGL
glEnable( GL_ALPHA_TEST ); // Учет прозрачности
glEnable( GL_DEPTH_TEST ); // Удаление невидимых поверхностей
glEnable( GL_COLOR_MATERIAL ); // Синхронное задание цвета рисования
// и цвета материала объектов
glEnable( GL_BLEND ); // Разрешение смешения цветов
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_LIGHTING ); // Учет освещения
glEnable( GL_LIGHT0 ); // Включение нулевого источника света
// Задание положения и направления нулевого источника света
float pos[4] = { 3, 3, 3, 1 };
float dir[3] = { -1, -1, -1 };
glLightfv( GL_LIGHT0, GL_POSITION, pos );
glLightfv( GL_LIGHT0, GL_SPOT_DIRECTION, dir );
// Задание функции отрисовки окна. Эта функция будет вызываться всякий
// раз, когда потребуется перерисовать окно на экране (например, когда
// окно будет развернуто на весь экран)
auxMainLoop( display );
}
void CALLBACK resize( int width, int height )
{
// Указание части окна для вывода кадра OpenGL
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
// Задание типа проекции (glOrtho - параллельная, glFrustum -
// перспективная). Параметры функций определяют видимый объем
// (левая стенка - пять единиц влево, правая - пять единиц вправо,
// далее задаются нижняя стенка, верхняя, передняя и задняя)
glOrtho( -5, 5, -5, 5, 2, 12 );
// Задание позиции наблюдателя (0, 0, 5), направление луча
// зрения (на точку (0, 0, 0)), вектор, принимаемый за направление
// "вверх" (0, 1, 0) (т.е. параллельно оси Y).
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}
void CALLBACK display(void)
{
// Очистка буфера кадра
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// Перенос системы координат, связанной с объектом, на 0.01
glTranslated( 0.01, 0, 0 );
// Рисование в начале координат, связанных с объектом, сферы
// радиусом 1, окрашенной в красный цвет
glColor3d( 1, 0, 0 );
auxSolidSphere( 1 );
// Копирование содержимого буфера кадра на экран
auxSwapBuffers();
}
