На рис. 7.2 показана камера в исходной позиции, когда глаз находится в начале координат, а ось пирамиды выровнена вдоль оси г. Глаз смотрит в сторону отрицательных значений оси г.
В OpenGL предусмотрен простой способ программной установки отображаемого объема. Вспомним, что форма отображаемого объема камеры записана в проекционной матрице (projection matrix), поступающей в графический конвейер. Эта проекционная матрица устанавливается с помощью функции gluPerspectiveO с четырьмя параметрами. Применяется такая последовательность:
glMatri xMode(GL_PROJECTION):
// make the projection matrix current
// делаем текущей проекционную матрицу
gl LoadldentityO:
// start with a unit matrix
// начинаем с единичной матрицы
gluPerspective(viewAngle. aspectRatio, N. F):
// load the appropriate values
// загружаем соответствующие значения Параметр viewAngle, показанный на рисунке как угол 6, задается в градусах и определяет угол между верхней и нижней стенками пирамиды. Параметр aspectRatio устанавливает форматное соотношение любого окна, параллельного плоскости ху. Величина N - это расстояние от глаза до ближней плоскости, a F - расстояние от глаза до дальней плоскости. N и F должны быть положительными. Например, вызов gluPerspective(60.0, 1.5 . 0.3 . 50.0) устанавливает отображаемый объем с вертикальным раствором 60° и окном с форматным соотношением 1,5. Ближняя плоскость имеет координату z = -0,3, а для дальней плоскости z = -50,0. Позднее мы узнаем точно, какие величины эта функция помещает в проекционную матрицу.
7.2. Снова о камере
Рис. 7.2. Камера в исходной позиции
7.2.2. Позиционирование и ориентирование камеры
Для того чтобы получить нужный вид сцены, передвинем камеру из исходной позиции, показанной на рис. 7.2, и повернем ее в определенном направлении. Это делается посредством перемещения и поворота, а эти преобразования являются частями матрицы моделирования-вида (modelview matrix), как было показано в разделе «Рисование трехмерных сцен с применением OpenGL».
Установим позицию и ориентацию камеры в точности так, как это делалось для камеры с параллельной проекцией. (Все различие между камерами с параллельной и перспективной проекциями заключается в проекционной матрице, которая определяет форму отображаемого объема.) Проще всего вновь использовать функцию gluLookAtO в такой последовательности"opengl1_461.html">⇐ Предыдущая| |Следующая ⇒