Как сделать обратную перспективу с OpenGL?

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

1 ответ

Этот вопрос меня очень заинтриговал. Я не совсем уверен, что то, что я сейчас назову "византийской перспективой", можно учесть с помощью преобразования, аналогичного тому, которое предоставляется (предварительный профиль) 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является оператором 'транспонирования', чтобы прояснить, что это на самом деле вектор- столбец.)

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


Византийская перспектива требует еще одного ограничения - мы будем использовать переменную D, где Z = - D точка, аналогичная "оку" в 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 самолет.


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

Другие вопросы по тегам