矩阵与矩阵变换
矩阵 是由 m X n 个标量组成的长方形数组;矩阵属于网格结构,有 行、列 之分。
实际上矢量可以看成nX1的 列矩阵 或者1Xn的 行矩阵 ,其中n对应了矢量的维度。列如矢量 v=(3,8,6)可以写成下面两种矩阵。
注意: 矩阵的乘法不满足交换律( AB不等于BA );但是满足结合律( (AB)C = A(BC) );
ABCDE = ((A(BC))D)E = (AB)(CD)E
假设我们有一个矢量 v=(x,y,z) ,我们可以转换成行矩阵 v=(x y z) 或列矩阵 v=(x y z) T ,这里我们有个矩阵 M ,我们将他们分别相乘,会得到两个结果。
显然在与矩阵相乘的时候选择行矩阵还是列矩阵直接决定了矩阵乘法的书写次序和结果值。
注意: 在Unity中,常规的做法是把矢量放在矩阵的右侧,把矢量转换成列矩阵来进行运算。这也导致了我们的矩阵运算乘法通常是从右往左乘。 CBAv = (C(B(Av)))
变换是指我们把一些数据,顶点、方向矢量甚至是颜色等,通过某种方式进行转换的过程。
我们先来看一个简单的2D例子,我们有一个2X2的矩阵;
我们从这个矩阵中获取基矢量 p 和 q ;
p = [2 1]
q = [-1 2]
当我们将如果一张图的原基矢量为 x(1,0),y(0,1) ,将它转换成上面矩阵时就得到了下面的过程。这个转换过程就称为变换,我们可以看出,这个变换过程不仅包含旋转,还包含拉伸。
如果我们想对一个矩阵进行平移操作,那么我们需要将这个矩阵扩展到4X4的矩阵,为此我们需要将原来的三维矢量转换成四维矢量,也就是我们说的 齐次坐标 。
从三维坐标转换到齐次坐标是把其 w 设为1。而对于方向矢量来说,我们需要把 w 设为0。
这里我将对应的公式和方法在下图中展示,需要注意的是,矩阵的旋转有绕不同的轴旋转,他们所对应的公式也有所不同。