Matrix矩阵计算

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

a) 向量的Matrix矩阵变换


三维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];

 

b) Matrix矩阵乘法


注意: 后做的偏移放前面
例如先偏移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),并整体坐标放大两位

 

c) Matrix求逆矩阵

 

求逆矩阵的话,就必须要知道秩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 转载请标明来源)

你可能感兴趣的:(Ogre,算法,绘图)