1. 矩阵乘法
一个r×n的矩阵A和一个n×c的矩阵B相乘,它们的结果AB将会是一个r×c大小的矩阵,不满足此规则不能相乘
矩阵乘法满足一些性质
- 矩阵乘法不满足交换律
即AB≠BA - 矩阵乘法满足结合律
(AB)C=A(BC)
2. 特殊矩阵
-
方块矩阵
指行和列数目相等的矩阵,最常用的是3×3和4×4方阵,如果一个矩阵除了对角元素外的所有元素都为0,那么这个矩阵就叫对角矩阵 -
单位矩阵
一个特殊的对角矩阵是单位矩阵,一个3×3的单位矩阵如下
任何矩阵和单位矩阵相乘的结果都是原来的矩阵
-
转置矩阵
给定一个r×c矩阵M,转置为 M T M^T MT,这是一个c×r的矩阵
其有两个性质
性质一:矩阵转置的转置等于原矩阵
性质二:矩阵串接的转置,等于反向串接各个矩阵的转置,即
( A B ) T (AB)^T (AB)T= B T B^T BT A T A^T AT -
逆矩阵
不是所有矩阵都有逆矩阵,前提是该矩阵必须是一个方阵
满足 M M M M − 1 M^{-1} M−1= M − 1 M M^{-1}M M−1M= I I I
其有四个性质
性质一:逆矩阵的逆矩阵是原矩阵本身
( M − 1 ) − 1 = M (M^{-1})^{-1}=M (M−1)−1=M
性质二:单位矩阵的逆矩阵是它本身
I − 1 = I I^{-1}=I I−1=I
性质三:转置矩阵的逆矩阵是逆矩阵的转置
( M T ) − 1 (M^T)^{-1} (MT)−1= ( M − 1 ) T (M^{-1})^T (M−1)T
性质四:矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵
( A B ) − 1 = B − 1 A − 1 (AB)^{-1}=B^{-1}A^{-1} (AB)−1=B−1A−1 -
正交矩阵
如果一个方阵 M M M和它的转置矩阵的乘积是单位矩阵的话,这个矩阵就是正交的
M M T = M T M = I MM^{T}=M^{T}M=I MMT=MTM=I
如果一个矩阵是正交的,那么它的转置矩阵和逆矩阵是一样的
M T = M − 1 M^{T}=M^{-1} MT=M−1
3. 行矩阵还是列矩阵
在Unity中,常规做法是把矢量放在矩阵右侧,即把矢量转换成列矩阵来进行运算,这意味着,矩阵乘法通常是右乘
C B A v = ( C ( B ( A v ) ) ) CBAv=(C(B(Av))) CBAv=(C(B(Av)))
阅读顺序从右往左,上面等价于
v A T B T C T = ( ( ( v A T ) B T ) C T ) vA^{T}B^{T}C^{T}=(((vA^{T})B^{T})C^{T}) vATBTCT=(((vAT)BT)CT)
4. 矩阵变换
-
变换
线性变换指那些可以保留矢量加和标量乘的变换,即
f ( x ) + f ( y ) = f ( x + y ) f(x)+f(y)=f(x+y) f(x)+f(y)=f(x+y)
k f ( x ) = f ( k x ) kf(x)=f(kx) kf(x)=f(kx)
缩放就是一种线性变换,旋转也是,对于线性变换来说,如果要对一个三维矢量进行变换,那么仅仅3x3的矩阵就可以表示所有线性变换,线性变换除了旋转和缩放,还包括错切,镜像,正交投影等
平移变换不是一个线性变换,这样,就有了仿射变换,就是合并线性变换和平移变换的类型,仿射变换可以用一个4x4的矩阵表示,为此,需要把矢量扩展到四维空间下,这就是齐次坐标空间 -
齐次坐标
对于一个点,从三维坐标转换成齐次坐标是把其 w w w分量设为1,而对于方向矢量来说,需要把其 w w w分量设置为0
我们把表示纯平移,纯旋转,纯缩放的的变换矩阵叫做基础变换矩阵,一个基础变换矩阵可以分解成4个部分:
[ M 3 × 3 t 3 × 1 0 1 × 3 1 ] \begin{bmatrix} M_{3×3}& t_{3×1}\\ 0_{1×3}& 1\\ \end{bmatrix} [M3×301×3t3×11]
左上角的矩阵 M 3 × 3 M_{3×3} M3×3用于表示旋转和缩放, t 3 × 1 t_{3×1} t3×1表示平移, 0 1 × 3 0_{1×3} 01×3是0矩阵,即
[ 0 0 0 ] \begin{bmatrix} 0& 0& 0\\ \end{bmatrix} [000]
右下角的元素就是标量1 -
平移矩阵
可以使用矩阵乘法来表示对一个点的平移变换
如果对一个方向矢量进行平移变化
可以发现,平移变化不会对方向矢量产生影响,即矢量没有位置属性,也就是说它可以位于空间中任意一点 -
缩放矩阵
对于一个点进行缩放
对于一个方向矢量
如果缩放系数 k x = k y = k z k_{x}=k_{y}=k_{z} kx=ky=kz,这样的缩放为统一缩放,否则为非统一缩放,从外观看,统一缩放是扩大整个模型,而非统一缩放会拉伸或挤压模型,更重要的是,统一缩放不会改变角度和比例信息,而非统一缩放会改变与模型相关的角度和比例,缩放矩阵一般不是正交矩阵 -
旋转矩阵
如果把点绕x轴旋转,可以使用下面的矩阵:
绕y轴旋转
绕z轴旋转
旋转矩阵是正交矩阵,而且多个旋转矩阵之间的串联同样是正交的 -
复合变换
在大多数情况下,约定矩阵的变换顺序是先缩放,再旋转,最后平移
对于旋转来说,在Unity中,旋转的顺序是zxy
5. 坐标空间
- 屏幕空间
经过投影变换后,进行裁剪操作,当完成了所有裁剪工作后,就需要进行真正的投影了,也就是说需要把视椎体投影到屏幕空间
首先,需要进行齐次除法,就是用齐次坐标系的 w w w分量去除 x y z xyz xyz分量,在OpenGL中,这一步得到的坐标叫做归一化的设备坐标(NDC),经过这一步后,可以把坐标从齐次裁剪坐标空间转换到NDC中,。经过透视投影变换后的裁剪空间。经过齐次除法后会变换到一个立方体内。按照OpenGL的传统,这个立方体的 x y z xyz xyz分量的范围都是[-1,1],但在DX中, z z z的分量范围会是[0,1]。Unity选择的是OpenGL的齐次裁剪空间
- 总结