本篇文章承接上文:乱弹OpenGL中的矩阵变换(上) 。上篇中,我尝试从一种不太成熟的OpenGL世界观(注意,或许也是3D渲染世界的世界观)来认识这个OpenGL世界,向自己澄清了一些概念(尽管不够高清)。这里我想继续从矩阵数学的角度想一想:究竟模型位置怎么在世界中各个空间的坐标系统中“转换”?——ZwqXin.com
本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
原文地址:http://www.zwqxin.com/archives/opengl/opengl-matrix-what-2.html
OpenGL中的坐标系是右手坐标系,矩阵按列优先存储。这很让人混乱,因为线代里接触的都是行优先存储,突然就这么column-major了.....最初还窃认为该不该从向量角度让头脑清晰,后来看别人文章说这跟向量没啥关系,完全是一种规范:如同右手坐标系,只是一种规范。好吧,列就列啦:
mt0 mt4 mt8 mt12
mt1 mt5 mt9 mt13
mt2 mt6 mt10 mt14
mt3 mt7 mt11 mt15
有点怪是不?当然啦,连C语言学2维数组时都是row-major的,OpenGL却是先一竖下来,再来下一竖(column-major)...(考虑一块内存,第一个格子存mt0,第二存mt1.....)这就是OpenGL矩阵存储方式。上篇提到,模型变换(Mode-Translation),视图变换(View-Translation)乃至投影变换,这些决定了各个空间之不同的"针对坐标系的变换",实质产生出来的是一个左乘矩阵,这些矩阵就是这样存储的。如果你看过任何一本3D图形学的入门书前两章,那你应该知道模型变换(在OpenGL中反映为glTranslate,glScale,glRotate)所使用的矩阵。譬如我这里先让苹果绕z轴逆转个角度Θ,再让它变成原大小的A倍,再右移10单位:(P.S.翻译成OpenGL世界的语言:在模型空间坐标系确定的位置基础上,让世界空间坐标系绕z轴顺转角度Θ,坍缩成原来一半大小,并左移10单位,注意是坍缩后1单位表示的长度跟之前的不一样了。)
A*cosΘ-A*sinΘ0