OpenGL ModelView Confusion - PullRequest
       0

OpenGL ModelView Confusion

0 голосов
/ 03 октября 2011

Я использую opengl 2.0 с конвейером фиксированных функций. Похоже, что в OpenGL 2.0 они проталкивают вершины через стек представления модели, который в основном (матрица представления * матрица модели), в котором матрица модели не обеспечивает какого-либо преобразования, на самом деле приводит объект, скажем, к центру куба (0,0,0 ) если в матрицу вида модели загружена единичная матрица. Кроме того, камера будет расположена в точке (0,0,0), смотря вниз по отрицательной оси Z.

Так что, если я использую перевод вызова с кубом, я действительно перемещаю куб в пространстве Глаза?

Из того, что я узнал, обобщенный конвейер просмотра -

Вершины -> Матрица моделирования -> Мировое пространство, Объекты в мировом пространстве -> Матрица просмотра -> Глазное пространство, Объекты космического глаза -> Матрица проекции -> Отсечение, затем нормализация и т. Д.

Так что, если я переключусь на стек матрицы вида модели () loadidentity () gltranslate (до 5 единиц в отрицательном направлении z) gldrawcube ()

это переместит куб из центра глазного пространства в соответствии с переводом?

Я думаю, что моя путаница заключается в том, что я не знаю, что загружается в стек матриц вида модели при запуске программы, я предполагаю, что это единичная матрица, которая переносит все в центр глазного пространства.

1 Ответ

2 голосов
/ 04 октября 2011

Во вновь созданном контексте OpenGL все матрицы являются идентичными, то есть векторы проходят через нетрансформированные. В фиксированной функции преобразование вершин OpenGL пропускает шаг «мир», объединяя объект → мир и мир → глаз в одно преобразование. Это не имеет большого значения, однако. Расчеты освещения в любом случае проще всего проводить в пространстве глаз. А поскольку фиксированная функция OpenGL не знает шейдеров (кроме как расширений), нет необходимости делать что-то в мировом пространстве.

glTranslate, glRotate, glScale не трансформировать объекты. Они манипулируют матрицей сверху стека, активной для манипуляций. Таким образом, в конечном итоге они способствуют преобразованию, но не на объекте, а на уровне вершины (позиции).

это переместит куб из центра глазного пространства в соответствии с переводом?

Действительно, но то, что «перемещено» (фактически трансформировано), это вершины куба; и это может быть не просто перевод.

РЕДАКТИРОВАТЬ согласно комментарию

Ключевым моментом, который нужно понять, является композиция трансформации. В первую очередь преобразование - это отображение

T: R^4 -> R^4, v' = v |-> T(v)

Существует подмножество преобразований, а именно линейные преобразования, которые могут быть представлены матричным умножением:

v' = T * v

можно объединить преобразования, т.е. v = v |-> T'○T (v) снова для подмножества линейных преобразований, записанных в матричной форме, вы можете расширить это до

v' = T * v
v'' = T' * v'

=>

v'' = T' * T * v

Теперь пусть V обозначает преобразование просмотра, а W преобразование мира. Таким образом, общее преобразование составляет

M = V * W

Порядок умножения матриц имеет значение (то есть умножение матриц не является коммутативным):

∃ M, N ∊ {Matrices}: M * N ≠ N * M

Преобразование вида V - это преобразование всего мира таким образом, что оно перемещается таким образом, что камера в мире оказывается в начале координат, смотря вниз по отрицательной оси Z. Итак, пусть V' будет преобразованием, которое перемещает «камеру» от источника в его месте в мире, обратное этому движению перемещает мир таким образом, что камера останавливается в источнике. Итак

V = inv(V')

И последнее, но не менее важное: некоторые матрицы A, B, C, для которых выполняется

A = B * C

тогда

inv(A) = inv(C) * inv(B)

т.е. порядок операций обратный. Поэтому, если вы «позиционируете» свою «камеру», используя обратные матричные операции OpenGL, порядок операций должен быть обратным. А поскольку общий порядок операций имеет значение, преобразования просмотра должны произойти до преобразования модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...