Файл: графическая библиотека opengl.pdf

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

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

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

Добавлен: 09.06.2020

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

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

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

 36

void 

gluLookAt  

  

(GLdouble 

eyex

, GLdouble 

eyey

, GLdouble 

eyez

,  

   GLdouble 

centerx

, GLdouble 

centery

, GLdouble 

centerz

   GLdouble 

upx

, GLdouble 

upy

, GLdouble 

upz

 

где

 

точка

  (

eyex,eyey,eyez

определяет

 

точку

 

наблюдения

, (

centerx, 

centery, centerz

)  

задает

 

центр

 

сцены

который

 

будет

 

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

 

в

 

центр

 

области

 

вывода

а

 

вектор

  (

upx,upy,upz

задает

 

положительное

 

направление

 

оси

 

у

определяя

 

поворот

 

камеры

Если

например

камеру

 

не

 

надо

 

поворачивать

то

 

задается

 

значение

 (0,1,0), 

а

 

со

 

значением

 (0,-

1,0) 

сцена

 

будет

 

перевернута

Строго

 

говоря

эта

 

команда

 

совершает

 

перенос

 

и

 

поворот

 

объектов

 

сцены

но

 

в

 

таком

 

виде

 

задавать

 

параметры

 

бывает

 

удобнее

Следует

 

отметить

,  

что

 

вызывать

 

команду

 

gluLookAt()

 

имеет

 

смысл

 

перед

 

определением

 

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

 

объектов

когда

 

модельно

-

видовая

 

матрица

 

равна

 

единичной

.  

Запомните

В

 

общем

 

случае

 

матричные

 

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

 

в

 OpenGL 

нужно

 

записывать

 

в

 

обратном

 

порядке

Например

если

 

вы

 

хотите

 

сначала

 

повернуть

 

объект

а

 

затем

 

передвинуть

 

его

сначала

 

вызовите

 

команду

 

glTranslate()

а

 

только

 

потом

 – 

glRotate()

Ну

 

а

 

после

 

этого

 

определяйте

 

сам

 

объект

3.3. 

Проекции

 

В

 OpenGL 

существуют

 

стандартные

 

команды

 

для

 

задания

 

ортографической

  (

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

и

 

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

 

проекций

Первый

 

тип

 

проекции

 

может

 

быть

 

задан

 

командами

 

void 

glOrtho 

(GLdouble 

left

, GLdouble 

right

,  

              GLdouble 

bottom

, GLdouble 

top

,  

              GLdouble 

near

, GLdouble 

far

 

void 

gluOrtho2D

 (GLdouble 

left

, GLdouble 

right

, GLdouble 

bottom

, GLdouble 

top

 

Первая

 

команда

 

создает

 

матрицу

 

проекции

 

в

 

усеченный

 

объем

 

видимости

  (

параллелепипед

 

видимости

в

   

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

 

системе

 

координат

Параметры

 

команды

 

задают

 

точки

  (

left, bottom, znear

и

 

(

right, top, zfar

), 

которые

 

отвечают

 

левому

 

нижнему

 

и

 

правому

 

верхнему

 

углам

 

окна

 

вывода

Параметры

 

near

 

и

 

far

 

задают

 

расстояние

 

до

 

ближней

 

и

 

дальней

 

плоскостей

 

отсечения

 

по

 

удалению

 

от

 

точки

 (0,0,0) 

и

 

могут

 

быть

 

отрицательными

.  


background image

 37

 

 

 

 

 

 

 

 

Во

 

второй

 

команде

в

 

отличие

 

от

 

первой

значения

 

near

 

и

 

far

 

устанавливаются

 

равными

 –1 

и

 1 

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

Это

 

удобно

если

 

OpenGL 

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

 

для

 

рисования

 

двумерных

 

объектов

В

 

этом

 

случае

 

положение

 

вершин

 

можно

 

задавать

используя

 

команды

 

glVertex2*() 

Перспективная

 

проекция

 

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

 

командой

 

void 

gluPerspective

 (GLdouble 

angley

, GLdouble 

aspect

                     GLdouble 

znear

, GLdouble 

zfar

)   

  

которая

 

задает

 

усеченный

 

конус

 

видимости

 

в

 

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

 

системе

 

координат

Параметр

 

angley

 

определяет

 

угол

 

видимости

 

в

 

градусах

 

по

 

оси

 

у

 

и

 

должен

 

находиться

 

в

 

диапазоне

 

от

 0 

до

 180. 

Угол

 

видимости

 

вдоль

 

оси

 x 

задается

 

параметром

 

aspect

который

 

обычно

 

задается

 

как

 

отношение

 

сторон

 

области

 

вывода

 (

как

 

правило

размеров

 

окна

). 

 

 

 

 

 

 

 

 

 

Рис

. 6 

Ортографическая

 

проекция

 

Рис

. 7 

Перспективная

 

проекция

 

z=zfar 

z =znear 

angley 

z=zfar 

z= znear 

(left, bottom, znear) 

(right, top, zfar) 


background image

 38

Параметры

 

zfar

 

и

 

znear

 

задают

 

расстояние

 

от

 

наблюдателя

 

до

 

плоскостей

 

отсечения

 

по

 

глубине

 

и

 

должны

 

быть

 

положительными

Чем

 

больше

 

отношение

 

zfar

/

znear

тем

 

хуже

 

в

 

буфере

 

глубины

 

будут

 

различаться

 

расположенные

 

рядом

 

поверхности

так

 

как

 

по

 

умолчанию

 

в

 

него

 

будет

 

записываться

 ‘

сжатая

’ 

глубина

 

в

 

диапазоне

 

от

 0 

до

 1 (

см

п

3.4.).  

Прежде

 

чем

 

задавать

 

матрицы

 

проекций

не

 

забудьте

 

включить

 

режим

 

работы

 

с

 

нужной

 

матрицей

 

командой

 

glMatrixMode(GL_PROJECTION

и

 

сбросить

 

текущую

вызвав

 

glLoadIdentity(). 

Пример

/* 

ортографическая

 

проекция

 */ 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, w, 0, h, -1.0, 1.0); 

 

3.4. 

Область

 

вывода

 

После

 

применения

 

матрицы

 

проекций

   

на

 

вход

 

следующего

 

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

 

подаются

 

так

 

называемые

 

усеченные

 (clipped) 

координаты

Затем

 

находятся

 

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

 

координаты

 

вершин

 

по

 

формуле

(x

n

, y

n

, z

n

)

T

 = (x

c

/w

, y

c

/w

c

, z

c

/w

c

)

T

 

 

Область

 

вывода

 

представляет

 

собой

 

прямоугольник

 

в

 

оконной

 

системе

 

координат

размеры

 

которого

 

задаются

 

командой

void 

glViewPort

 (GLint 

x

, GLint 

y

, GLint 

width

, GLint 

height

 

Значения

 

всех

 

параметров

 

задаются

 

в

 

пикселах

 

и

 

определяют

 

ширину

 

и

 

высоту

 

области

 

вывода

 

с

 

координатами

 

левого

 

нижнего

 

угла

 

(

x

,

y

в

 

оконной

 

системе

 

координат

Размеры

 

оконной

 

системы

 

координат

 

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

 

текущими

 

размерами

 

окна

 

приложения

точка

 

(0,0)  

находится

 

в

 

левом

 

нижнем

 

углу

 

окна

Используя

 

параметры

 

команды

 

glViewPort()

,

 OpenGL 

вычисляет

 

оконные

 

координаты

 

центра

 

области

 

вывода

 (o

x

,o

y

по

 

формулам

 

o

x

=x+width/2, o

y

=y+height/2. 


background image

 39

Пусть

  p

x

=width, p

y

=height, 

тогда

 

можно

 

найти

 

оконные

 

координаты

 

каждой

 

вершины

(x

w

, y

w

, z

w

)

= ( (p

x

/2) x

n

+ o

, (p

y

/2) y

n

+ o

y , 

[(f-n)/2] z

n

+(n+f)/2 )

 

При

 

этом

 

целые

 

положительные

 

величины

  n 

и

 f 

задают

 

минимальную

 

и

 

максимальную

 

глубину

 

точки

 

в

 

окне

 

и

 

по

 

умолчанию

 

равны

 0 

и

 1 

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

Глубина

 

каждой

 

точки

 

записывается

 

в

 

специальный

 

буфер

 

глубины

 (z-

буфер

), 

который

 

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

 

для

 

удаления

 

невидимых

 

линий

 

и

 

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

Установить

 

значения

 n 

и

 f 

можно

 

вызовом

 

функции

 

void 

glDepthRange

 (GLclampd 

n

, GLclampd 

f

 

Команда

 

glViewPort()

 

обычно

 

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

 

в

 

функции

зарегистрированной

 

с

 

помощью

 

команды

 

glutReshapeFunc()

которая

 

вызывается

если

 

пользователь

 

изменяет

 

размеры

 

окна

 

приложения

Контрольные

 

вопросы

 

1. 

Какие

 

системы

 

координат

 

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

 

в

 OpenGL? 

2. 

Перечислите

 

виды

 

матричных

 

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

 

в

 OpenGL. 

Каким

 

образом

 

происходят

 

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

 

объектов

 

в

 OpenGL? 

3. 

Что

 

такое

 

матричный

 

стек

4. 

Перечислите

 

способы

 

изменения

 

положения

 

наблюдателя

 

в

 

OpenGL. 

5. 

Какая

 

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

 

вызовов

 

команд

 glTranslate(), 

glRotate() 

и

 glScale() 

соответствует

 

команде

 gluLookAt(0, 0, -10, 

10, 0, 0, 0, -1, 0)? 

6. 

Какие

 

стандартные

 

команды

 

для

 

задания

 

проекций

 

вы

 

знаете

7. 

Что

 

такое

 

видовые

 

координаты

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

 

координаты


background image

 40

Глава

 4  

 

Материалы

 

и

 

освещение

 

Для

 

создания

 

реалистичных

 

изображений

 

необходимо

 

определить

 

как

 

свойства

 

самого

 

объекта

так

 

и

 

свойства

 

среды

в

 

которой

 

он

 

находится

Первая

 

группа

 

свойств

 

включает

 

в

 

себя

 

параметры

 

материала

из

 

которого

 

сделан

 

объект

способы

 

нанесения

 

текстуры

 

на

 

его

 

поверхность

степень

 

прозрачности

 

объекта

Ко

 

второй

 

группе

 

можно

 

отнести

 

количество

 

и

 

свойства

 

источников

 

света

уровень

 

прозрачности

 

среды

а

 

также

 

модель

 

освещения

Все

 

эти

 

свойства

 

можно

 

задавать

вызывая

 

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

 

команды

 OpenGL. 

4.1. 

Модель

 

освещения

 

В

 OpenGL 

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

 

модель

 

освещения

в

 

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

 

с

 

которой

 

цвет

 

точки

 

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

 

несколькими

 

факторами

свойствами

 

материала

 

и

 

текстуры

величиной

 

нормали

 

в

 

этой

 

точке

а

 

также

 

положением

 

источника

 

света

 

и

 

наблюдателя

Для

 

корректного

 

расчета

 

освещенности

 

в

 

точке

 

надо

 

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

 

единичные

 

нормали

однако

 

команды

 

типа

 

glScale*()

могут

 

изменять

 

длину

 

нормалей

Чтобы

 

это

 

учитывать

используйте

 

уже

 

упоминавшийся

 

в

 

пункте

 2.2.3 

режим

 

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

 

векторов

 

нормалей

который

 

включается

 

вызовом

 

команды

  

glEnable(GL_NORMALIZE)

.  

Для

 

задания

 

глобальных

 

параметров

 

освещения

 

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

 

команды

 

void 

glLightModel[i f] 

(GLenum 

pname

, GLenum 

param

void 

glLightModel[i f]v 

(GLenum 

pname

,  

                         const GLtype *

params

 

Аргумент

 

pname

 

определяет

какой

 

параметр

 

модели

 

освещения

 

будет

 

настраиваться

 

и

 

может

 

принимать

 

следующие

 

значения

GL_LIGHT_MODEL_LOCAL_VIEWER 

параметр

 

param

 

должен

 

быть

 

булевым

   

и

 

задает

 

положение

 

наблюдателя

Если

 

он

 

равен

 

GL_FALSE

то

 

направление

 

обзора

 

считается

 

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