ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.06.2020

Просмотров: 3134

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 31

массива

:   

GL_UNSIGNED_BYTE

GL_UNSIGNED_SHORT

,  

GL_UNSIGNED_INT

а

count

задает

их

количество

Важно

отметить

что

использование

массивов

вершин

позволяет

оптимизировать

передачу

данных

на

сервер

 OpenGL, 

и

как

следствие

повысить

скорость

рисования

трехмерной

сцены

Такой

метод

определения

примитивов

является

одним

из

самых

быстрых

и

хорошо

подходит

для

визуализации

больших

объемов

данных

Контрольные

вопросы

1. 

Что

такое

функция

  

обратного

вызова

и

как

функции

обратного

вызова

могут

быть

использованы

для

работы

с

 OpenGL?  

2. 

Для

чего

нужна

функция

обновления

изображения

и

что

она

делает

3. 

Что

такое

примитив

в

 OpenGL?  

4. 

Что

такое

атрибут

Перечислите

известные

вам

атрибуты

вершин

в

 OpenGL. 

5. 

Что

в

 OpenGL 

является

атомарным

примитивом

Какие

типы

примитивов

вы

знаете

6. 

Для

чего

в

 OpenGL 

используются

команды

 glEnable/glDisable? 

7. 

Что

такое

операторные

скобки

и

для

чего

они

используются

в

OpenGL? 

8. 

Что

такое

дисплейные

списки

Как

определить

список

и

как

вызвать

его

отображение

9. 

Поясните

организацию

работы

с

массивами

вершин

и

их

отличие

от

дисплейных

списков

10. 

Поясните

работу

команды

 glDrawElements() 


background image

 32

Глава

 3  

Преобразования

объектов

В

 OpenGL 

используются

как

основные

три

системы

координат

левосторонняя

правосторонняя

   

и

оконная

Первые

две

системы

являются

трехмерными

и

отличаются

друг

от

друга

направлением

оси

 z: 

в

правосторонней

она

направлена

на

наблюдателя

в

левосторонней

 – 

в

глубину

экрана

Ось

 x 

направлена

вправо

относительно

наблюдателя

ось

 y – 

вверх

.  

Левосторонняя

система

используется

для

задания

значений

параметрам

команды

gluPerspective()

glOrtho()

которые

будут

рассмотрены

в

пункте

 3.3. 

Правосторонняя

система

координат

используется

во

всех

остальных

случаях

Отображение

трехмерной

информации

происходит

в

двумерную

оконную

систему

координат

.  

Строго

говоря

, OpenGL 

позволяет

путем

манипуляций

с

матрицами

моделировать

как

правую

так

и

левую

систему

координат

Но

на

данном

этапе

лучше

пойти

простым

путем

и

запомнить

основной

системой

координат

 OpenGL 

является

правосторонняя

система

3.1. 

Работа

с

матрицами

Для

задания

различных

преобразований

объектов

сцены

в

 OpenGL 

используются

операции

над

матрицами

при

этом

различают

три

типа

матриц

модельно

-

видовая

матрица

проекций

и

матрица

текстуры

Все

они

имеют

размер

 4x4. 

Видовая

матрица

определяет

преобразования

  

Рис

. 4 

Системы

координат

в

 OpenGL 

a) 

правосторонняя

система

б

левосторонняя

система

б

оконная

система


background image

 33

объекта

в

мировых

координатах

такие

как

параллельный

перенос

изменение

масштаба

и

поворот

Матрица

проекций

определяет

как

будут

проецироваться

трехмерные

объекты

на

плоскость

экрана

  (

в

оконные

координаты

), 

а

матрица

текстуры

определяет

наложение

текстуры

на

объект

.  

Умножение

координат

на

матрицы

происходит

в

момент

вызова

соответствующей

команды

 OpenGL, 

определяющей

