3D数学之矩阵

思考并回答以下问题:
1.在Unity中看下Matrix类的API,看看和这些矩阵的运算结果是什么样子

矩阵是3D数学的重要基础。它主要用来描述两个坐标系统间的关系,通过定义一种运算而将一个坐标系中的向量转换到另一个坐标系中。如果不写shader的话,可能还用到的比较少,但是矩阵是咱们后续会学的shader的基础知识。

矩阵

在线性代数中,矩阵就是以行和列形式组织的矩形数字块。回忆前面曾将向量定义为一维数组,矩阵也能像那样定义为二维数组(“二维数组”中的“二”来自它们是行和列的事实,不要和2D向量或矩阵混淆)。向量是标量的数组,矩阵则是向量的数组。

矩阵的维度和记法

前面我们把向量的维度定义为它所包含的数的个数,与之类似,矩阵的维度被定义为它包含了多少行和多少列。一个m × n矩阵有m行、n列。

上图中的矩阵展示了矩阵的标准记法。将数字排列成一个方块,用方括号括起来。注意,有些地方可能用圆括号而不是方括号来包围这个方块。

这m × n个数称为矩阵A的元素,数a_{ij}a ij 位于矩阵A的第i行第j列,m×n矩阵A也记作A_{mn}A mn。

方阵

行数和列数相同的矩阵称作方阵,这个概念非常重要,在图形学中主要使用2×2、3×3、4×4方阵。

方阵的对角线元素就是方阵中行号和列号相同的元素。例如,3×3矩阵MM的对角线元素为m_{11}m
11
,m_{22}m
22
,m_{33}m
33
。其他元素均为非对角线元素。简单地说,方阵的对角线元素就是方阵对角线上的元素。

如果所有非对角线元素都为0,那么称这种矩阵为对角矩阵,例如:

单位矩阵是一种特殊的对角矩阵。n维单位矩阵记作I_nI
n
,是n×n矩阵,对角线元素为1,其他元素为0。例如,3×3单位矩阵;

单位矩阵非常特殊,因为它是矩阵的乘法单位元(后面讨论矩阵乘法)。其基本性质是用任意一个矩阵乘以单位矩阵,都将得到原矩阵。所以,在某种意义上,单位矩阵对矩阵的作用就犹如1对于标量的作用。

向量是特殊的矩阵
矩阵的行数和列数可以是任意正整数,当然也包括1。我们已经见过一行或一列的矩阵了——向量。一个n维向量能被当作1×n矩阵或n×1矩阵。1×n矩阵称作行向量,n×1矩阵称作列向量。行向量平着写,列向量则竖着写,例如:

直到现在,这两种记法都是混合使用的。其实,在几何意义上它们是一样的,绝大多数情况下它们的区别也不重要。但是,因为即将介绍的一些原因,混合使用向量和矩阵时,必须特别注意向量到底是行向量还是列向量。

转置
考虑一个m × n矩阵MM,转置记作M^TM
T
,是一个n × m矩阵,它的列由MM的行组成。可以从另一方面理解,M^T_{ij}M
ij
T
= M_{ji}M
ji
,即沿着矩阵的对角线翻折。

对于向量来说,转置将使行向量变成列向量,使列向量成为行向量。

有两条非常简单但很重要的关于矩阵转置的推论:

对于任意矩阵MM

从另一方面来说,将一个矩阵转置后,再转置一次,便会得到原矩阵。这条法则对向量也适用。

对于在意对角矩阵DD,都有D^TD
T
=DD,包括单位矩阵II也如此。

标量和矩阵的乘法
矩阵MM能和标量kk相乘,结果是一个和MM维数相同的矩阵。矩阵和标量相乘的记法如下所示,标量经常写在左边、不需要写乘号。这种乘法法则很直观,即用kk乘以MM中的每个元素。

矩阵乘法
不是所有的矩阵都可以相乘,两个矩阵相乘有一些条件:矩阵AA的列数和矩阵BB的行数相等。

矩阵乘法计算如下:记r×n矩阵AA与n×c矩阵B的积r×c矩阵ABAB为CC。CC的任意元素C_{ij}C
ij
等于AA的第ii行向量与BB的第jj列向量的点乘结果。正式定义为:

这个看起来有些复杂,可以看一下下面的动图来加深理解。

矩阵乘法.gif

矩阵乘法有一些注意事项:

任意矩阵MM乘以方阵SS,不管从哪边乘,都将得到与原矩阵大小相同的矩阵。当然,前提是假定乘法有意义。如果SS是单位矩阵,结果将是原矩阵MM,即:

这就是I被称为单位矩阵的缘故

这就是I被称为单位矩阵的缘故

矩阵乘法不满足交换律,即

矩阵乘法满足结合律,即

矩阵乘法也满足与标量或向量的结合律,即:

矩阵积的转置相当于先转置矩阵然后以相反的顺序乘:

矩阵的几何解释
一般来说,方阵能描述任意线性变换。线性变换保留了直线和平行线,而原点没有移动。线性变换保留直线的同时,其他的几何性质如长度、角度、面积和体积可能就被变换改变了。从非技术意义上说,线性变换可能“拉伸”坐标系,但不会“弯曲”或“卷折”坐标系。下面是一组非常有用的变换:

旋转

缩放

投影

镜象

仿射

后面将介绍上述各变换的细节。现在,我们主要解释矩阵和它所代表的变换之间的关系。

矩阵是怎样变换向量的
向量在几何上能被解释成一系列与轴平行的位移。如,向量[1,-3,-4]能被解释成位移1,0,0],随后位移0,-3,0],最后位移[0,0,4]。

依据三角形法则,这个位移序列可以理解为向量的加法。

一般来说,任意向量vv都能写为“扩展”形式:

另一种略有差别的形式为:

右边的单位向量就是x,y,z轴,可以理解为向量的每个坐标都表明了平行于相应坐标轴的有向位移。

如果将p、g、rp、g、r分别定义为指向+x,+y,+z方向的单位向量:

现在,向量v就被表示成向量p,q,r的线性变换了。向量p,q,r称作基向量。这里基向量是笛卡尔坐标轴,但事实上,一个坐标系能用任意3个基向量定义,当然这三个向量要线性无关(不在一个平面上,互相垂直)。以p,q,r为行构建一个3×3矩阵\textbf{M}M,可得到如下公式:

用一个向量乘以该矩阵,可以得到:

这和前面计算转换后的v的等式相同。我们发现关键点是:
如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换。若有aM = b,我们就可以说,M将a转换到b。

从这一点看,术语“转换”和“乘法”是等价的。

坦率地说,矩阵并不神秘,它只是用一种紧凑的方式来表达坐标转换所需的数学运算。进一步,用线性代数操作矩阵,是一种进行简单转换或导出更复杂转换的简便方法。

总结

Unity中也有矩阵Matrix对应的类,虽然用到的较少,但是需要了解。

0%