(连载)边喝咖啡边学Unity――第二章 预备知识体系(2)(一)

2015-01-27 06:04:39 · 作者: · 浏览: 29

什么是矩阵?

mn个数排成m行n列形成的矩形表称作一个mxn矩阵。

\

行向量与列向量

由于向量我们可以看做是一种特殊的矩阵,即只有一行或者只有一列的特殊矩阵。因此我们把只有一行的向量称为行向量,只有一列的向量称为列向量。

注意我们的程序在存储矩阵的时候其实是将mn个数存放在一个线性表中,因此获取一个矩阵中的第几行第几列的元素有一个优先原则。这里特别提出,Unity在Matrix4x4这个类的手册中有这样一句话:

Matrices in unity are column major. Data is accessed as: row+ (column*4). Matrices can be indexed like 2D arrays but in an expression likemat[a, b], a refers to the row index, while b refers to the column index (notethat this is the opposite way round to Cartesian coordinates).

Unity中的矩阵使用的是列优先。数据通过行+(列*4)的方式获取。矩阵可以被索引为类似二维数组的形式,但是要以mat[a,b]这样的表达式。其中a代表行号,b代表列号(注意这正好与笛卡尔坐标系相反)。


行向量与列向量的数学表达:


\ \


零矩阵

所有元素都是0的矩阵。

单位矩阵

形式如下的矩阵称为单位矩阵

\


其特点明显:所有元素中行号与列号相等处元素为1,否则为0,也就是从左上至右下的一条对角线为1,其他元素都为0的矩阵。关于单位矩阵的特殊性后面会提到。

矩阵相等

维数相同所有元素相等的两个矩阵我们认为是两个相等的矩阵。

矩阵加法、矩阵减法、矩阵数乘

这3个运算都比较简单,因此写在一起。他们分别表示对应的行列上的数相加、相减得到的矩阵。一个数与矩阵相乘则是所有元素都乘以这个数得到的矩阵。

转置矩阵

\


矩阵乘法

矩阵乘法比较特殊,我们在让矩阵相乘的时候首先保证这个过程有意义。有意义的前提的矩阵乘法的左乘矩阵的行数与右乘矩阵的列数相等。

数学过程:矩阵a的列数与矩阵b的行数相等,那么相乘得到的矩阵c中的第i行j列的元素 \


由于只需要a的列数与b的行数相等,因此我们可以想象一个4元行向量有4列,那么他可以左乘一个4x4矩阵。一个4元列向量有4行,因此他可以右乘一个4x4矩阵。由于行向量与列向量看起来只是书写形式上的区别,实际上行向量与列向量存在转置关系。

矩阵乘法不满足交换律,但是在乘法有意义的情况下有: \

在矩阵运算中,向量与矩阵相乘分为两种:行向量左乘与列向量右乘。

行向量左乘与列向量右成在本质上表达的东西没有太大差别,只是由于行向量与列向量存在转置关系,各个游戏引擎有他的书写习惯,以及美感偏好。DirectX中使用的是行向量左乘,而OpenGL中使用的列向量右乘。


逆矩阵

一个矩阵有逆矩阵首先需要满足一个条件:该矩阵为非奇异矩阵或满秩矩阵,又或者说该矩阵的行列式≠0。

满足该条件的矩阵a存在一个逆矩阵b,使得ab=单位矩阵I。

我们记作 \


空间变换

了解坐标系、向量、矩阵之后,我们可以开始了解空间变换了,而这部分知识基本上覆盖了目前绝大部分的与图形图像开发有关的领域。

前面我们对向量矩阵的定义、特性以及运算法则作了初步了解,然而线性代数没有告诉我们向量、矩阵运算的几何意义。而本书将带领读者去探索向量矩阵运算的空间几何意义。

Matrices can perform any kind ofliner transform.

一般来讲矩阵能描述任意的线性变换。满足两点的空间变换我们称之为线性变换:原点不发生移动;线段和直线之间的平行关系保持不变。换句话说,线性变换可能拉伸坐标系,但是不会扭曲坐标系。

