Почему знак имеет значение в opengl матрице проекции

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

Спасибо!

13
задан Kyle Simek 18 February 2010 в 05:31
поделиться

3 ответа

Ну, суть проверка отсечения выполняется посредством:

-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c

Умножение на отрицательное значение прерывает этот тест.

10
ответ дан 2 December 2019 в 00:58
поделиться

Я только что нашел этот лакомый кусочек, который приближается к ответу:

Из Красной книги, приложение G:

Избегайте использования отрицательных координат вершины w и отрицательных координат текстуры q. OpenGL может неправильно обрезать такие координаты и может делать ошибки интерполяции при затенении примитивов, определенных такими координатами.

Инвертирование матрицы проекции приведет к отрицательной координате отсечения W, и, очевидно, opengl это не нравится. Но может ли кто-нибудь объяснить, ПОЧЕМУ opengl не обрабатывает этот случай?

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

2
ответ дан 2 December 2019 в 00:58
поделиться

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

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

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

В разделе OpenGL FAQ по преобразованиям есть некоторые подробности.

0
ответ дан 2 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: