矩阵 Matrix 简介

Reading time ~1 minute

概念

矩阵,是由m × n个数组成的一个m行n列的矩形数字块。组成矩阵的每一个数,均称为矩阵的元素(Element)

维度与记法:

矩阵的维度(Dimension)定义了它包含多少行和多少列。 一个r × c矩阵有r 行 c列。 矩阵通常用大写字母表示。需要引用分量时使用下标法,如下3 × 3矩阵:

方阵:

行数和列数相同的矩阵称为方阵(Square Matrix)。 方阵的对角线元素就是行号和列号相同的元素,也就是对角线上的元素,其他元素为非对角线元素

对角矩阵(Diagonal Matrix):所有非对角元素都是0的矩阵。 单位矩阵(Identity Matrix):对角线矩阵为1,其他元素为0。n维单位矩阵记为In 。

向量作为矩阵:

n维行向量可视作1 × n矩阵,n维列向量视为n × 1矩阵。

转置:

把矩阵A的行换成相应的列,得到的新矩阵称为A的转置矩阵(Transpose Matrix),记作AT。 一个r × c矩阵的转置矩阵是一个c × r矩阵。

行向量转置变成列向量,列向量转置变成行向量。转置记法常用于书写列向量:[1, 2, 3]T

运算律:

矩阵加减法:

矩阵与标量加减:

标量值与矩阵每一个元素运算:

矩阵与同型矩阵加减:

矩阵只能与同型矩阵(行数与列数相等)加减,就是两个矩阵对应元素的加减运算:

矩阵乘法:

标量与矩阵乘法:

矩阵的每一个元素分别乘以该标量:

矩阵加减法满足交换律、结合律。

矩阵相乘:

一个 r × n 矩阵乘以一个 n × c 矩阵,会得到一个 r × c 矩阵。

即取A的第 i 行和B的第 j 列,将行和列对应的元素相乘,然后结果相加:

注意:

  • 只有左侧矩阵的列和右侧矩阵的行数相等,才可以相乘。
  • 矩阵相乘不遵守交换律(Commutative)。
  • 矩阵乘以单位矩阵,不管从哪边相乘都会得到原矩阵。
  • 矩阵乘法满足结合律:(AB)C = A(BC)。
  • (AB)T = BTAT

向量与矩阵相乘:

矩阵的几何解释:

矩阵是线性变换的便利表达法。 一般来说,任意向量v都可扩展为:

右边的单位向量就是x、y、z轴,由此也可知:向量的每个坐标都表明了平行于相应坐标轴的有向位移。 分别用p,g,r定义为+x,+y,+z方向的单位向量,则有:

向量p,g,r称为基向量,一个坐标系能用任意三个线性无关(即不在同一平面)的基向量表示。 用p,g,r构建一个矩阵M:

用一个向量乘以该矩阵,仍能得到

可知:如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于做了一次坐标转换。

矩阵和线性变换:

如果一个映射保持了基本运算:加法和数量乘,就可以称该映射为线性的。这时,两个向量相加然后再进行变换和先分别变换再相加得到的结果是一样的。同样数量乘同理。

基本的线性变换包括:旋转、缩放、投影、镜像、切变等。 注意,线性变换不包括平移,包含平移的变换称为仿射变换。

仿射变换指的是线性变换后接着平移。因此,仿射变换的集合是线性变换的超集。

变换物体与变换坐标系:

考虑2D中的两种情况:

  1. 将一个物体顺时针旋转20°,意味着旋转物体上所有的点,这些点将被移动到一个新的位置,使用的同一个坐标系描述变换前后的位置。如图:

  2. 将坐标系顺时针旋转20°,此时物体的点并没有移动,我们只是在另外一个坐标系中描述它的位置。如图:

    可见,两种变换是等价的。将物体变换一个量等价于将坐标系变换一个相反的量。一般来说,变换物体相当于以相反的量变换描述这个物体的坐标系。当有多个变换,则需要以相反的顺序变换相反的量。

旋转:

  • 2D中绕坐标中心旋转:

  • 3D中绕坐标轴旋转:
    利用旋转矩阵我们可以把我们的位置向量(Position Vectors)沿一个或多个轴进行旋转。也可以把多个矩阵结合起来,比如先沿着X轴旋转再沿着Y轴旋转。但是这会很快导致一个问题——万向节死锁(Gimbal Lock)。 避免万向节死锁的真正解决方案是使用四元数(Quaternion),它不仅安全,而且计算更加友好。

缩放:

如果在各方向应用同比例的缩放,则是均匀缩放(Uniform Scale),如果在不同方向应用不同的缩放因子,则是不均匀(Non-uniform)缩放。

对于缩放因子k,如果|k|<1,物体将变短,如果|k|>1,物体将变长。如果k=0,就是正交投影。如果k<0,就是镜像。

3D沿坐标轴缩放矩阵:

平移:

平移(Translation)是在原来向量的基础上加上另一个的向量从而获得一个在不同位置的新向量的过程,这样就基于平移向量移动(Move)了向量。 如果我们把平移向量表示为(Tx, Ty, Tz),我们就能把平移矩阵定义为:

此时我们是用了4x4矩阵,因为所有的平移值都要乘以向量的w列,所以平移值会加到向量的原始坐标上,使用3x3就无法实现了。

齐次坐标(Homogeneous coordinates):

四维向量(x, y, z, w)的w分量也叫做齐次坐标。想要从齐次坐标得到3D坐标,我们可以把x、y和z坐标除以w坐标。我们通常不会注意这个问题,因为w分量通常是1.0。使用齐次坐标允许我们在3D向量上进行平移(如果没有w分量我们是不能平移向量的)。 如果一个向量的齐次坐标是0,这个坐标就是方向向量(Direction Vector),因为w坐标是0,这个向量就不能平移。

变换的组合

根据矩阵的乘法,我们可以把多个变换组合到一个矩阵中。这个新矩阵代表依次执行原变换的累加效果。 如我们有一个顶点(x, y, z),我们希望将其缩放2倍,然后用位移(1, 2, 3)来平移它。我们需要一个平移和缩放矩阵来完成这些变换。结果的变换矩阵看起来像这样:

注意,当矩阵相乘时我们先写平移再写缩放变换的。建议您在组合矩阵时,先进行缩放操作,然后是旋转,最后才是平移,否则它们会(消极地)互相影响(乘法的顺序是从右往左)。

Scriptable Objects 及 游戏架构

Scriptable Objects 相关介绍,及基于其的游戏架构技术 Continue reading

AssetBundle 最佳实践

Published on January 29, 2019

AssetBundle 基础总结

Published on January 27, 2019