Главная страница

Metodichka по компьютерной графике. Е. А. Снижко, Н. А. Флерова, А. В. Воронцов программирование компьютерной графики с использованием


Скачать 1.31 Mb.
НазваниеЕ. А. Снижко, Н. А. Флерова, А. В. Воронцов программирование компьютерной графики с использованием
Дата16.12.2018
Размер1.31 Mb.
Формат файлаpdf
Имя файлаMetodichka по компьютерной графике.pdf
ТипПрактикум
#60396
страница3 из 8
1   2   3   4   5   6   7   8
Рисунок 2. Веер треугольников.

15
Грань считается лицевой, если вершины перечисляются в направлении против часовой стрелки (в положительном направлении для левой системы координат), и обратной, если обход вершин производится по часовой стрелке (в отрицательном направлении).
Построение невыпуклых полигонов.
Если необходимо изобразить невыпуклый многоугольник, то он должен быть представлен как набор выпуклых многоугольников, каждый из которых описывается в своих командных скобках (Рисунок 3. Представление невыпуклого полигона с помощью набора выпуклых полигонов).
Данную фигуру можно разбить на 3 выпуклых многоугольника: a1a2a3a4, a1a4a6a7 и a4a5a6. Следовательно фигура может быть описана как 3 примитива типа
GL_POLIGON. Однако заметим, что первая и вторая фигуры – смежные четырехугольники, а третья фигура – треугольник. Для воспроизведения треугольников и четырехугольников желательно использовать «родные» примитивы, причем, если это возможно – связанные. Т.е. для построения изображенной фигуры первые два четырехугольника мы опишем в одних командных скобках как связанные четырехугольники с общей стороной a1a4 (последовательность перечисления вершин: a2,
a3, a4, a1, a7, a6) – используем константу командных скобок GL_QUAD_STRIP.
Треугольник a4a5a6 опишем в своих командных скобках с константой GL_TRIANGLES.
Можно решить эту задачу и другими способами. Вообще оптимальным будет разбиение невыпуклой фигуры на треугольники, поскольку построение треугольников, как правило, реализовано на аппаратном уровне.
Для сглаживания (антиэлайзинга) многоугольников используется константа
GL_POLYGON_SMOOTH. Команда используется так же, как для точек и линий.
Поскольку треугольники и четырехугольники являются многоугольниками, то сглаживание для них осуществляется как для многоугольников.
Особенности режимов закрашивания для многоугольников.
До сих пор вы изображали многоугольники с использованием заливки, причем, если для разных вершин примитивов были заданы различные цвета, то фигуры окрашивались градиентно, с плавным переходом цветов от вершины к вершине. Это происходит из-за того, что по умолчанию способ тонирования задан плавным. Чтобы изменить способ тонирования, необходимо перед командными скобками вызвать функцию
glShadeModel(GL_FLAT). В этом случае связанные фигуры окрашиваются по правилу старшинства цвета второго примитива.
Для задания режима вывода многоугольников: в контурном виде (без заливки), с заливкой, - используется команда glPolygonMode. Второй параметр команды указывает способ изображения грани фигуры с помощью следующих констант: GL_FILL – вывод граней с заливкой; GL_LINE – каркасный вывод (только контуры); GL_POINT - выводятся только вершины. Первый параметр определяет для каких граней установлен a1 a2 a3 a4 a5 a6 a7
Рисунок 3. Представление невыпуклого
полигона с помощью набора выпуклых
полигонов.

16 режим: лицевые – GL_FRONT; обратные – GL_BACK; лицевые и обратные –
GL_FRONT_AND_BACK. Описанная команда помещается перед командными скобками.
Задания к лабораторной работе
.
Используя программу-шаблон, созданную при выполнении предыдущей лабораторной работы выполните следующие задания.
Задание 1. Построить точки расположенные в вершинах правильного n-угольника.
Установить режим сглаживания для точек. Экспериментально определить максимальный размер точки, при котором возможно сглаживание.
Задание 2. Используя примитив для вывода линий нарисовать правильный n-угольник.
Изменить тип и ширину линий.
Задание 3. Используя примитив для вывода ломаной линии нарисовать фигуру, изображенную на рис.1.
Задание 4. Используя примитив для вывода замкнутой ломаной нарисовать фигуру, изображенную на рис.2
Задание 5. Построить фигуру, изображенную на рис.2, разбив ее на треугольники
(каждый треугольник окрашен случайным цветом). Выполните три варианта построений с использованием примитивов:
А) треугольник;
Б) лента треугольников;
В) веер треугольников.
Чем отличаются результаты при изменении способа тонирования?
Задание 6. Используя примитив для вывода многоугольников построить правильный n-угольник.
Задание 7. Построить невыпуклый многоугольник, изображенный на рис.3, представив его в виде совокупности отдельных многоугольников, назначив каждому многоугольнику свой цвет. Посмотреть результат работы программы для различных способов тонирования.
Задание 8. Изменить программу предыдущей задачи таким образом, чтобы
А) лицевые грани изображались только вершинами;
Б) лицевые грани изображались закрашенными, а обратные – линиями;
В) лицевые и обратные грани изображались линиями (каркасное изображение).
Варианты к заданию.
Вариант 1
N=5
Вариант 2
N=7
Рис.1
Рис.2
Рис.3

