Ответ 1
Ну, суть в том, что тестирование отсечения выполняется с помощью:
-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c
Умножение на отрицательное значение нарушает этот тест.
Я работаю над проблемой компьютерного зрения, которая требует рендеринга 3d-модели с помощью откалиброванной камеры. Я пишу функцию, которая разбивает калиброванную матрицу камеры на матрицу модели и матрицу проекций, но я столкнулся с интересным явлением в opengl, которое бросает вызов объяснению (по крайней мере, мной).
Краткое описание состоит в том, что отрицание матрицы проекций приводит к тому, что ничего не отображается (по крайней мере, в моем опыте). Я ожидал бы, что умножение матрицы проекции на любой скаляр не будет иметь никакого эффекта, потому что оно преобразует однородные координаты, на которые не влияет масштабирование.
Ниже приведены мои рассуждения, почему я считаю это неожиданным; может быть, кто-то может указать, где мои рассуждения испорчены.
Представьте себе следующую перспективную матрицу проекций, которая дает правильные результаты:
[ a b c 0 ]
P = [ 0 d e 0 ]
[ 0 0 f g ]
[ 0 0 h 0 ]
Умножение этого на координаты камеры дает однородные координаты клипа:
[x_c] [ a b c 0 ] [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c] [ 0 0 f g ] [Z_e]
[w_c] [ 0 0 h 0 ] [W_e]
Наконец, чтобы получить нормализованные координаты устройства, мы разделим x_c, y_c и z_c на w_c:
[x_n] [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n] [z_c/w_c]
Теперь, если мы отрицаем P, полученные координаты клипа должны быть сведены на нет, но поскольку они являются однородными координатами, умножение на любой скаляр (например, -1) не должно оказывать никакого влияния на результирующие нормированные координаты устройства. Однако в openGl отрицание P приводит к тому, что ничего не отображается. Я могу умножить P на любой неотрицательный скаляр и получить точно такие же визуализированные результаты, но как только я умножусь на отрицательный скаляр, ничего не отображает. Что здесь происходит?
Спасибо!
Ну, суть в том, что тестирование отсечения выполняется с помощью:
-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c
Умножение на отрицательное значение нарушает этот тест.
Я просто нашел этот лакомый кусочек, который продвигается к ответу:
Из Красной книги, приложение G:
Избегайте использования отрицательных w-вершинных координат и отрицательных q текстурных координат. OpenGL может не скопировать такие координаты правильно и может сделать ошибки интерполяции при затенении примитивов, определенных такими координатами.
Инвертирование матрицы проекции приведет к отрицательной координате отсечения W, и, очевидно, opengl не нравится. Но может ли кто-нибудь объяснить, почему opengl не справляется с этим делом?
Причины, о которых я могу думать:
Кроме того, поскольку вы упомянули использование матрицы камеры и что вы перевернули матрицу проекции, я должен спросить... к каким матрицам вы применяете то, что из матрицы камеры? Работа над матрицей проецирования save near/far/fovy/aspect вызывает всевозможные проблемы в буфере глубины, включая все, что использует z (тестирование глубины, удаление лица и т.д.).
В разделе "Вопросы по OpenGL" на transformations содержится более подробная информация.