- •Московский институт электронной техники
- •Введение.
- •Подключение графической библиотеки OpenGl в программах Win32.
- •Создание консольного приложения Windows для работы с библиотекой OpenGl.
- •Интерактивное взаимодействие с OpenGl в оконном режиме Windows.
- •Двойная буферизация.
- •Двойная буферизация OpenGl в оконном приложении Windows.
- •Двойная буферизация OpenGl в консольном приложении Windows.
- •Создание 2d объектов с помощью графической библиотеки OpenGl.
- •Пример создания 3d объектов с помощью графической библиотеки OpenGl.
- •Использование таймера для моделирования движения 3d-объектов OpenGl в оконном приложении Windows.
- •Моделирование движения 3d-объектов OpenGl без таймера в консольном приложении Windows.
- •Задание к работе.
- •Варианты к лабораторной работе.
Создание 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