因为长时间不使用矩阵,会经常对一些概念有混淆,现记录如下,大量自己的不专业理解:
1. 矩阵元素在内存中存储顺序不受影响的原因。
DX采用的是行优先,OPENGL采用的是列优先,但是矩阵元素在内存中的存储位置确是(巧合的)一致,这是因为矩阵乘法的特性导致的。
首先对于一个齐次坐标(x, y, z, 1)来说,
DX是行优先,所以它是一个1行4列的矩阵,记为1 x 4
OPENGL是列优先,所以他是一个4行一列的矩阵,记为4 x 1
我们的变换矩阵是4 x 4的,因为矩阵的乘法规则,所以
DX中,变换乘法,必须将4 x 4的矩阵后置,这样才是合法的乘法规则 1 x 4 * 4 x 4.
OPENGL中,必须将4 x 4的矩阵前置,这样才是合法的乘法规则 4 x 4 * 4 x 1.
这也是两个标准下,乘法顺序的根本原因。
因为矩阵乘法是用左边矩阵的行乘以右边矩阵的列
而DX的矩阵排列为
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
所以优先参与运算的是 0 4 8 12 这一列(DX中,矩阵在后面,所以是列先参与)
Opengl的矩阵排列为
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15
所以优先参与运算的是 0 4 8 12 这一行(OPENGL中,矩阵在前面,所以行先参与)
由于结果都是一样的,所以,内存中的存储顺序是一致的。可以理解为,由于矩阵在乘法中的位置相反,恰好抵消了矩阵转置带来的影响。
2. 矩阵乘法的几何意义
百度上大部分答案就是代表一次变换。
我想从坐标系变换的角度来解释。
局部坐标转世界坐标,就用局部坐标乘以所在矩阵(既然是局部坐标,必然存在一个所在的矩阵)。
世界坐标转局部坐标,就用世界坐标乘以矩阵的逆。
点乘以一个矩阵,得到的是,将这个点所在的坐标系,变换成矩阵的样子以后,这个点的新世界坐标。并且老世界坐标和老世界矩阵的对应关系 与 新世界坐标和当前矩阵的相对关系,是一样的。这也是所谓的一次变换。其实只是坐标系的直接变化。
3. 视图矩阵的含义
视图矩阵的定义应该是:任何一个点乘以视图矩阵以后,会得到视空间的坐标,也就是某一个矩阵下的局部坐标。
根据之前提到的,世界坐标转局部坐标规则,其实视图矩阵是相机所在矩阵的逆矩阵。