
- •Содержание
- •Введение
- •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
- •Приложение г Пример двумерного рисунка
- •Приложение д Положение источников света
1.2 Практика
Практические задания состоят из общего задания, которое одинаково для всех, и индивидуальных, одно из которых необходимо выполнить каждому студенту.
Отчет должен содержать следующие разделы:
1. Тема и цель работы.
2. Раздел 1. Постановка задачи (общей и индивидуальной).
3. Раздел 2…N. Для каждого шага задания включить:
описание;
листинг исходного кода тех функций, где производились изменения, с подробными(!) комментариями;
моментальные снимки результатов рисования в окне программы (snapshots).
4. Раздел N+1. Заключение.
Моментальные снимки можно или напечатать в отчете, или приложить к отчету графические файлы снимков, при этом необходимо имена файлов пронумеровать (например, fig1_1.bmp, fig1_2.bmp и т.д.) и в отчете сделать ссылки на них, или, третий вариант, показать работу программы во время защиты.
Технология создания снимков проста.
Выбрав момент, помещаете кадр в буфер обмена, нажимая <Alt+PrintScreen>, при этом окно программы должно быть активным.
Открываете графический редактор (например, «Paint») и вставляете (Paste) из буфера обмена снимок окна.
Записываете рисунок в любом стандартном формате.
Данные требования к отчету справедливы для всех лабораторных работ настоящего курса.
1.2.1 Общее задание
Создать OpenGL проект с именем «KGLab1» на основе шаблона проекта «Basis» (см. прил. Б). Включить рабочие файлы проекта «Basis» в новый проект с именем «KGLab1.сpp» «KGLab1.h». Установить любой цвет фона и заголовок окна, скомпоновать и запустить программу на выполнение.
Разбить окно программы на четыре области вывода. В каждой области нарисовать однотипные примитивы с различными атрибутами. Запустить программу на выполнение. Две области вывода не должны содержать однотипные примитивы.
Выполнить индивидуальное задание.
1.2.2 Варианты индивидуального задания
Нарисуйте 2D рисунок (пример см. в прил. Г):
1. Солнышко и дом с окнами, дверями и крышей (вид с фасада).
2. Светофор (вид спереди) и машину (вид сбоку).
3. Настенные часы с круглым циферблатом и маятником.
4. Ночь, луна, корабль с трубами и иллюминаторами (вид сбоку).
5. Первый спутник и часть нашей планеты.
6. Рождественскую елочку с игрушками и снеговика.
7. Солнце, радугу и цветок.
8. Воздушный шар с гондолой на фоне неба.
2 Лабораторная работа №2 Матрицы и геометрические преобразования
Цель работы: практическая реализация алгоритмов геометрических преобразований в пространстве. Рисование 3D-примитивов.
2.1 Теоретические положения
2.1.1 Системы координат OpenGl
В OpenGL вершины задаются с помощью однородных координат, т.е. положение точки P(x, y, z) записывается следующим образом P(Wx, Wy, Wz) или P(X, Y, Z, W), тогда обычные трехмерные декартовы координаты определяются по формуле:
x = X/W; y = Y/W; z = Z/W.
Очевидно, что привычная ортогональная координатная система получается как проекция однородной системы на плоскость W=1.
В матричной форме геометрические (аффинные) преобразования однородных координат описываются соотношением:
,
где T – матрица преобразования.
Геометрические преобразования можно интерпретировать как преобразования всех точек в фиксированной системе координат или как изменение системы координат.
В общем виде обобщенная матрица преобразования Т для трехмерных однородных координат имеет вид:
.
Необходимо подчеркнуть, что OpenGL запись матрицы Т отличается от обычной математической записи тем, что она является транспонированной. Матрицу преобразований можно представить в виде четырех подматриц, каждая из которых осуществляет определенное геометрическое преобразование (см. табл. 2.1). Полное математическое описание геометрических преобразований представлено в [2] в учебном пособии [16] (разделы: масштабирование, масштабирование по осям, сдвиг, вращение вокруг осей, произвольное вращение, обращение, перспективные преобразования).
Таблица 2.1 – Подматрицы геометрических преобразований
Подматрица |
Преобразование |
|
изменение масштаба, сдвиг, вращение |
|
перенос |
|
перспективное преобразование |
|
общее изменение масштаба |
Для того чтобы изобразить объект на экране, в библиотеке OpenGL предусмотрены три системы координат (рис. 2.1). Первая XoYoZo – мировая, в ней задаются собственные координаты объекта, вторая XеYеZе– видовая, центром которой является точка наблюдения, направление наблюдения совпадает с осью OeZе, и последняя XdYd– экранная, в ней задается двумерная область вывода в окне программы. Заметьте, что мировая система координат является правосторонней, а видовая – левосторонней. OpenGL переводит координаты из правосторонней в левостороннюю систему автоматически.
Мировая ВидоваяЭкранная
Рис. 2.1 Системы координат OpenGL
Таким образом, задача сводится к преобразованию мировых координат объекта (x,y,z,w) в экранные (X,Y). Последовательность такого преобразования, реализованного в OpenGL, состоит из нескольких этапов, как показано на рис.2.2.
Рис. 2.2 Последовательность преобразования координат
Представленная на рис. 2.2 модель вывода трехмерной графической информации использует для преобразования координат две матрицы: первую – видовую, когда необходимо осуществить видовое преобразование, и вторую – проекционную, при перспективном преобразовании. Построение проекции на картинную плоскость отделено от перспективного преобразования.
Рассмотрим средства библиотеки OpenGL для видового преобразования.