
- •Содержание
- •Введение
- •1 Лабораторная работа №1 opengl и графические примитивы
- •1.1 Теоретические положения
- •1.1.1 Структура OpenGl-проекта
- •1.1.2 Работа с графическими примитивами
- •1.1.2.1 Точки
- •1.1.2.2 Линии
- •1.1.2.3 Треугольники
- •1.1.2.4 Четырехугольники и многоугольники
- •1.1.2.5 Массивы вершин и цветов
- •1.1.2.6 Область вывода
- •1.2 Практика
- •1.2.1 Общее задание
- •1.2.2 Варианты индивидуального задания
- •2 Лабораторная работа №2 Матрицы и геометрические преобразования
- •2.1 Теоретические положения
- •2.1.1 Системы координат OpenGl
- •2.1.2 Видовые преобразования
- •2.1.3 Ориентация
- •2.1.4 Трехмерные примитивы
- •2.2 Практика
- •2.2.1 Общее задание
- •2.2.2 Варианты индивидуального задания
- •3 Лабораторная работа №3 Проекции, источники света, материалы
- •3.1 Теоретические положения
- •3.1.1 Виды плоских проекций
- •3.1.1.1 Ортографическая проекция
- •3.1.1.2 Одноточечная перспективная проекция
- •3.1.2 Освещение объектов
- •3.1.2.1 Нормали и грани
- •3.1.2.2 Материалы
- •3.1.2.3 Источники света
- •3.1.2.3 Модели освещения и затенения
- •3.2 Практика
- •3.2.1 Общее задание
- •3.2.2 Варианты индивидуального задания
- •4 Лабораторная работа №4 Отсечение и прозрачность
- •4.1 Теоретические положения
- •4.1.1 Принадлежность пикселей контексту воспроизведения
- •4.1.2 Отсечение
- •4.1.3 Прозрачность
- •4.2 Практика
- •4.2.1 Общее задание
- •5 Лабораторная работа №5 Трафареты и глубина
- •5.1 Теоретические положения
- •5.1.1 Трафарет
- •5.1.2 Глубина
- •5.2 Практика
- •5.2.1 Общее задание
- •6 Лабораторная работа №6 Текстуры
- •6.1 Теоретические положения
- •6.1.2 Загрузка графического файла в память
- •6.1.3 Создание имени-идентификатора текстуры
- •6.1.4 Установка идентификатора в активное положение
- •6.1.5 Создание текстуры в памяти
- •6.1.6 Установка параметров текстуры
- •6.1.7 Установка параметров взаимодействия текстуры с объектом
- •6.1.8 Связывание координат текстуры с объектом
- •6.2 Практика
- •6.2.1 Общее задание
- •7 Список литературы
- •Приложение а
- •Приложение б шаблон opengl-проекта «basis»
- •Приложение в Синтаксис команд и типы данных OpenGl
- •Приложение г Пример двумерного рисунка
- •Приложение д Положение источников света
2.2 Практика
2.2.1 Общее задание
Откройте OpenGL-проект с именем «KGLab2.dsw». Нарисуйте в двух областях вывода по фигуре, которые указаны в индивидуальном задании. Для каждой фигуры выполните геометрические преобразования: перемещение, вращение и масштабирование по разным осям, используя как стандартные команды, так и непосредственную работу с матрицами. Каждое преобразование активизируйте нажатием определенной клавиши. Для этого в функциях реакции на клавиши изменяйте либо аргументы команд, либо элементы матрицы, а в функции рисования вызывайте либо команды преобразования с измененными аргументами, либо команду умножения матрицы с новыми элементами соответственно.
Примените функцию фонового режима (Idle) для выполнения последнего геометрического преобразования. Т.е. при каждом вызове функции Idle определяйте тип последнего выполненного преобразования и реализуйте приращение на заданный шаг.
2.2.2 Варианты индивидуального задания
В двух областях вывода (Viewport) одного окна нарисуйте по фигуре, используя каркасный стиль (см. табл. 2.5). Фигуру №2 (букву) нарисуйте с помощью кубиков и параллелепипедов.
Таблица 2.5 – Фигуры для индивидуального задания
№ |
Задание №1 |
Задание №2 |
1 |
|
|
2 |
Нарисуйте букву «Б» |
Нарисуйте букву «В» |
|
Задание №3 |
Задание №4 |
1 |
|
|
2 |
Нарисуйте букву «Р» |
Нарисуйте букву «Н» |
|
Задание №5 |
Задание №6 |
1 |
|
|
2 |
Нарисуйте букву «П» |
Нарисуйте букву «Т» |
|
Задание №7 |
Задание №8 |
1 |
|
|
2 |
Нарисуйте букву «Ф» |
Нарисуйте букву «Ш» |
3 Лабораторная работа №3 Проекции, источники света, материалы
Цель работы: приобрести практический навык построения 3D-сцены с заданным типом проектирования и моделью освещения. Научиться работать с источниками света и материалами.
3.1 Теоретические положения
3.1.1 Виды плоских проекций
В OpenGL непосредственно поддерживаются два вида проекций: ортографическая и одноточечная перспективная (см. рис. 3.1, 3.2).
а) б)
Рис. 3.1 Ортографическая проекция
а) б)
Рис. 3.2 Одноточечная перспективная проекция
Чтобы задать ту или иную проекцию, необходимо преобразовать матрицу проекций. Напомним, что это преобразование осуществляется на втором этапе (см. рис. 2.2), т.е. после того как получены видовые координаты, происходит преобразование их в усеченные координаты с помощью матрицы проекций.
Для того чтобы начать работать с матрицей проекций, необходимо ее сделать текущей с помощью команды:
glMatrixMode(GL_PROJECTION);
Затем задать объем видимости. Для ортографической проекции это параллелепипед (рис. 3.1, а), для перспективной проекции это усеченный тетраэдр с одной точкой схода (рис. 3.2, а).
3.1.1.1 Ортографическая проекция
Объем видимости для ортографической (параллельной) проекции задается с помощью команды:
void glOrtho(GLdoubleleft, GLdouble right,
GLdouble bottom, GLdoubletop,
GLdouble near, GLdoublefar);
где left, right – координаты левой и правой плоскостей отсечения (вертикальных граней параллелепипеда видимости);
bottom,top– координаты нижней и верхней плоскостей отсечения (горизонтальные грани);
near,far – расстояние до ближней и дальней плоскостей отсечения (если меньше 0, то плоскость находится позади наблюдателя).
Считается, что глаз наблюдателя расположен в точке (0, 0, 0). Параметры (left, bottom, -near) и (right, top, -near) определяют точки на ближней плоскости отсечения, которые сопоставлены соответственно левому нижнему и правому верхнему углам окна.
Матрица проектирования Pимеет вид:
.
Команда glOrtho умножает текущую матрицу проектирования Tна матрицуPи результат помещает в матрицуT.
После того как определена матрица проектирования, не забудьте переключиться на видовую матрицу, чтобы иметь возможность осуществлять видовые преобразования объектов.
Кроме рассмотренной команды glOrtho, существует упрощенная команда:
void glOrtho2D(GLdoubleleft, GLdouble right,
GLdouble bottom, GLdoubletop);
Действие этой команды эквивалентно вызову команды:
glOrtho(left, right,bottom,top,-1,1);
Отметим, что команду glOrtho2D мы уже применяли, когда рисовали двумерный рисунок на первой лабораторной работе.