17
Вариант 3
N=6
Вариант 4
N=4
Вариант 5
N=8
Дополнительные задания.
1.
В установленном графическом окне построить N точек, окрашенных случайным образом и распределенных случайным образом по всей площади окна.
2.
Фонтан. В некоторой окрестности заданной точки появляются и пропадают данное количество точек различного размера и цвета.
3.
При нажатии клавиш управления курсором (при движении мыши) появляются и гаснут некоторое данное количество точек случайного размера и цвета.
4.
Для области размером N*N точек (размер точки задан) реализовать алгоритм дизеринга с использованием трех заданных цветов.
5.
Бенгальский огонь. В некоторой окрестности данной точки рисуются линии случайного размера, цвета и направления (длина линий ограничена).
6.
Бенгальский огонь в движении. Картинка, построенная в результате предыдущей задачи, изменяется при нажатии клавиш управления курсором.
Рис.1
Рис.2
Рис.3
Рис.1
Рис.2
Рис.3
Рис.2
Рис.1
Рис.3
Рис.1
Рис.2
Рис.3

18
Контрольные вопросы.
1.
Что такое командные скобки, каково их назначение?
2.
Какие константы библиотеки OpenGL могут быть параметрами функции glBegin?
3.
Что такое антиэлайзинг, для чего он служит?
4.
Какие режимы существуют для рисования линий?
5.
Какие режимы существуют для изображения треугольников, чем они различаются?
6.
Что такое выпуклые и невыпуклые многоугольники?
7.
Каким образом можно построить невыпуклый многоугольник?
8.
Чем отличаются лицевые и обратные грани?
9.
Какая команда изменяет способ тонирования?
10.
Какие режимы вывода многоугольников вам известны? В каком месте программы должна быть записана команда, изменяющая режим вывода многоугольников?
Лабораторная работа № 3. Использование массивов вершин.
Преобразования координат.
Цель работы:
продемонстрировать возможности использования специальных массивов OpenGL для моделирования графических объектов, дать понятие о векторной форме команд; исследовать возможности библиотеки для перемещения, масштабирования и поворотов объектов.
Порядок выполнения лабораторной работы.
Перед выполнением лабораторной работы следует ознакомиться с теоретическим материалом по теме «Аффинные преобразования» ([7] – лекция 7); изучить теоретические сведения, относящиеся к данной лабораторной работе.
Задания лабораторной работы следует выполнять в указанном порядке, используя данные указанного преподавателем варианта.
Необходимые теоретические сведения.
Массивы вершин.
Поскольку описывать сложные объекты вершинами достаточно трудоемкое занятие в OpenGL имеется возможность использования массива вершин.
Включение/выключение режима.
Работа с использованием массивов OpenGL это особый режим работы, для включения и отключения которого существуют команды, аналогичные glEnable и
glDisable: glEnableClientState(<константа>);
— включает режим glDisableClientState(<константа>);
— выключает режим
Параметром обеих команд является символьная константа, определяющая тип массива:
GL_VERTEX_ARRAY, GL_COLOR_ARRAY и др.
Объявление массива вершин:
GLfloat aVertex [<количество элементов-вершин>] [<число параметров>];
Первый индекс массива aVertex определяет необходимое число вершин, координаты которых будут храниться в массиве. Индексация вершин производится от 0 до значения, на единицу меньшего, чем указанное количество; второй индекс определяет число параметров процедуры glVertex – 2, 3 или 4. Соответственно вызов процедуры glVertex будет записан в векторной форме, например: glVertex2fv(aVertex[5]); отобразит вершину в двумерной системе координат, соответствующую 5-му элементу массива вершин.
GLfloat aColors [<количество элементов с данными цветами>] [<число параметров>];

