矩阵与标量的乘法
每个元素与标量相乘
矩阵相乘
只有第一个矩阵的列数与第二个矩阵的行数相同,才可以相乘。新矩阵行数为第一个矩阵行数,列数为第二个矩阵的列数。
Axy * Byz = Cxz
新矩阵第i行,第j列的元素值为,第一个矩阵第i行的元素分别与第二个矩阵第j列的元素对应相乘后的和。
Cij = Ai1*B1j + Ai2*B2j + ... + Ain * Bnj
运算法则:
- 矩阵乘法不满足交换率
A * B != B * A
- 矩阵乘法满足结合率
A * B * C = A * ( B * C )
方块矩阵
行列数相同的矩阵称
对角元素
方块矩阵中那些行列数相同的元素
对角矩阵
除了对角元素外的其它元素都为0
单位矩阵
对角元素都为1的对角矩阵,任何矩阵与单位矩阵相乘都为自身。
I * M = M
M * I = M
// 对于方阵有
I * M = M * I = M
转置矩阵
交换行列元素,即把第i行变为第i列或把第j列变为第j行。
转置矩阵性质
- 矩阵转置的转置等于原矩阵
- 矩阵串接的转置等于反向串接各矩阵的转置
�逆矩阵
只有方阵才有可能有逆矩阵,而只有行列式不为0的方阵才有逆矩阵,此时的方阵称为可逆的,或者说是非奇异的。
逆矩阵的性质
- 逆矩阵的逆矩阵是原矩阵
- 单位矩阵的逆矩阵是它本身
- 转置矩阵的逆矩阵是逆矩阵的转置
- 矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵
逆矩阵的意义
使用逆矩阵可以还愿一个变换
正交矩阵
如果一个方阵的转置矩阵与逆矩阵相同,即方阵与其转置矩阵相乘为单位矩阵,则称这个矩阵是正交的。
通常逆矩阵求解计算量较大,如果当前矩阵是正交的,那么计算出其转置矩阵即为其逆矩阵。
线性变换
指那些可以保留矢量加和标量乘的变换。
f(x) + f(y) = f(x+y)
kf(x) = f(kx)
常见的线性变换有,缩放,旋转,镜像,正交投影。
仅使用3X3矩阵就可以表示一个线性变换。
仿射变换
平移变换不是线性变换,而仿射变换合并了线性变换与平移变换。
需要使用4X4矩阵才可以表示。
齐次坐标
为了使用仿射变换,我们将三维矢量转换为四维矢量,也就是齐次坐标。
如何将一个三维坐标点转换到齐次坐标系呢?
w = 1,这样平移分量乘以w就为平移量。如何将一个三维矢量转换到齐次坐标系呢?
w = 0,这样平移分量乘以w就为零了,这样才能保证对矢量平移没有意义。
基础变换矩阵
纯平移,纯旋转,纯缩放的矩阵。
平移矩阵
平移矩阵不是正交的。
-
对一个点进行平移变换
对一个矢量进行平移变换
会发现,对一个矢量进行平移变换,没有任何效果。而且矢量的齐次坐标w分量一定要设为0,否则会影响矢量的计算结果。
缩放矩阵
缩放矩阵一般不是正交的。
- 对点进行缩放变换
- 对矢量进行缩放变换
如果缩放系数Kx=Ky=Kz,则这样的缩放称为统一缩放,否则为非统一缩放。统一缩放即为等比缩放,不会破坏目标的比例,角度。对矢量,法线等使用非统一缩放会破坏其角度。
-
缩放矩阵的逆矩阵
image.png
以上缩放矩阵只适用于当前坐标轴方向进行缩放,如果我们希望在任意方向进行缩放,就需要使用一个复合变换。思路为,先将缩放轴变换为标准坐标轴,然后进行沿坐标轴的缩放,再使用逆变换得到原来的缩放轴朝向。
旋转矩阵
-
饶坐标轴X旋转
-
绕坐标轴Y旋转
-
绕坐标轴Z旋转
旋转矩阵的逆矩阵是旋转相反的角度得到的变换矩阵。
旋转矩阵是正交的,而且多个旋转矩阵间的串联同样是正交的。
复合变换
由于矩阵乘法不满足交换率,所以不同顺序的变换结果是不同的。我们约定:先缩放,再旋转,最后再平移。
M = Mtranslation * Mrotation * Mscale
除了需要注意不同类型的变换顺序外,还要小心旋转的变换顺序。比如,当我们需要进行旋转(θx,θy,θz)时,按什么顺序进行旋转呢?
Unity中,按照zxy的顺序旋转,所以旋转组合矩阵为:
M = Mrz * Mrx * Mry
这里颠倒了前后顺序,而是不是:
M = Mry * Mrx * Mrz
这是因为,颠倒后,在是否旋转坐标轴的两种情况下,按yxz,zxy顺序旋转得到的结果一致。Unity使用了不旋转坐标轴的zxy顺序。