Я работаю над проблемой компьютерного зрения, которая требует рендеринга 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 на любую неотрицательную скалярную величину и получить точно такие же результаты визуализации, но как только я умножу на отрицательную скалярную величину, ничего не будет визуализировано. Что здесь происходит??
Спасибо!