OpenGL: сочетание ортогональной и перспективной проекций

Я хочу смешать перспективный и ортогональный вид, но не могу заставить его работать.

Я хочу, чтобы координаты X и Y были ортогональными, а координаты Z - перспективными. Для пояснения я добавил эскиз желаемого преобразования координат OpenGL в отображение экрана:

эскиз желаемого вида

(Я начал с руководства, но не смог найти, как получить значения сверху, снизу и т. д.)


person hardmooth    schedule 13.11.2013    source источник
comment
Какую версию OpenGL вы используете? а вы уже используете пользовательские матрицы?   -  person vallentin    schedule 13.11.2013
comment
Вы хотите объединить перспективную матрицу и матрицу сдвига, я считаю ... Я не думаю, что есть команда для построения матрицы сдвига. Придется построить самому.   -  person godel9    schedule 13.11.2013
comment
Координаты на диаграмме выглядят неправильно, у 6 вершин координата x 10.   -  person JWWalker    schedule 13.11.2013
comment
@JWWalker: Я исправил координаты, спасибо за подсказку.   -  person hardmooth    schedule 14.11.2013


Ответы (2)


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

person JWWalker    schedule 14.11.2013
comment
Я пробовал это, и это работает. Как только я выясню, как масштабировать сцену так, чтобы она была максимизирована внутри пирамиды вида, я отправлю это в качестве ответа. - person hardmooth; 19.11.2013

Вероятно, для этого вы могли бы использовать glFrustum.

Если вы используете стандартную матрицу перспективы и камера обращена к коробке спереди, X / Y будут одинаковыми, однако при движении от камеры координаты X / Y будут перемещаться к центру, сжимая их для получения стандартного эффекта параллакса. То, что вы нарисовали, - это движение к верхней части окна. Все, что вам нужно сделать, это обрезать перспективную проекцию ниже стандартного центра. Вот где приходит glFrustum - переместите обычно симметричные аргументы верх / низ вниз, выровняйте матрицу камеры / обзора по желаемой оси, и вы должны получить желаемую проекцию.

Любой поворот камеры / обзора разрушит однородную проекцию в плоскости X / Y. Для движения камеры вы ограничены панорамированием и перемещением glFrustum границ.

EDIT Если подумать, вы, вероятно, могли бы просто добавить glTranslatef(shearX, shearY, 0) перед вызовом gluPerspective и добиться того же.

person jozxyqk    schedule 13.11.2013