Расчет корректировки ортогональности и перспективы

Мне было интересно, как я могу настроить перспективную проекцию, чтобы она выглядела как ортогональная. Например, скажем, у меня есть сетка 10x10 точек, каждая с разными значениями z, которые при ортогональной проекции хорошо выстраиваются. При перспективной проекции он, конечно же, отрегулирует положение относительно камеры и глубину z. Какие настройки мне нужно сделать, чтобы каждая точка выглядела так, как если бы она все еще была выровнена и в ортогональной проекции? (Пока камера конечно не сдвинется).

Я думаю о том, как вычислить луч из положения глаза через плоскость z (если это так можно назвать) в точке, в которой я хотел бы, чтобы он появился, и следую за лучом до необходимой глубины. Хотя я не совсем уверен, как это реализовать.


person melps    schedule 05.08.2011    source источник


Ответы (2)


Типичная матрица проекции OpenGL (которую вы получаете от glFrustum или gluPerspective) помещает точку камеры в начало координат. Плоскость проецирования находится в точке (0, 0, -1): одна единица перед камерой.

Итак, для данной вершины вам нужно найти позиции X и Y, которые вы получите для проекции на плоскость (0, 0, -1). Технически это «трассировка лучей», но поскольку это плоскость, выровненная по оси, а камера находится в начале координат, на самом деле это простая арифметика:

vec3 newPosition = oldPosition * (-1.0 / oldPosition.z);

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

Также обратите внимание, что приведенная выше «простая арифметика» не учитывает FOV. Чтобы справиться с этим, вам нужно преобразовать X и Y oldPosition в левую верхнюю часть матрицы перспективы. Или просто извлеките значения 0,0 и 1,1 из матрицы проекции и умножьте их на X и Y oldPosition. Это позаботится о масштабировании.


Еще одно замечание, поскольку вы не указали общую цель этого.

OpenGL не требует, чтобы вы визуализировали всю сцену с помощью одной матрицы проекции. Вы можете визуализировать часть сцены ортогонально, а для остальных использовать матрицу перспективы. Это часто делается в играх, где HUD и текстовые элементы отображаются ортографически, а сама игра находится в трехмерной перспективе.

Если это то, что вы делаете, все, что вам нужно сделать, это что-то вроде следующего:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(...);
glMatrixMode(GL_MODELVIEW);

//Render my perspective stuff here.

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(...);
glMatrixMode(GL_MODELVIEW);

// Render my orthographic stuff here.

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

person Nicol Bolas    schedule 05.08.2011
comment
Отлично - я попробую. На самом деле я пытаюсь создать иллюзию, а не что-то вроде HUD. Затем пользователь может исследовать трехмерное пространство, которое сначала выглядит как двухмерное. - person melps; 06.08.2011

Если вы используете OpenGL, вам не нужно ничего реализовывать / вычислять. Все, что вам нужно сделать, это настроить камеру на ортогональную проекцию с помощью glOrtho, а затем настроить сцену (сетку трехмерных точек).

Позже, когда камера движется, вы можете поймать это событие и «сбросить» камеру на перспективную проекцию, используя glFrustum или gluPerspective. Но убедитесь, что вы действительно этого хотите - резкое изменение проекции не очень хорошо.

Если вы ищете математику проекций камеры, я бы порекомендовал эту ссылку.

http://www.songho.ca/opengl/gl_projectionmatrix.html

person Srinath Sridhar    schedule 05.08.2011
comment
Он не об этом просит. Он хочет знать, как, по сути, делать ложную перспективу. - person Nicol Bolas; 06.08.2011
comment
Тогда что он имеет в виду, когда говорит: (Конечно, пока камера не сдвинется). - person Srinath Sridhar; 06.08.2011
comment
Положение камеры имеет значение для вычислений. Происходит ли это на CPU или GPU, значения не имеет. Он не говорит о рендеринге с перспективной матрицей. Он говорит о рендеринге объекта с ортогональной матрицей, которая выглядит как перспективная проекция. - person Nicol Bolas; 06.08.2011
comment
На самом деле я имел в виду противоположное - визуализировать с перспективной матрицей, но сделать так, чтобы она выглядела как орфографическая. - person melps; 06.08.2011