Нормализованные координаты для OpenGL

Я пытался обрезать изображение на своем экране, ограничив громкость просмотра с помощью glFrustum. В официальной документации для Glfrustum упоминается, что left, right, top, bottom, near, far — это координаты отсечения. Я думал, что это координаты экрана, и пытался сделать:

glFrustum(100, 924, 100, 668, 3, 1000);

Вышеупомянутое ничего не показывало мне на экране. Итак, я только что посмотрел где-то и увидел следующий код (но почему эти координаты отрицательные?):

glFrustum(-1, 1, -1, 1, 0.5, 1000);

Я использовал то же самое и начал получать часть изображения на экране. В последствии я трижды возился с координатами для near и заметил, как меняется громкость просмотра.

glFrustum(-10,10,-10,10,10,1000);
glFrustum(-100,100,-100,100,100,1000);
glFrustum(-0.5,0.5,-0.5,0.5,0.5,1000);

Все вышеперечисленное давало мне одинаковый вывод изображений на экран. Но в большинстве мест, где я наблюдал использование glFrustum, я заметил, что значения использовались где-то из [-1,1] (например, здесь) и люди говорят о расчетах в нормализованном диапазоне. Почему важно делать расчет для left, right, bottom, top, near, far (ближний и дальний также включены в нормализованные значения?) с точки зрения нормализованных значений? Можно ли выполнять те же операции, используя значения в экранных координатах?


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


Ответы (2)


ПРИМЕЧАНИЕ. Этот вопрос и ответ действительны только для более старых (до версии 3) OpenGL.

Во-первых, glFrustum не зависит от разрешения вашего экрана.

Эта функция определяет объем, в котором будет отрисовываться сцена, то есть все элементы вашего экрана, выходящие за пределы этого объема, будут игнорироваться/вырезаться. Координаты для glFrustum относятся к вашей сцене, а не к вашему экрану.

введите здесь описание изображения

Учтите, что для корректного представления должны быть правильно настроены другие параметры, такие как вращение/перевод сцены и т. д.

glFrustum(-10,10,-10,10,10,1000);
glFrustum(-100,100,-100,100,100,1000);
glFrustum(-0.5,0.5,-0.5,0.5,0.5,1000);

Все вышеперечисленное давало мне одинаковый вывод изображений на экран.

Не совсем так, если ваша 3D-модель находится рядом с точкой зрения (камара), пример 2 обрежет ее, а пример 3 — нет. Но когда вы увеличиваете/уменьшаете «ближнее» расстояние пропорционально «слева», «сверху», «снизу» и «справа», результат будет аналогичным.

person Adrian Maire    schedule 09.05.2013

Эти аргументы не в системе координат (пространстве), как вы думаете. Я нашел это для вас: http://www.matrix44.net/cms/notes/opengl-3d-graphics/coordinate-systems-in-opengl

person Trax    schedule 09.05.2013