我使用的是具有固定函数管道的opengl 2.0。似乎在OpenGL2.0中,他们推动顶点通过模型-视图堆栈,这基本上是(视图矩阵*模型矩阵),其中模型矩阵不提供任何变换,它带来了一个对象,比如说一个立方体,中心在(0,0,0),如果模型视图矩阵有一个单位矩阵,loaded.Also相机本身将位于(0,0,0)向下的负z轴。
因此,如果我对立方体使用翻译调用,我真的是在Eye空间中移动立方体吗?
根据我所了解到的,广义的视图管道是
顶点->建模矩阵->世界空间,世界空间中的对象->查看矩阵->眼睛空间,眼睛空间对象->投影矩阵->裁剪空间,然后规格化等
因此,如果我切换到模型视图矩阵stack() loadidentity () negative (在负z方向上向上5个单位) gldrawcube()
它会根据平移将立方体从眼睛空间的中心移动吗?
我想我的困惑是,当程序启动时,我不知道模型视图矩阵堆栈中加载了什么,我假设它是一个将所有东西都带到眼睛空间中心的单位矩阵。
发布于 2011-10-04 07:11:44
在新创建的OpenGL上下文中,所有矩阵都是相同的,即向量经过未变换。在固定函数中,OpenGL顶点变换跳过了“→”步骤,将对象的世界和世界的→eye折叠为一个变换。不过,这没什么大不了的。无论如何,在眼睛空间中计算光照是最简单的。由于修复了函数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矩阵运算来“定位”您的“相机”,则运算的顺序必须颠倒。由于操作的整体顺序很重要,因此视图转换必须在模型转换之前进行。
https://stackoverflow.com/questions/7639771
复制