Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / IGS_2014-2015 / Lab_04 / labor_04.doc
Скачиваний:
22
Добавлен:
17.04.2018
Размер:
303.62 Кб
Скачать

Создание 2d объектов с помощью графической библиотеки OpenGl.

В рассмотренной выше программе glopen01.cppрисуются объекты 2Dграфики, треугольник и последовательность отрезков. Эти объекты относятся к разряду графических примитивов. Прежде чем рассматривать набор других примитивов, отметим общую для всех примитивов особенность. Вывод каждого примитива вOpenGLоформлен парой функцийglBeginиglEnd, следующим образом.

glBegin(mode);

glVertexXX(x,y)



glVertexXX(x,y)

glEnd();

Координаты вершин объекта задаются функцией glVertexXX. Эта функция имеет много разновидностей (суффиксовXX). Количество аргументов соответствует числу измерений систем координат. Тип координат может быть целым или вещественным. Например:

GlVertex2а(0,300);

задает двухмерные вещественные координаты, а

GlVertex3а(0,3,0);

задает трехмерные вещественные координаты.

Аргументом modeфункцииglBeginявляется код типа объекта. В таблице приводятся значения аргументаmode.

mode

GL_POINTS

Каждая вершина рисуется как отдельная точка

GL_LINES

Каждая пара вершин соединяется прямым отрезком

GL_LINE_STRIP

Линия из несколько связанных отрезков

GL_LINE_LOOP

Замкнутая линия

GL_TRIANGLES

Тройки вершин образуют треугольники

GL_QUADS

Каждые четыре вершины образуют четырехугольники

GL_POLIGON

Один выпуклый полигон

В программе glopen06.cppрассматриваются все приведенные в таблице варианты. Запускаем программу и получаем картину, показанную на Рис.8.

Рис.8.

2D- графикаOpenGL.

(Изображение на Рис.8 создано программой glopen06.cpp.)

Пример создания 3d объектов с помощью графической библиотеки OpenGl.

Посмотрим, как можно создать трехмерные графические объекты с помощью библиотеки OpenGL. В программеglopen07.cppрассматривается построение пирамиды над шахматной доской. Запускаем программу и получаем картину, показанную на Рис.9.

Рис.9.

3D- графикаOpenGL. Включен механизмz-буфера.

Рис.10.

3D- графикаOpenGL. Механизмz-буфера отключен.

(Изображения на Рис.9, 10 созданы программой glopen07.cpp.)

Здесь используется перспективная проекция. Кроме того, объект помещается в объем видимости, в котором есть ближняя плоскость отсечения с координатой zN, и дальняя плоскость отсечения с координатойzF. Расположение графического объекта в области видимости определяется матрицами переноса и матрицами поворота относительно координатных осей. Приведем фрагмент кода, ответственный за эти действия.

RECT rc;

//координаты окна отправляются в структуру rc

GetClientRect(hwnd, &rc);

//установка матрицы перспективной проекции

// gluPerspective(f,a,zN,zF) f-угол просмотра, a- коэффициент

//пропорциональности, zN- расстояние до ближней плоскости отсечения

// zF- расстояние до дальней плоскости отсечения

gluPerspective(50, (double)rc.right/rc.bottom, 1, 40);

//умножение текущей матрицы на матрицу переноса

glTranslatef(0, 0, -10);

//умножение текущей матрицы на матрицу поворота

glRotatef(27, 1, 0, 0);

glRotatef(-19, 0, 1, 0);

Рекомендуется поупражнятьсяс параметрами области видимости и параметрами матриц проектирования, переноса и поворотов.

Далее надо обратить внимание, что в некоторые элементы картины заслонены другими элементами и поэтому не видны на экране. Удаление невидимых линий и граней здесь осуществляет механизм z-буфера. Подключение механизмаz-буфера осуществляется в следующем фрагменте кода.

glClearColor(1.0f,1.0f,1.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glClearDepth(1.0);

glEnable(GL_DEPTH_TEST);

Убрать механизм z-буфера можно, если убрать последнюю строчкуglEnable(GL_DEPTH_TEST)в этом фрагменте. Результат работы программы будет такой как на Рис.10.

Наличие источника света учитывается в программе glopen08.cpp. Результат работы программы показан на Рис.11.

Рис.11.

3D- графикаOpenGL. Включен источник осещения.

(Изображение на Рис.11 создано программой glopen08.cpp.)

Можно рисовать с помощью OpenGLне только примитивы, но и стандартные фигуры – цилиндры, сферы и т.д. В программеglopen09.cppрисуется цилиндр. Результат работы программы показан на Рис.12.

Рис.12.

Пример 3D- графикаOpenGL.

Рис.13.

Пример 3D- графикаOpenGL.

(Изображения на Рис.12, 13 созданы программой glopen09.cpp.)

Если убрать шахматное поле, то результат показан на рис.13

Соседние файлы в папке Lab_04