Ортогональный расчет в перспективе - PullRequest
3 голосов
/ 06 августа 2011

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

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

Ответы [ 2 ]

0 голосов
/ 06 августа 2011

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

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

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

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

Также обратите внимание, что вышеприведенная «простая арифметика» не учитывает 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.

Возможно, вы захотите отключить тесты глубины во время орфографической визуализации, если у вас есть орто-объекты, которые перекрывают перспективные.

0 голосов
/ 06 августа 2011

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

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

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

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

...