Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KG / КГ_10глава.doc
Скачиваний:
115
Добавлен:
26.05.2014
Размер:
584.19 Кб
Скачать

10.1. Пример программы OpenGl

Текст программы здесь представлен в виде двух файлов — winOpGL.cpp и studexso. срр. В этой программе использованы те же файлы ресурсов (studex.rc) и общего описания (studex.def), что и во всех предыдущих при­мерах программ.

Файл WinOpGL. срр:

Текст этой программы составлен их двух частей— winOpGL.cpp и studexso.срр. В файле WinOpGL.cpp сосредоточены функции, необходимые! для создания окна, оконные функции, функции инициализации графики. Этот^ файл будет использован и в следующих примерах программ OpenGL. Файл studexso. срр содержит текст, описывающий графическое отображение кон­кретных объектов (функция DrawMyExampieOpenGL). Как вы, наверное, уже за-

метили, все это подобно использованию в главах 5—8 наших собственных

файлов wiranain.cpp, winmainl.cpp И studexXX. cpp.

Запустите программу, затем выберите меню "Графика". На экране в окне программы появляется картинка, показанная на рис. 10.1.

Рис. 10.1. Первый пример OpenGL — двумерная графика

Изображение в окне программы studexso создается из нескольких графиче­ских примитивов. В данном случае рисовались точки, линии и полигоны. Вывод каждого такого примитива в OpenGL оформлен парой функций glBegin И glEnd:

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

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

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

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

Перечисление всех вершин объекта в программе завершает вызов функции glEnd. Это означает запись примитива в очередь графического вывода. В за-

висимости от аргумента функции giBegin(mode) список вершин может трак<; товаться OpenGL по-разному (табл. 10.1).

Таблица 10.1

Можно считать существенным недостатком ограничение для полигонов (glpolygon) возможностью вывода только выпуклых фигур. Функция API Windows Polygon в этом плане намного совершеннее — она рисует и невы­пуклые полигоны. В OpenGL для рисования произвольных полигонов преду­смотрена триангуляция.

Размер точек можно задать вызовом gipointsizeo, толщину линий — giLineWidth (). Для задания стиля линий используются функции glLineStipple, glEnable И glDisable, например:

glLineStipple(3, 0x08ff);

glEnable(GL_LINE_STIPPLE);

.... //здесь используется этот стиль линий

glDisable(GL_LINE_STIPPLE);

причем аргументами функции glLineStipple о являются количество повто­ров пикселов и шаблон пунктира.

Стиль заполнения фигур может быть задан растровым образцом в массиве 32x32 бит.

ения

Обратитевнимание, мы уже несколько раз использовали функцииglEnabie () иgiDisable (). Это многоцелевые функции. Они предназначены для управле­ния многими разнообразными режимами отображения.

10.2. Координаты и матрицы

В OpenGL используются три типа матриц— видовая матрица, матрица про­екции и матрица текстуры. Все они имеют размер 4x4 и определяют преобра­зования координат так, как описано в главе 2 этой книги.

Для задания 16 элементов матрицы можно использовать функции

которые копируют элементы массива т[ ] в текущую матрицу. Для некоторых часто используемых преобразований предусмотрены функ­ции, которые автоматически заполняют значения коэффициентов. Функция giLoadidentityO устанавливает единичную матрицу текущего преобразо­вания:

Следующие функции заполняют матрицы значениями коэффициентов, соот­ветствующими таким преобразованиям:

Для того чтобы матрица определенного типа стала текущей, следует вы­звать функцию glMatrixMode(mode), где значение mode = GL_MODELVIEW,

glprojection или gljtexture. Видовая матрица определяет преобразования мировых координат в координаты проецирования (видовые координаты). Матрица проекции отвечает за преобразование видовых координат проекции в экранные координаты. Матрица текстуры предназначена для наложения проективных текстур.

Для задания проекций отображения предусмотрены несколько функций. Ак­сонометрическая проекция (здесь называется ортографической) задается функциями giQrtho( ) или giuOrtho2D о. Центральная проекция устанавли­вается ВЫЗОВОМ функции gluPerspective ().

Для задания области отсечения графического вывода используется функция

glViewport().

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