Как сделать обратную перспективу с OpenGL? - PullRequest
1 голос
/ 24 марта 2020

Я ищу способ сделать обратную перспективу с OpenGL и C ++. Сейчас я использую glFrustum, чтобы иметь классическую c перспективу, но я хотел бы знать, возможна ли обратная перспектива, представленная здесь (https://en.wikipedia.org/wiki/Reverse_perspective и ниже)? Если нет, есть ли другой способ с OpenGL сделать это?

enter image description here

1 Ответ

1 голос
/ 25 марта 2020

Этот вопрос действительно заинтриговал меня. Я не совсем уверен, что то, что я сейчас буду называть «византийской перспективой», может быть приспособлено преобразованием, аналогичным тому, которое обеспечивает (профиль до ядра) glFrustum. Я проделал некоторую работу над ним, вдохновленный деривациями в Computer Graphics: Principles and Practice (2nd Ed) и формулировкой для OpenGL CCS / NDCS.

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


До сих пор я вывел матричное преобразование, в результате чего иногда его называют "нормализованным усечением ». Дальняя плоскость в Z = -1, ближняя плоскость в Z = - N / F и плоскости R, L, T, B, имеющие единичный наклон. (это было бы очень ясно при хорошей диаграмме)

[ 2N / (R - L)      0        (R + L) / (R - L)     0     ]
[       0      2N / (T - B)  (T + B) / (T - B)     0     ]
[       0           0                1             0     ]
[       0           0                0             F     ]

Назовите эту матрицу: [F.p]. Для любой точки: P = (x, y, - N, 1)^T на ближней плоскости легко показать, что преобразованная однородная точка лежит на плоскости Z = - N / F. (Примечание: ^T является оператором «транспонирования», чтобы дать понять, что на самом деле это вектор column .)

Аналогично, с учетом точки: P = (x, y, - F, 1)^T на дальней плоскость, преобразованные однородные точечные линии на плоскости Z = -1.


Византийская перспектива требует другого ограничения - мы будем использовать переменную D, где Z = - D - точка, аналогичная 'eye' в Z = 0, или 'контрольная точка проекции' ( PRP ).

Как вы уже собрали из предоставленного вами изображения, параллельные линии сходятся в Z = - D, а не на «глаз». Однако вам не нужно изображение с точки схождения. Вы хотите визуализировать эффект «спереди». Вопрос в том, можем ли мы построить матрицу OpenGL, аналогичную той, которая предоставляется glFrustum, что дает византийскую перспективу? И можно ли сделать его вписанным в конвейер GL?

То, что я до сих пор получил, это «нормализованный византийский усеченный конус». Опять же, дальняя плоскость находится в Z = -1, ближняя плоскость в Z = - N / F, а плоскости R, L, T, B имеют наклон на единицу - хотя и отрицательный наклон обычного усеченного конуса. (опять ясная картинка будет стоить тысячи слов)

[ 2N / (R - L)      0        (R + L) / (R - L)     0     ]
[       0      2N / (T - B)  (T + B) / (T - B)     0     ]
[       0           0              N / F           0     ]
[       0           0                0             N     ]

Назовите эту матрицу: [F.b]. Преобразования координат X,Y идентичны, но преобразования компонентов Z,W отличаются. Это несколько интуитивно, учитывая, что это, в некотором смысле, «обратный» ортодоксальный объем обзора.

Опять же, учитывая точку: P = (x, y, - N, 1)^T на ближней плоскости, преобразованная однородная точка лежит в плоскости Z = - N / F, а однородное преобразование точки: P = (x, y, - F, 1)^T в дальней плоскости лежит в плоскости Z = -1.


Учитывая сходства в матрицах, и тот факт, что для получения параллельных проекционных матриц, которые соответствуют координатному пространству клипа OpenGL (CCS) и его проекции NDCS, требуются только простые перспективные преобразования (и несколько тривиальных матриц масштабирования и перевода), представляется вероятным, что OpenGL «Византийский» проекция может быть сделано на работу. Мне просто нужно больше времени, чтобы поработать над этим ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...