Рисование в ненормализованных координатах - glFrustum

При использовании glFrustum,

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 0.1, 1000.0);
glLoadMatrxi(GL_MODELVIEW);
glBegin(GL_QUADS); //A room's left wall
glVertex3f(-1.0, 1.0, 0.0);
glVertex3f(-1.0, 1.0, -0.4);
glVertex3f(-1.0, -1.0, -0.4);
glVertex3f(-1.0, -1.0, 0.0);
glEnd();

Все мои рисунки происходят в -1, 1 (обратите внимание на приведенный выше фрагмент для // левой стены комнаты), т.е.
ось X: -1 становится левой, 1 становится правой с исходной точкой в ​​центре.
Ось Y: 1 становится верхним, а -1 становится правым с началом в центре.

Меняет ли glFrustum мои координаты на [-1,1] автоматически?

Обычно я рисовал бы куб с указанием координат экрана следующим образом:
например: ofBox(512,384,0,10) дает мне поле в центре экрана [ширина окна: 1024, высота окна: 768]

Что, если я хочу продолжать рисовать, как обычно, в своих пиксельных координатах, и не хочу усложнять себе задачу, пытаясь преобразовать рисование пиксельных координат в нормализованные координаты, даже если я использую glFrustum?


person user1240679    schedule 10.05.2013    source источник


Ответы (1)


Я думаю, вам все еще трудно представить, что такое усеченная пирамида и как она соотносится с проекцией. Проще говоря, усеченная пирамида - это пирамида, вершина которой срезана на некотором расстоянии:

усеченная пирамида

При использовании в качестве матрицы проекции OpenGL границы усеченной пирамиды определяют объем в координатах пространства просмотра (т.е. после преобразования вида модели), который будет преобразован в куб экстентов {-1, 1} ² × {0, 1} преобразованием проекции и однородным разделением.

Экстенты ближней плоскости определяют экстенты в координатах пространства обзора - то есть мировое пространство с точкой обзора, расположенной в (0,0,0), - которое будет отображено (то есть «растянуто» и / или «сжато») на размеры окна рендеринга, определенные с помощью glViewport.

Вкратце: вы используете glViewport, чтобы определить координаты пикселей в окне, куда должны идти вещи, и glFrustum, чтобы как бы «вырезать» срез из пространства обзора (которое является мировым пространством, перемещенным таким образом, что камера находится в (0 , 0,0)).

person datenwolf    schedule 10.05.2013
comment
После разделения перспективы x- и y-измерения вашего куба отображаются в [-1,1]. Однако диапазон координат глубины составляет [0,1]. - person radical7; 11.05.2013
comment
@ Радикал7: Это действительно так, однако OP борется с концепцией усеченного пространства просмотра. Я не хотел чрезмерно усложнять процесс со стороны NDC. - person datenwolf; 11.05.2013
comment
@datenwolf: Разве glFrustum не является этапом проективного преобразования, который следует за преобразованиями просмотра и моделирования на временной шкале? Координаты пространства объекта преобразуются в Пространство глаза - ›Пространство клипа -› Пространство NDC. Тогда почему, как вы упомянули, эти изменения в пространстве обзора / глаз? - person user1240679; 13.05.2013
comment
@ user1240679: glFrustum - это вообще не шаг, а вспомогательная функция для вычисления и установки матрицы проекции. И по определению параметры glFrustum, используемые для расчета объема в глазном пространстве. Кстати, из-за ваших вопросов я начал писать программу для иллюстрации, чтобы продемонстрировать, как связаны усеченная пирамида и проекция. Он еще не завершен, но вы уже можете ознакомиться с ним на github .com / datenwolf / codeamples / tree / master / samples / OpenGL / - person datenwolf; 13.05.2013