OpenGL矩阵转置测试——禁止转载

来源:互联网 发布:glassfish linux安装 编辑:程序博客网 时间:2024/06/09 03:50

一直没有找到很好的解释,或者解释复杂简短,还是自己动手测试一下,测试步骤如下:

1.输入glTranslatef(0.1,0.1,0.0);

得到的GL_MODELVIEW_MATRIX的值为:

 

说明变换矩阵变换的是12,13,14,15这几个变量,问题又产生了,12,13,14,15又是最后一行还是最后一列呢?

2.输入 

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 GLfloat mat[] = {//检验矩阵的存储形式,
  1.0, 0.0, 0.0, 1.0,
  0.0, 1.0, 0.0, 0.0,
  0.0, 0.0, 1.0, 0.0,
  0.0, 0.0, 0.0, 1.0
 };
 glMultMatrixf(mat);
 GLfloat Test[16];
 glGetFloatv(GL_MODELVIEW_MATRIX,Test);

得到如下结果图:

 

说明在内存当中还是按行存储的。要不然Test【3】== 0.0,

改动代码如下:

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glTranslatef(0.1,0.1,0.0);
 GLfloat mat[] = {//检验矩阵的存储形式,
  1.0, 0.0, 0.0, 1.0,
  0.0, 1.0, 0.0, 0.0,
  0.0, 0.0, 1.0, 0.0,
  0.0, 0.0, 0.0, 1.0
 };
 glMultMatrixf(mat);
 GLfloat Test[16];
 glGetFloatv(GL_MODELVIEW_MATRIX,Test);

 

这里就出问题了:

 假如按前两部的内存进行相乘,我们可以计算得到的矩阵应该是:T * mat = C

1      0     0   0        1   0  0  1      1    0     0    1

0      1     0   0   *   0   1  0  0  =  0    1     0    0

0      0     1   0        0   0  1  0      0    0     1    0 

0.1  0.1   0   1        0   0  0  1      0.1  0.1  0   1.1

我们发现差距如此之大??怎样才能得到内存中的结果呢?

研究发现,要使得,Test【0】=1.1,唯一的方法是 T的转置 * mat的转置 = Test的转置

所以最后内存中存的结果也是经过OpenGL内部转置而成的。

经过以上总结,OpenGL的列存储真是瞎鸡巴扯,搞死神仙,你载入的矩阵在内存还是按行存储的,它所谓的列存储是当你载入矩阵时,会在相乘的时候自动解析为按列扫描,这样两个矩阵相乘时就会变为 A的第一列 * B的第一行 = 第一个元素,A的第二列 * B的第第一行 =第二个元素(注意,我说的是内存当中的第一个第二个元素,一次类推)

为了避免过长让你灰心,先冷静一下,想明白一下,下一节讨论一下如何矩阵转换。

 

 

 

 

原创粉丝点击