OpenGL 矩阵 行序 列序

来源:互联网 发布:java api1.6文档下载 编辑:程序博客网 时间:2024/06/07 12:12
  最近进入了OpenGL的学习,感觉内容很有意思,但是毕竟之前没有学习过相关的数学知识,所以遇到很多知识点要去查很多资料反复思考才能慢慢领会,但是这也正是学习的乐趣,通过努力解决掉一个个问题,感觉真是倍爽。  今天就对遇到的矩阵行序和列序左个记录,以便以后查阅。  在进入OpenGL之前,都是用的Windows下的API进行绘图,自己编写的2D渲染管线,这里用的是左手坐标系,设置的矩阵都是按行序优先的,渲染顺序是世界坐标系矩阵,投影矩阵,视口矩阵  但是在进入用OpenGL提供的glut时,老师讲的就与之前的相反了,讲到OpenGL的顺序是视口矩阵,投影矩阵,世界坐标系矩阵,老师叫我们先下去自己查看资料理解,开始查看了一些资料还是一头雾水,但是经过一阵努力后还是终于整明白了,还是印证了毛主席说的一句话:所有资本主义都是纸老虎>_<,呵呵,好像跟这句话有点不搭嘎吧!  还是进入正题,为什么有这种区别呢?原来是与两个的矩阵设置不同有直接关系, d3d行优先,opengl列优先,比如:  比如一个4x4矩阵[m11,m12,m13,m14               m21,m22,m23,m24               m31,m32,m33,m34               m41,m42,m43,m44] 在opengl中这个matrix中数据的顺序是先遍历列的,线性存储为{m11,m21,m31,m41,m12,m22,m32......},这被称为矩阵的列序(column-major)存储,我们使用GlGetfloatv(GL_MODELVIEW_MATRIX,...)等得到的存储矩阵的数组都是按照这样的顺序存储矩阵的。  但是在d3d中这个matrix的存储顺序确实先遍历行的,也就是存储为{m11,m12,m13,m14,m21,m22,m23,m24,m31,......}称为行序(row-major)存储,可能多数人认为这种存储顺序更“自然”,(其实我也这么觉得),这种存储方式也被称为是c-style的,好像是大多数系统里是按照行序存储矩阵的。  矩阵乘法并不关心矩阵是行矩阵还是列矩阵,都是按照第一个矩阵的行去乘以第二个矩阵的列。对于列矩阵而言,这正是其蹩脚的地方,为了保证乘法意义的有效性,其坐标变换顺序跟矩阵乘法顺序恰好相反。  所以OpenGL需要做一次转置,如果是先缩放,再旋转,最后平移,对应的矩阵分别为S、R、T,则d3d的最终矩阵为M = S * R * T,opengl为M = T * R * S,同样的渲染顺序也一样。

查阅资料
http://blog.csdn.net/you_lan_hai/article/details/37992123
http://blog.csdn.net/leonwei/article/details/4318912