Как узнать, сколько единиц в плоскости экрана в OpenGL

Как можно получить относительный размер плоскости просмотра в собственных единицах opengl? Мне нужно узнать ширину и высоту в «единицах opengl». Есть ли функция, которая будет получать эту информацию?

Я предполагаю, что одна единица (скажем, 1,0f) в Z будет эквивалентна одной единице в X, даже если преобразование в реальную систему измерения бессмысленно.

Я знаю, что могу получить размер экрана с помощью GetSystemMetrics(SM_CXSCREEN) или glutGet(GLUT_SCREEN_WIDTH), но это в пикселях.

Для обработки вызовов графических окон я использую freeglut в операционных системах, отличных от Windows, и WinAPI в Windows.


person user2063669    schedule 12.02.2013    source источник
comment
Что именно вы пытаетесь сделать здесь   -  person Aesthete    schedule 12.02.2013
comment
Вопрос некорректен, как написано. Предполагая, что вы используете перспективную проекцию, плоскость обзора отсутствует. Ширина экрана зависит от того, на каком расстоянии Z вы его измеряете. Если вы говорите о фиксированном известном расстоянии (например, -1,0 Z), то это ответ.   -  person Nicol Bolas    schedule 12.02.2013
comment
Полагаю, по-другому можно сказать, что я пытаюсь найти самую большую линию, которую я могу провести параллельно оси X в плоскости экрана, которая не выходит за размеры окна просмотра.   -  person user2063669    schedule 12.02.2013
comment
Будет две единицы.   -  person Aki Suihkonen    schedule 12.02.2013
comment
Для меня это не имеет никакого смысла, Аки Суихконен. Почему всегда два? Есть ли хотя бы способ установить значение?   -  person user2063669    schedule 12.02.2013
comment
Их два, потому что диапазон экрана идет от -1 до 1. Разница между ними две.   -  person Skalli    schedule 12.02.2013
comment
Я не эксперт, но вы, вероятно, захотите изучить «пространства» (например, пространство клипа, пространство камеры, мировое пространство) и то, как и почему происходит трансформация между ними. Еще одна полезная вещь для понимания — проекция. Как только вы поймете их, вы поймете, почему ваш вопрос может не иметь смысла.   -  person Samuel Harmer    schedule 12.02.2013


Ответы (1)


Предполагая, что вы хотите нарисовать что-то вроде пользовательского интерфейса, установите матрицу проекции на орфографическую матрицу с помощью glOrtho, тогда у вас не будет никакой перспективы и будет прямое ортогональное сопоставление между мировыми координатами и координатами экрана. Аргументы вашего вызова glOrtho определяют ширину/высоту вашего порта просмотра в мировых координатах.

Если вы хотите нарисовать и пользовательский интерфейс, и 3D-сцену, нарисуйте пользовательский интерфейс с помощью glOrtho и нарисуйте сцену с помощью glPerspective, используя обтравочную маску, чтобы убедиться, что вы не испортите свой пользовательский интерфейс.


Если, с другой стороны, вы хотите узнать ширину окна просмотра в 3D-сцене с перспективой, чтобы знать, насколько велик ваш объект, вам придется иметь дело с перспективной проекцией. Вам нужно знать, по какой координате Z вы хотите узнать ширину/высоту окна просмотра. Вы можете использовать gluUnProject для вычисления мировой координаты, соответствующей данной экранной координате и плоскости Z.

Однако, вероятно, было бы лучше сделать это наоборот, всегда рисовать свой объект с заданным размером, а затем вычислять, какой должна быть ваша матрица проекции, чтобы этот объект правильно отображался в вашем окне просмотра.

person wich    schedule 12.02.2013