因为之前接触的是虚幻,用的是DX,所以接触的是行矩阵。最近一年接触自研引擎,用的是OpenGL的列矩阵。然而我之前图形基础没打好,以至于很长一段时间没弄清楚涉及到矩阵相关的一些问题。所以乘着自己意识清醒,还是应该梳理一下。
1、什么是行主序和列主序
2、什么时候向量是前乘什么时候是后乘
3、构造旋转位移缩放矩阵时,矩阵乘法应该按照什么样顺序
行主序
r11 r12 r13 0
r21 r22 r23 0
r31 r32 r33 0
tx ty tz 1
其实记住行主序只要记住矩阵中,表示平移的3个分量是在一行就是行主序。行主序需要用向量去前乘来完成变化,即Vector4*Mat。一般为了节省矩阵存储的内存开销,我们只存储左边4*3的部分,默认最后一列是0 0 0 1
列主序
r11 r21 r31 tx
r12 r22 r32 ty
r13 r23 r33 tz
0 0 0 1
列主序其实就是将行主序的内容直接进行转置,这样平移的3个分量就是在一列了,就是列矩阵。列主序需要用向量去后乘来完成变化,即Mat*Vector4。一般为了节省矩阵存储的内存开销,我们只存储上边3*4的部分,默认最后一行是0 0 0 1
GLSL矩阵构造
CPU传给GPU的顺序 M00、M01、M02、M03...
GLSL中接收并构造的顺序
M00 M10 M20 M30
M01 M11 M21 M31
M02 M12 M22 M32
M03 M13 M23 M33
下面的m03对应上面M03的位置,很容易误写成Mat[3][0]来取值,实际应该是如下写法
float m03 = Mat[0][3];
https://cloud.tencent.com/developer/article/1504864 GLSL矩阵语法
构造矩阵时的乘法顺序
无论是行矩阵还是列矩阵在做乘法的时候,都是当前状态的矩阵前乘以另一个矩阵。例如我先平移再旋转,就是RT
因为矩阵乘法是不满足交换律,也就意味着矩阵相乘时需要按指定顺序才能达到我们的目的。当我们有旋转位移缩放信息想构造矩阵时,我们可以按照RST或者SRT的方式去构造,意味着先旋转再缩放和先缩放再旋转的结果是一样的。而先旋转再平移和先平移再旋转结果是不一样的,因为旋转过后坐标系就变了,就会按照旋转过后的坐标系去平移。所以我们都是先移动再旋转缩放,或者先移动再缩放旋转。但是矩阵相乘的时候是反方向也就是T再后面,所以这也是经常会搞混的点。对于这部分详细的解释可以参考这篇博客,我觉的写的就挺清晰