Вопрос

Я работаю над проблемой компьютерного зрения, которая требует рендеринга 3d-модели с помощью откалиброванной камеры.Я пишу функцию, которая разбивает калиброванную матрицу камеры на матрицу modelview и матрицу проекции, но я столкнулся с интересным явлением в 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 не обрабатывает этот случай?

ссылка: http://glprogramming.com/red/appendixg.html

Причины, которые я могу придумать:

  • При инвертировании матрицы проекции координаты больше не будут находиться в пределах ваших плоскостей zNear и zFar усеченного изображения (обязательно больше 0).
  • Чтобы создать координаты окна, нормализованные координаты устройства преобразуются / масштабируются видовым экраном.Итак, если вы использовали отрицательный скаляр для координат клипа, нормализованные координаты устройства (теперь инвертированные) преобразуют область просмотра в координаты окна, которые являются...за пределами вашего окна (слева и ниже, если хотите)

Кроме того, поскольку вы упомянули об использовании матрицы камеры и о том, что вы инвертировали матрицу проекции, я должен спросить...к каким матрицам вы применяете что из матрицы камеры?Работа с матрицей проекции, за исключением near / far / fovy / aspect, вызывает всевозможные проблемы в буфере глубины, включая все, что использует z (тестирование глубины, отбраковка граней и т.д.).

Раздел часто задаваемых вопросов OpenGL о преобразования имеет еще несколько деталей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top