координату

  (

как

правило

это

команда

glVertex*

Для

того

чтобы

выбрать

,  

какую

матрицу

надо

изменить

используется

команда

void 

glMatrixMode

 (GLenum 

mode

вызов

которой

со

значением

параметра

mode

равным

GL_MODELVIEW

GL_PROJECTION

,  

или

GL_TEXTURE

  

включает

режим

работы

с

модельно

-

видовой

матрицей

матрицей

проекций

или

матрицей

текстуры

соответственно

Для

вызова

команд

задающих

матрицы

того

   

или

иного

типа

необходимо

сначала

установить

соответствующий

режим

Для

определения

элементов

матрицы

текущего

типа

вызывается

команда

void 

glLoadMatrix[f d]

 (GLtype *

m

где

m

указывает

на

массив

из

 16 

элементов

типа

 float 

или

 double 

в

соответствии

с

названием

команды

при

этом

сначала

в

нем

должен

быть

записан

первый

столбец

матрицы

затем

второй

третий

и

четвертый

Еще

раз

обратим

внимание

:  

в

массиве

матрица

записана

по

столбцам

Команда

void  

glLoadIdentity

 (void) 

заменяет

текущую

матрицу

на

единичную

.  

Часто

бывает

необходимо

сохранить

содержимое

текущей

матрицы

для

дальнейшего

использования

для

чего

применяются

команды

  

void 

glPushMatrix

 (void) 

void 

glPopMatrix

 (void)  


background image

 34

Они

записывают

и

восстанавливают

текущую

матрицу

из

стека

причем

для

каждого

типа

матриц

стек

свой

Для

модельно

-

видовых

матриц

его

глубина

равна

как

минимум

 32,  

для

остальных

 – 

как

минимум

 2. 

Для

умножения

текущей

матрицы

на

другую

матрицу

используется

команда

void 

glMultMatrix[f d]

 (GLtype *

m

где

параметр

m

должен

задавать

матрицу

размером

 4x4. 

Если

обозначить

текущую

   

матрицу

за

М

передаваемую

матрицу

за

 T, 

то

в

результате

выполнения

команды

glMultMatrix

текущей

становится

матрица

 M * T. 

Однако

обычно

для

изменения

матрицы

того

или

иного

типа

удобно

использовать

специальные

команды

которые

по

значениям

своих

параметров

создают

нужную

матрицу

   

и

умножают

ее

на

текущую

.  

В

целом

для

отображения

трехмерных

объектов

сцены

в

окно

приложения

используется

последовательность

показанная

на

рисунке

 
 
 
 

 
 
 
 
 
 

 
 
 
 
 

Запомните

все

преобразования

объектов

и

камеры

в

 OpenGL 

производятся

с

помощью

умножения

векторов

координат

на

матрицы

Причем

умножение

происходит

на

текущую

матрицу

в

момент

определения

координаты

командой

glVertex*

и

некоторыми

другими

Рис

. 5.  

Преобразования

координат

в

 OpenGL 

Нормализованные

координаты

Модельно

-

видовое

преобразование

Преобразование

проекции

и

нормализация

Преобразование

к

области

вывода

Модельно

-

видовая

матрица

Матрица

проекции

Параметры

области

вывода

(glViewport) 

Видовые

координаты

Оконные

координаты

Мировые

координаты


background image

 35

3.2. 

Модельно

-

видовые

преобразования

К

модельно

-

видовым

преобразованиям

будем

относить

перенос

поворот

и

изменение

масштаба

вдоль

координатных

осей

Для

проведения

этих

операций

достаточно

умножить

на

соответствующую

матрицу

каждую

вершину

объекта

и

получить

измененные

координаты

этой

вершины

(x’, y’, z’, 1)

T

 =  M * (x, y, z, 1)

где

 M – 

матрица

модельно

-

видового

преобразования

Перспективное

преобразование

и

проектирование

производится

аналогично

Сама

матрица

может

быть

создана

с

помощью

следующих

команд

void 

glTranslate[f d] 

(GLtype 

x

, GLtype 

y

, GLtype 

z

void 

glRotate[f d] 

(GLtype 

angle

, GLtype 

x

, GLtype 

y

                    GLtype z) 

void 

glScale[f d] 

(GLtype 

x

, GLtype 

y

, GLtype 

z

glTranlsate*()

производит

перенос

объекта

прибавляя

к

  

координатам

его

вершин

значения

своих

параметров

.  

glRotate*(

)

производит

поворот

объекта

против

часовой

стрелки

на

угол

angle

 (

измеряется

в

градусах

вокруг

вектора

 (x,y,z). 

glScale*()

производит

масштабирование

объекта

  (

сжатие

или

растяжение

вдоль

вектора

 (x,y,z), 

умножая

соответствующие

координаты

его

вершин

на

значения

своих

параметров

Все

эти

преобразования

изменяют

текущую

матрицу

а

поэтому

применяются

к

примитивам

которые

определяются

позже

В

случае

если

надо

например

повернуть

один

объект

сцены

а

другой

оставить

неподвижным

удобно

сначала

сохранить

текущую

видовую

матрицу

в

стеке

командой

glPushMatrix(

), 

затем

вызвать

glRotate()

с

нужными

параметрами

описать

примитивы

из

которых

состоит

этот

объект

а

затем

восстановить

текущую

матрицу

командой

glPopMatrix().

Кроме

изменения

положения

самого

объекта

часто

бывает

необходимо

изменить

положение

наблюдателя

что

также

приводит

к

изменению

модельно

-

видовой

матрицы

Это

можно

сделать

с

помощью

команды