Название: Компьютерная графика(Е.Н. Павенко)

Жанр: Информатика

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


2. проективные преобразования в opengl

В составе OpenGL имеются две функции для задания перспективных проекций и одна для задания параллельных проекций. Каждая из функций определяет зону видимости – пирамиду или параллелепипед. Объекты, не попадающие в эту зону, отсекаются и не включаются в отображаемую сцену.

3. Перспективные преобразования в OpenGL

Параметры пирамиды видимости задаются функцией glFrustum(), смысл аргументов которой поясняет рис. 4.1.

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

Значения аргументов near и far, задающих положение передней и задней отсекающих плоскостей, должны быть положительными  и отсчитываться от  центра проецирования вдоль оси проецирования.

Поскольку матрица проецирования умножается на текущую матрицу, сначала нужно задать режим работы с этой матрицей. Типичная последовательность операций представлена ниже.

glMatrixMode(GL_PROJECTION);

chap3-5.gif

Рис. 4.1

 

glLoadIdentity();

glFrustum(xmin, xmax, ymin, ymax, near, far);

Во многих приложениях предпочтительнее задавать не линейные параметры, характеризующие положение углов усеченной пирамиды видимости, а угол и поле зрения. Однако если картинная плоскость является прямоугольником, а не квадратом, то нужно задавать пару углов зрения: один в вертикальной плоскости, другой- в горизонтальной (рис. 4.2).

 

chap3-6.gif

Рис. 4.2

 

            void gluPerspective(GLdouble fovy, GLdouble aspect,

GLdouble near, GLdouble far);

Аргументы этой функции имеют следующий смысл:

fovy – угол зрения в вертикальной плоскости;

aspect – отношение ширины окна картинной плоскости к его высоте;

near и far – расстояние от центра проецирования до передней и задней отсекающих плоскостей.

4. Параллельное проецирование в OpenGL

В составе OpenGL имеется только одна функция для задания параметров параллельного проецирования, которая формирует ортогональную проекцию. Зона видимости при этом превращается в параллелепипед (рис. 4.3.).

 

chap3-25.gif

Рис. 4.3

 

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,

GLdouble top, GLdouble near, GLdouble far);

Аргументы вызова имеют тот же геометрический смысл, что и одноименные аргументы функции glFrustum().

5. Задание положения и ориентации камеры

Подпись:  
Рис. 4.4

В составе OpenGL имеется функция gluLookAt(), которая позволяет задать положение и ориентацию камеры (рис. 4.4).

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- компоненты точки, которая задает положительное направления оси Y сцены.

Порядок выполнения работы

Составить программу рисования куба.

Получить перспективную и параллельную проекцию куба.

Организовать перемещение камеры вокруг куба, изменяя координаты точки наблюдения – eyex, eyey, eyez. Для перемещения камеры использовать клавиатуру.

Контрольные вопросы

Графический конвейер OpenGl.

Виды проецирования. Параллельные и перспективные проекции.

Способы получения триметрической, диметрической и изометрической проекции.

Перспективные проеции. Точки схода.