Во вновь созданном контексте 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, порядок операций должен быть обратным. А поскольку общий порядок операций имеет значение, преобразования просмотра должны произойти до преобразования модели.