Получение проекций

Видимым объемом при перспективном преобразовании в OpenGL является усеченная пирамида.

Для задания перспективного преобразования в OpenGL служит процедура gIFrustrum(GLdouble teft, GLdoubte right, GLdouble bottom, GLdouble top, GLdouble near, GLdoubte far).

Параметры определяют плоскости, по которым проводится отсечение. Величины near и far должны быть неотрицательными.

Иногда для задания перспективного преобразования удобнее воспользоваться следующей процедурой из библиотеки утилит gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar).

Эта процедура создает матрицу для задания симметричного поля зрения и умножает текущую матрицу на неё. Здесь fovy – угол зрения камеры в плоскости Oxz, лежащей в диапазоне [0, 180]. Параметр aspect – отношение ширины области к её высоте, zNear и zFar – расстояния вдоль отрицательного направления оси Oz, определяющие ближнюю и дальнюю плоскости отсечения.

Существует ещё одна удобная функция для задания перспективного проецирования gluLookAt (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GIdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble up2).

Вектор (еуеХ, eyeY, eyeZ) задаёт положение наблюдателя, вектор (cenlerX, centerY, centerZ) – направление на центр сцены, а вектор (upX, upY, upZ) – направление вверх.

В случае параллельного проецирования видимым объемом является прямоугольный параллелепипед. Для задания параллельного проецирования служит процедура glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far).

Параметры left и right определяют координаты левой и правой вертикальных плоскостей отсечения, a bottom и top – нижней и верхней горизонтальных плоскостей.

Следующим шагом в задании проецирования (после выбора параллельного или перспективного преобразования) является задание области в окне, в которую будет помещено получаемое изображение. Для этого служит процедура gIViewport(GLint x, GLint у, GLsizei width, GLsizei height).

Здесь (х, у) задаёт нижний левый угол прямоугольной области в окне, a width и height являются её шириной и высотой.

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

Для помещения текущей матрицы в стек служит процедура gIPushMatrix(), для извлечения матрицы из стека – процедура glPopMatrix().