ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1706
Скачиваний: 4
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)
и
могут
быть
отрицательными
.
37
Во
второй
команде
,
в
отличие
от
первой
,
значения
near
и
far
устанавливаются
равными
–1
и
1
соответственно
.
Это
удобно
,
если
OpenGL
используется
для
рисования
двумерных
объектов
.
В
этом
случае
положение
вершин
можно
задавать
,
используя
команды
glVertex2*()
Перспективная
проекция
определяется
командой
void
gluPerspective
(GLdouble
angley
, GLdouble
aspect
,
GLdouble
znear
, GLdouble
zfar
)
которая
задает
усеченный
конус
видимости
в
левосторонней
системе
координат
.
Параметр
angley
определяет
угол
видимости
в
градусах
по
оси
у
и
должен
находиться
в
диапазоне
от
0
до
180.
Угол
видимости
вдоль
оси
x
задается
параметром
aspect
,
который
обычно
задается
как
отношение
сторон
области
вывода
(
как
правило
,
размеров
окна
).
Рис
. 6
Ортографическая
проекция
Рис
. 7
Перспективная
проекция
w
x
z
y
z=zfar
z =znear
h
angley
x
z
y
z=zfar
z= znear
(left, bottom, znear)
(right, top, zfar)
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
c
, 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.
39
Пусть
p
x
=width, p
y
=height,
тогда
можно
найти
оконные
координаты
каждой
вершины
:
(x
w
, y
w
, z
w
)
T
= ( (p
x
/2) x
n
+ o
x
, (p
y
/2) y
n
+ o
y ,
[(f-n)/2] z
n
+(n+f)/2 )
T
При
этом
целые
положительные
величины
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.
Что
такое
видовые
координаты
?
Нормализованные
координаты
?
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
,
то
направление
обзора
считается
параллельным