В ортогональной проекции координаты в пространстве просмотра линейно отображаются на координаты пространства отсечения, а координаты пространства отсчета равны нормализованным координатам устройства, поскольку компонент w
равен 1 (для декартовой входной координаты).
Значения слева, справа, снизу, сверху, близко и далеко определяют поле.Вся геометрия, которая находится внутри объема окна, «видна» в окне просмотра.
Матрица ортогональной проекции, определяемая glOrtho
, равна:
r = right, l = left, b = bottom, t = top, n = near, f = far
x: 2/(r-l) 0 0 0
y: 0 2/(t-b) 0 0
z: 0 0 -2/(f-n) 0
t: -(r+l)/(r-l) -(t+b)/(t-b) -(f+n)/(f-n) 1
В перспективной проекции матрица проекции описывает отображение из трехмерных точек в мире, которые они видят из камеры-обскуры, в двумерные точки видового экрана.
Координаты пространства глаза в усеченной зоне камеры (усеченная пирамида)отображаются в куб (нормализованные координаты устройства).
![](https://i.stack.imgur.com/5fcZv.png)
Матрица перспективной проекции может быть определена усеченным усечением (glFrustum
).
Расстояния left
, right
, bottom
и top
- это расстояния от центра вида до боковых граней усеченного конуса в ближней плоскости.near
и far
указывают расстояния до ближней и дальней плоскостей в усеченной области.
r = right, l = left, b = bottom, t = top, n = near, f = far
x: 2*n/(r-l) 0 0 0
y: 0 2*n/(t-b) 0 0
z: (r+l)/(r-l) (t+b)/(t-b) -(f+n)/(f-n) -1
t: 0 0 -2*f*n/(f-n) 0
Спецификация, подобная этой из вашего вопроса:
glFrustum(-1, 1, -1, 1, -1, 1);
не определяетправильный усеченный, потому что значение для ближней плоскости является отрицательным, а значение для дальней плоскости положительным.
Если вы проверите ошибки OpenGL (glGetError
), вы получите ошибку INVALID_OPERATION
.
Профиль совместимости API OpenGL 4.6Спецификация;12.1.ФИКСИРОВАННЫЕ ФУНКЦИОНАЛЬНЫЕ ПРЕОБРАЗОВАНИЯ VERTEX;стр. 501 :>
void Frustum( double l, double r, double b, double t, double n, double f );
координаты (l
b
−n
) T и (r
t
−n
) T указывают точки наближняя плоскость отсечения, которая отображается в нижний левый и верхний правый углы окна соответственно (при условии, что глаз расположен в точке (0 0 0) T).f
дает расстояние от глаза до дальней плоскости отсечения.
Ошибки Ошибка INVALID_VALUE генерируется, если n <= 0
, f <= 0
, l == r
, b == t
,или n == f
.