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

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

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

Добавлен: 09.06.2020

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

Скачиваний: 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

то

направление

обзора

считается

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