19
Первый индекс определяет количество элементов изображения, для которых задаются цвета, второй индекс может принимать значения 3 (RGB) или 4 (RGBA).
Заполнение массива вершин
может производиться как в теле процедуры рисования, так и в отдельной процедуре.
Для формирования указателей на массивы используются процедуры glVertexPointer(<число координат>, GL_FLOAT, 0, aVertex); glColorPointer(<число компонент цвета>, GL_FLOAT, 0, aColors);
Второй параметр указывает тип элементов массива (другие варианты: GL_SHORT,
GL_INT, GL_DOUBLE); третий – 0 – означает, что все элементы расположены последовательно; последний параметр обеих процедур представляет собой указатель на соответствующий массив.
Команды рисования.
После того как указатели на массивы сформированы, можно использовать команды рисования на основе массивов. Простейшей такой командой является команда glArrayElement(<индекс элемента>);
Эта команда заменяет команду описания вершин и стоит внутри командных скобок какого-то примитива. Например glBegin(GL_POLYGON); glArrayElement(0); glArrayElement(1); glArrayElement(2); glArrayElement(3); glEnd;
Следующая команда позволяет нарисовать сразу несколько однотипных объектов: glDrawArrays(<примитив>, <начальный индекс>, <количество элементов>);
Команда имеет три параметра: первый параметр определяет примитив и задается константой примитива (см. предыдущую л.р.); второй параметр – начальный индекс массива; третий параметр – количество элементов массива. Например: glDrawArrays(GL_POLYGON, 0, 64); рисует полигон из 64 вершин, заданных в массиве. Обратите внимание, что здесь не требуется командных скобок.
Геометрические преобразования.
В процессе построения изображения координаты вершин подвергаются различным преобразованиям, таким как сдвиг (перенос), поворот, масштабирование, преобразования проецирования. Данная лабораторная работа посвящена простейшим преобразованиям координат. Проекции будут рассмотрены позднее.
По умолчанию камера находится в начале координат и направлена вдоль отрицательного направления оси Oz.
Матрица моделирования.
Для преобразований координат в OpenGL применяется матрица моделирования
(modelview matrix). Она служит для задания положения объекта и его ориентацию.
Константа для матрицы моделирования: GL_MODELVIEW.
Все координаты внутри OpenGL хранятся при помощи однородных координат, т.е. в виде четырехмерных векторов (x, y, z, w). Если координата z не задана, то она полагается равной 0. Если координата w не задана, то она полагается равной 1.
При выполнении преобразования координат текущая матрица моделирования умножается на матрицу выбранного геометрического преобразования.
Текущая матрица моделирования задается при помощи процедуры
Void glMatrixMode (GL_MODELVIEW);
Процедура
Void glLoadIdenity(); устанавливает текущую матрицу равной единичной.