对于任何图形的旋转(rotation)与缩放(scaling),属于线性变换:线段间的平行关系没有发生变化、原点没有发生移动。而平移(translation)变换则不属于线性变换,无论变换前以哪个点为坐标系原点,变换后的原点一定发生了移动。

因此我们说线性变换是一种可能改变线段的长度、线段间的夹角、图形的面积、体积的变换。

现在我们解开心中的疑问:矩阵是如何完成变换的?nxn个数字如何让我们的坐标系翻天覆地?

我们先从二维空间中展开想象。

假设我们有一个图片在平面直角坐标系中,其4个顶点分别为(0,0),(1,0),(0,1)(1,1)。

然后假设有这样一个2x2矩阵:\

我们以这样的2x2矩阵对这个图形进行变换,意味着什么呢?

其实这个矩阵可以看作2个行向量p=[2,1],q=[-1,2]。我们在平面直角坐标系中画出这2个向量:


\


其实这个2x2矩阵代表的意思是将原x轴变换至p向量坐在的方向;将原y轴变换至q向量所在的方向。由于坐标系原点没有发生移动,因此这是一个线性变换。实质上这是一个旋转变换,我们可以伸出我们的左手,大拇指指向x,食指指向y,然后想象将任意一个形状放在两个手指间,然后大拇指由原方向变换至p方向,食指由原方向变换至q方像,这个过程就是我们这个矩阵所描述之变换过程。原图像逆时针旋转了26°。

\-->

\




不仅仅是旋转,我们的图形的边长由原先的1,变换后变为了\。因此这个矩阵还对我们的图形进行了拉伸。

这个例子中我们的p与q恰好垂直切长度相等,于是构成了一个正方形,实际上更普通的情况他们构成的是一个平行四边形。这个平行四边形我们叫做“偏转盒”。二维偏转盒我们可以使用两个手指来比划,三维偏转盒我们可以使用3个手指来比划,因此读者试着自己想象3x3矩阵中的线性变换的偏转盒子。

我们再回头看我们对于线性变换的定义:线段间的平行关系不发生改变;原点不发生移动。可见2x2矩阵与3x3矩阵分别真好可以表达2D与3D空间中的线性变换。

仔细观察上述变换,假设我们把右边的纸旋转让图像重新“回正”,我们顺时针对纸张旋转了26°,于是我们抛出一个概念:

我们对一个图形或者物体按照某个角度旋转,相当于对这个坐标系按照这个角度的负值旋转。

\

\

\


看到这里其实我们可以看到一个非常非常非常明显的规律,也就是变换矩阵中能出现cos的地方必然是在行列号相等的地方(一条对角线),任何行列号不相等的地方都可能出现sin。

缩放矩阵中的3个系数分别对应着对原图像的3个轴向的缩放程度。

一种特殊的线性变换我们称为镜像。例如2维变换矩阵\ 所代表的变换,其变换后的图像如同镜子一样翻折出现在y轴的另一边。


切变变换

讲完线性变换的最后我们提一下切变变换,这是一种特殊的变换,其变换过程为“扭曲”坐标系。其过程希望读者自行查阅相关资料。

至此我们研究完了线性变换的矩阵表达与几何意义。在空间数学中,我们认为坐标与矩阵的乘法就等于变换本身。

那么读者心中是否有疑问,平移变换不属于线性变换,那么能否用矩阵来表达呢?

答案是可以,但是有一个条件:n维空间中的平移变换无法用nxn或者更小的矩阵来表达,至少需要(n+1)x(n+1)的矩阵来表达。我们来看看为什么?

对于2D 3D中的线性变换矩阵,我们将其拆分为与坐标轴数量相当的向量基p,q/p,q,r。我们可以理解为线性变换的过程是将对应的坐标轴上的单位向量变换至该矩阵表示的向量