Функции OpenGL для генерации косоугольной проекции не существует. Чтобы получить такую проекцию, можно задать собственную проекционную матрицу, подобную приведенной в уравнении (7.14). Затем нужно сделать ее текущей проекционной матрицей OpenGL, используя функции работы с матрицами, рассмотренные в разделе 5.17. Другой способ генерации косоугольной проекции - так повернуть сцену в подходящее положение, чтобы ортогональная проекция в направлении zvjew давала искомое изображение.
ФУНКЦИИ OpenGL СИММЕТРИЧНОЙ ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ
Существует две функции для получения перспективной проекции сцены. Одна из них генерирует объем наблюдения в виде симметричной усеченной пирамиды по направлению наблюдения (отрицательное направление оси zvjew). Другую функцию можно использовать для получения либо симметричной перспективной проекции, либо косоугольной перспективной проекции. Для обоих функций центр проекции совпадает с началом системы наблюдения, а ближняя плоскость отсечения - с плоскостью наблюдения.
Объем наблюдения перспективной проекции в виде симметричной усеченной пирамиды задается функцией GLU
gluPerspective (theta, aspect, dnear, dfar); Здесь значениями всех четырех параметров являются числа двойной точности с плавающей запятой. Первые два параметра определяют размер и положение отсекающего окна на ближней плоскости, а вторые - расстояние от точки наблюдения (начало координат) до ближней и дальней плоскостей отсечения. Параметр theta представляет угол обзора-угол между верхней и нижней плоскостями отсечения (см. рис. 7.48). Данному углу можно присвоить любое значение от 0° до 180°. Параметру aspect присваивается значение характеристического отношения (ширина:высота) отсекающего окна.
При построении перспективной проекции в OpenGL ближняя и дальняя плоскости отсечения должны всегда идти по отрицательному направлению оси zview ; ни одна из них не может располагаться “за” точкой наблюдения. К ортогональным проекциям данное ограничение не применяется, но оно предотвращает вывод на экран перевернутой перспективной проекции объекта, когда плоскость наблюдения находится позади точки наблюдения. Следовательно, обоим параметрам dnear и dfar нужно присвоить положительные значения, а положения ближней и дальней плоскостей вычислить как znear = -dnear и Zfar = -dfar.
Если проектирующая функция не задана, сцена отображается с использованием ортогональной проекции по умолчанию. В этом случае объем наблюдения представляет собой симметричный нормированный куб, показанный на рис. 7.54.
В заключение отметим, что пирамидальный объем наблюдения, заданный функцией gluPerspective, симметричен относительно отрицательной оси 2view, а для преобразования описания сцены в нормированные однородные координаты проекции используется матрица (7.41).
ПОЛЯ ПРОСМОТРА И ОКНА НА ЭКРАНЕ OpenGL
После завершения процедур отсечения в нормированных координатах содержимое нормированного отсекающего окна плюс информация о глубине переводятся в трехмерные экранные координаты. Код цвета для каждой точки ху поля просмотра записывается в буфере регенерации (буфер цвета), также для каждой точки ху в буфере глубины записана информация о глубине.