20
Для задания матрицы моделирования ее сначала устанавливают равной единичной, а затем последовательно применяют к текущей матрице различные геометрические преобразования.
Преобразование переноса:
Void glTranslatef (TYPE x, TYPE y, TYPE z); реализует сдвиг объекта на величину (x, y, z).
Преобразование поворота:
Void glRotatef (TYPE angle, TYPE x, TYPE y, TYPE z); обеспечивает поворот объекта на угол angle в направлении против часовой стрелки вокруг прямой с направляющим вектором (x, y, z).
Чтобы осуществить поворот на плоскости относительно начала координат, следует использовать вектор (x, y, z)=(0, 0, 1).
Преобразование масштабирования:
Void glScalef (TYPE kx, TYPE ky, TYPE kz); осуществляет частичное масштабирование объекта вдоль каждой из координатных осей на значения, определяемые соответствующими параметрами.
Если последовательно указано несколько преобразований, то в результате текущая матрица будет последовательно умножена на матрицы соответствующих преобразований.
Команды преобразований помещаются перед командными скобками и/или после них.
Все объекты в OpenGL рисуются в точке отсчета системы координат (опорная точка), а команды геометрических преобразований изменяют положение системы координат, а не объекта относительно неподвижной системы.
Особенность команд преобразования координат заключается в том, что каждое повторное обращение к обработчику перерисовки экрана будет повторно применять преобразования к изображаемым объектам. Кроме того, бывает необходимо применить преобразование не ко всем объектам сцены, а лишь к некоторым из них. Поэтому важно возвращать систему в исходное положение. Например, если при изображении некоторого объекта система координат была сначала перенесена, а затем повернута: glTranslatef(-0.3, 0.5,0.0); glRotatef(60, 0, 0, 1); то после рисования необходимо выполнить команды обратных преобразований в обратном порядке: glRotatef(-60, 0, 0, 1); glTranslatef(0.3, -0.5,0.0);
Описанный выше способ восстановления положения системы координат достаточно громоздок и неэффективен в вычислительном плане, поскольку обратные преобразования выполняются через перемножение матриц. Другой способ позволяет запоминать состояния матрицы моделирования и восстанавливать его в нужный момент.
Команды glPushMatrix и glPopMatrix позволяют запомнить и восстановить текущую матрицу. Эти команды оперируют со стеком, т.е. можно запоминать несколько величин, а при каждом восстановлении содержимое стека поднимается вверх на единицу данных
(восстановление осуществляется в обратном порядке!).
Команды glPushMatrix и glPopMatrix устанавливаются соответственно до и после командных скобок.
Задания к лабораторной работе.
Задание 1. Создать массив вершин, содержащий координаты правильного n-угольника.
Используя сформированный массив нарисовать: a.
Полигон; b.
Набор четырехугольников; c.
Набор треугольников; d.
Набор линий.

21
Все объекты должны быть изображены каркасно.
Задание 2. Нарисуйте треугольник, прямоугольник и линию. Получите новое изображение на котором:

треугольник следует смасштабировать с коэффициентами (kx, ky) и перенести на вектор p;

линию повернуть на угол

относительно начала координат;

прямоугольник повернуть относительно точки с координатами (x, y) на угол

Задание 3. Используя примитив для рисования линий и операции геометрических преобразований изобразить фигуру, показанную на рисунке.
Варианты к заданиям.
Вариант 1
Вариант 4
N=5
(kx,ky)=(2, 1.5) p=(12, 5)

=30
(x, y)=(3, 3)

=-15
N=4
(kx,ky)=(2.5, 0.5) p=(2, 5)

=-30
(x, y)=(13, 7)

=35
Вариант 2
Вариант 5
N=7
(kx,ky)=(3, 0.5) p=(-5, 10)

=-70
(x, y)=(-5, -5)

=45
N=8
(kx,ky)=(1.2, 1.5) p=(3, 15)

=40
(x, y)=(-3, 8)

=-25
Вариант 3
N=6
(kx,ky)=(-0.5, 1.5) p=(10, -5)

=45
(x, y)=(-10, 3)

=-30
Дополнительные задания.
1.
Изобразите выпуклый многоугольник, заданный массивом вершин и точку белого цвета вне этого многоугольника. Точка может перемещаться по экрану при помощи клавиш управления курсором. При нажатии клавиши цвет точки становится: красным – точка внутренняя; зеленым – граничная; белым – внешняя точка.
2.
Изобразите на экране отрезок прямой линии и некоторую точку вне этой линии.
Пользуясь аффинными преобразованиями, постройте точку, симметричную данной, относительно линии.
3.
Изобразите растущий прямоугольник, пользуясь только аффинными преобразованиями.
4.
Изобразите мишень, состоящую из 10 концентрических окружностей. Раскрасьте мишень таким образом, чтобы каждое кольцо было окрашено в свой цвет.
5.
Напишите программу для изображения гистограммы, значения категорий для которой хранятся в числовом массиве. Гистограмма должна а) полностью изображаться на экране; б) располагаться в заданной области окна.
Контрольные вопросы.
1.
Для чего применяется массив вершин?

22 2.
Каким образом производится объявление и заполнение массива вершин?
3.
Какие команды служат для работы с массивом вершин?
4.
Что необходимо сделать, прежде чем начать работать с массивом вершин?
5.
Что такое матрица переноса и для чего она служит?
6.
Какие существуют виды преобразований и какие команды openGL им соответствуют?
Лабораторная работа № 4. Трехмерные построения. Буфер глубины.
Видовые параметры. Параллельная и перспективная проекции.
Цель работы.
Выяснить особенности трехмерного моделирования, построения объемных изображений как проекций на экранной плоскости; дать понятие о параметрах вида.
1   2   3   4   5   6   7   8


написать администратору сайта