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