三维Matrix通常是四行四列的entry[4][4]: 实际使用的是三行四列,最后行为补充行
[A00,A01, A02, A03]
[A10,A11, A12, A13]
[A20,A21, A22, A23]
[0, 0, 0, 1 ]
向量相当于
[X]
[Y]
[Z]
[1]
一个三维向量计算的时候:
Matrix3d * vec3dOrg = Vec3dNew
Vec3dNew.x = vec3dOrg.x * matrix3d.entry[0][0] + vec3dOrg.y * matrix3d.entry[0][1] + vec3dOrg.z * matrix3d.entry[0][2] + matrix3d.entry[0][3];
Vec3dNew.y = vec3dOrg.x * matrix3d.entry[1][0] + vec3dOrg.y * matrix3d.entry[1][1] + vec3dOrg.z * matrix3d.entry[1][2] + matrix3d.entry[1][3];
Vec3dNew.z = vec3dOrg.x * matrix3d.entry[2][0] + vec3dOrg.y * matrix3d.entry[2][1] + vec3dOrg.z * matrix3d.entry[2][2] + matrix3d.entry[2][3];
注意: 后做的偏移放前面
例如先偏移M1,再旋转M2,复合矩阵 = M2 * M1
矩阵相乘的时候,效果如下,结果为
Cij = 求和(k=1..n) AikBkj
[A11,A12, A13, A14]
[A21,A22, A23, A24]
[A31,A32, A33, A34]
[0, 0, 0, 1 ]
*
[B11,B12, B13, B14]
[B21,B22, B23, B24]
[B31,B32, B33, B34]
[0, 0, 0, 1 ]
结果为
Cij = 求和(k=1..n) AikBkj
---前两列
A11 * B11 + A12 * B21 + A13 * B31, A11 * B12 + A12 * B22 + A13 * B32,
A21 * B11 + A22 * B21 + A23 * B31, A21 * B12 + A22 * B22 + A23 * B32,
A31 * B11 + A32 * B21 + A33 * B31, A31 * B12 + A32 * B22 + A33 * B32,
0, 0
---后两列
A11 * B13 + A12 * B23 + A13 * B33, A11 * B14 + A12 * B24 + A13 * B34
A21 * B13 + A22 * B23 + A23 * B33, A21 * B14 + A22 * B24 + A23 * B34,
A31 * B13 + A32 * B23 + A33 * B33, A31 * B14 + A32 * B24 + A33 * B34,
0, 1
例如: 放大矩阵 与 位移矩阵相乘 相当于先位移再放大(先做的偏移放后面乘)
[2,0,0,0] // 以0,0,0为基点放大两倍
[0,2,0,0]
[0,0,2,0]
[0,0,0,1]
[1,0,0,-6] // x.y各位移6
[0,1,0,-6]
[0,0,1,0]
[0,0,0,1]
结果为:
[2,0,0,-12]
[0,2,0,-12]
[0,0,2,0]
[0,0,0,1]
如果乘以向量(0,0,0)得到的结果是(12,12,0),相当于(0,0,0)点位移(6,6,0),并整体坐标放大两位
求逆矩阵的话,就必须要知道秩det的概念
1.矩阵的秩
Det为组合矩阵单元生成的一个数
二维情况
[A11 A12]
[A21, A22]
detA = A11 * A22 – A12 * A21
N维情况
[A11,A12, A13]
[A21,A22, A23]
[A31,A32, A33]
通过行求
detA = 求合(j=1..n) (-1)^(j+k) Ajk det[A]jk
例如: 三阶时detA = A11 * (A22 * A33 – A23 * A32) - A12 * (A21 * A33 – A23 * A31) + A13 * (A21 * A33 – A23 * A31)
通过列求
detA = 求合(k=1..n) (-1)^(j+k) Ajk det[A]jk
例如: 三阶时detA = A11 * (A22 * A33 – A23 * A32) – A21 * (A12 * A33 – A13 * A32) + A31 * (A12 * A23 – A13 * A22)
注: det[A]jk 为去掉 j行 k列后形成的 n-1阶矩阵的秩
2. 求逆矩阵-通过秩
Mjk = (-1)^(j+k) * det[A]kj / detA
注: det[A]kj 为去掉k行j列后形成的秩
detA为矩阵A的秩
注: detA不能为0,否则矩阵没有逆矩阵
3. 求逆矩阵-通过自然变换
通过例如
第1行 = 第1行 + 第三行 * 2
第1列 = 第1列 – 第二列
第2列 = 第2列 / 2;
类似方向,
1. 把A矩阵通过多次变换 单位矩阵
2. 同理,把单位矩阵经历相同的变换,单位矩阵就会成为A的逆矩阵 (A)^-1
原理就是
A * A^(-1) = 单位矩阵
A * P1 * P2 * P3 ..* Pn = 单位矩阵
则
A^(-1) = P1 * P2 * P3 ..*Pn = 单位矩阵 * P1 * P2 * P3 ..*Pn
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)