1.什么是左乘,什么是右乘?
所谓左/右乘,是指参与运算的两个因子(向量、矩阵)在运算中的相对位置(主语相对宾语的位置),A左乘B即A*B,A右乘B即B*A。因此说左/右乘时,必须指定参与运算的两个因子才是有意义的,有时会省略主语(甚至同时省略主语和宾语),如在OSG中对顶点应用矩阵变换时,使用的是右乘(P*M),完整的说应该是矩阵M右乘向量P;而OpenGL对顶点进行矩阵变换,是使用左乘,即矩阵左乘向量P(M*P)。
左乘也叫做pre-multiply(A.premult(B)==B*A,即B左乘A),右乘也叫做post-multiply(A.postmult(B)==A*B,即B右乘A)。
引用一位网友的解释:左乘就是从左边过来乘,对于A.premult(B),就是参数B要从左边乘过来,即B左乘A,即A.premult(B)==B*A。
2.什么是列主序,什么是行主序?
所谓矩阵的列主序和行主序,是指用一维数组存储二维矩阵元素的时候,是以第一列、第二列的顺,还是以第一行、第二行的顺序。因此,矩阵的主序只是存储(以一维数组传递数据)上的不同,在计算和使用中所代表的数学意义没有任何区别。
C语言中的二维数组a[4][4],可以看作一个4*4的矩阵,并且它是按行主序存储的。因此,在使用列主序矩阵时,可以直接把C语言二维数组作为矩阵使用。
OpenGL中使用列主序矩阵。由于矩阵主序对矩阵的数学意义没有任何影响,因此,说OpenGL使用列主序矩阵,实际上是指在向OpenGL传递矩阵数据时,用来存储矩阵元素的一维数组,是按照列主序定义的!即glLoadMatrix要求的传入参数是按列主序定义的矩阵。