- •Часть 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. Сводка результатов
Перед рисованием трехмерной сцены надо очистить буфер кадра. Кроме цветового буфера, с кадром может быть связан буфер глубины (z-буфер), позволяющий OpenGL автоматически выполнять удаление скрытых поверхностей.
Все трехмерные объекты в OpenGL формируются из геометрических примитивов нескольких типов: точек, отрезков и многоугольников. Все примитивы задаются в виде упорядоченного множества вершин. Гладкие кривые и поверхности можно аппроксимировать с помощью отрезков и многоугольников. У примитивов можно изменить свойства, влияющие на их отображение на экране: диаметр точек, толщину и стиль отрезков, способ рисования многоугольников. У многоугольников различаются передняя и задняя стороны (по порядку перечисления вершин). Разные стороны можно рисовать разными способами: залитыми, контурными или только вершины.
5. Упражнения
Упражнение 1
Выполните программу 3.1. Добавьте в нее функцию, которая строит из точек диаметром 15 пикселей квадрат заданного размера (например, как на рис. ниже, размер пустых промежутков можно сделать равным радиусу точки). Используйте эту функцию для построения 5-ти квадратов разного цвета с центром в общей точке.
Упражнение 2
Выполните программу 3.2. Затем напишите программу, рисующую каркасный куб в перспективной проекции. Видимые ребра нарисуйте штриховым пунктиром толщиной 3 пиксела, невидимые – точечным пунктиром толщиной 1 пиксел.
Упражнение 3
Выполните программу 3.3. Выясните, что произойдет, если:
убрать вызов функции, которая задает контурное рисование задних сторон многоугольников;
убрать функцию, задающую белый цвет для вершин основания пирамиды;
задать рисование передних сторон контурами, а задних – вершинами.
Упражнение 4
Постройте изображение втулки, аппроксимируя ее поверхность с помощью квадрированных полос (примитивов типа GL_QUAD_STRIP).
Упражнение 5
Разработайте функцию, которая строит сферический сегмент заданной высоты с помощью аппроксимации поверхности сферы треугольниками. В качестве параметров этой функции надо передавать высоту сегмента и число, определяющее степень разбиения сферы. Для рисования передних и задних граней многоугольников используйте разные стили.
Напишите тестовую программу, которая с помощью разработанной функции строит полусферу и позволяет поворачивать ее клавишами курсора (см. программу 3.3).
Лекция 4. Полигональная аппроксимация поверхностей
1. Векторы нормали
Вектором нормали к поверхности в данной точке называется вектор, перпендикулярный этой поверхности. У плоскости векторы нормали направлены одинаково во всех точках, но у произвольной поверхности направления нормали в разных точках могут различаться. Нормаль к аналитически заданной поверхности вычислить несложно, ее направление совпадает с градиентом в данной точке поверхности.
Векторы нормали определяют ориентацию поверхности в пространстве, в частности, расположение относительно источников света. Эти векторы используются OpenGL для расчетов, сколько света получает объект в своих вершинах. Освещение – это отдельная тема, она будет рассматриваться в следующей лекции. Далее кратко описываются способы задания векторов нормали, чтобы вы могли указать их в процессе описания формы объектов.
Нормаль может быть одинаковой в нескольких вершинах. В каких-либо иных точках, кроме вершин, OpenGL задавать вектор нормали не позволяет. Для указания вектора нормали используется одна из функций glNormal*():
void glNormal3{bsidf}(TYPE nx, TYPE ny, TYPE nz);
void glNormal3{bsidf}v( const TYPE* v );
В качестве параметров этой функции передаются координаты нормали. Этот вектор будет присваиваться всем последующим вершинам. Если в разных вершинах направление нормали разное, то надо указывать его перед рисованием каждой вершины, например:
glBegin( GL_POLYGON );
glNormal3fv( n0 );
glVertex3fv( v0 );
glNormal3fv( n1 );
glVertex3fv( v1 );
glNormal3fv( n2 );
glVertex3fv( v2 );
glNormal3fv( n3 );
glVertex3fv( v3 );
glEnd();
В каждой точке поверхности существуют два вектора нормали, направленных в противоположные стороны. По умолчанию, нормалью считается вектор, начало которого лежит на передней стороне многоугольника. Вектор нормали указывает только направление, поэтому его длина несущественна. Обычно в качестве нормалей задаются единичные вектора. C помощью вызова glEnable(GL_NORMALIZE) в OpenGL можно включить режим автоматической нормализации векторов.
