Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / 5_i_poslednyaya / glopen10 / Labor_07.doc
Скачиваний:
24
Добавлен:
29.05.2018
Размер:
416.26 Кб
Скачать

Создание 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