矩阵在3D数学中具有根本意义上的重要性,它们主要用于描述连个坐标空间之间的关系。它们通过定义将向量从一个空间转换为另一个坐标空间来实现此目的。
4.1 矩阵的数学定义
4.1.1 矩阵维度和表示法
就向通过计算矩阵包含的数量来定义向量的维度一样,我们通过矩阵包含的行数和列数来定义矩阵的大小。我们将一个有r行,c列的矩阵称为r×c矩阵。
4$\times$3矩阵
4−5122104−3418123−10
矩阵元素的下标表示法
m11m21m31m12m22m32m13m23m33
4.1.2 方形矩阵
具有相同行数和列数的矩阵称为方形矩阵。
下列矩阵中,加粗的m11,m22,m33属于对角元素,其他元素是非对角元素。
m11m21m31m12m22m32m13m23m33
如果矩阵中的所有非对角元素都为零,则该矩阵为对角矩阵。如下的4$\times$4对角矩阵。
3000010000−500002
矩阵乘法单位元素,是一个特殊的对角矩阵。维度为n的单位矩阵,表示为In,是n×n矩阵,其对角线上的值为1,其他元素值均为0.如下的三维单位矩阵。
I3=100010001
4.1.3 作为矩阵的向量
矩阵可以包含任何正数的行和列,包括一个。维数n的向量可以视为1×n矩阵,我们称之为行向量(Row Vector),横向书写;也可以视为n×1矩阵,我们称之为列向量(Column Vector),纵向书写。从几何上来说,他们是相同的,大多数情况下,这种区分并不重要。书写表示如下。
[123],456
4.1.4 矩阵转置
给定r×c矩阵M,M的转置(Transpose)表示为MT,是c×r矩阵,其中列由M的行构成。看上去就是对角方式“翻转”,表现为MrcT=Mcr。
147102581136912T=123456789101112,aegbehcfiT=abcdefghi
对于向量,转置会将行向量转换为列向量,反之亦然,表述如下:
[xyz]T=xyz;xyzT=[xyz]
- 对于任何维度的矩阵M,则(MT)T=M。也就是,如果先转置矩阵,然后再转置一次,即可得到原始矩阵。此规则也适用于向量。
- 任何对角矩阵D等于其转置:DT=D。包括单位矩阵I也是如此。
4.1.5 矩阵与标量相乘
矩阵M可以与标量k相乘,得到与M相同维度的矩阵。如下标量4×s矩阵的乘法表述:
km=km11m21m31m12m22m32m13m23m33=km11km21km31km12km22km32km13km23km33
4.1.6 连个矩阵相乘
对于连个矩阵相乘,前者的列数必须与后者的行数相等。对于r×n的矩阵A,如果与n×c的矩阵B相乘,结果为r×c的矩阵AB。
矩阵乘法计算如下:设矩阵C为r×n矩阵A与n×c矩阵B的r×c乘积AB。然后每个元素cij等于A的行i与B的列j的向量点积,其用计算公式表述如下:
cij=k=1∑naikbkj
计算A的第2行和B的第4列中元素的点积,示例如下:
另一种助记法:
矩阵乘法公式如下:
AB=a11a21a31a12a22a32a13a23a33b11b21b31b12b22b32b13b23b33=a11b11+a12b21+a13b31a21b11+a22b21+a23b31a31b11+a32b21+a33b31a11b12+a12b22+a13b32a21b12+a22b22+a23b32a31b12+a32b22+a33b32a11b13+a12b23+a13b33a21b13+a22b23+a23b33a31b13+a32b23+a33b33
矩阵乘法需要注意的一些事项:
- 将任何矩阵M乘以一个方形矩阵S(S放那一边都可以,即MS或SM都行)将得到与M大小相同的矩阵,条件是矩阵的大小允许乘法。如果S是单位矩阵I,则结果是原始矩阵M。如:MI=IM=M
- 矩阵乘法不满足交换律:AB=BA。
- 矩阵乘法是满足结合律的:(AB)C=A(BC)。
- 矩阵乘法还可以与标量或向量结合:(kA)B=k(AB)=A(kB),(vA)B=v(AB)。
- 转置两个矩阵的乘积与以相反顺序取得其转置的乘积相同:(AB)T=BTAT。
4.1.7 向量与矩阵相乘
满足矩阵相乘规则(前者行与后者列相同)即可。三维行向量和列向量与3×3的乘法如下:
[xyz]m11m21m31m12m22m32m13m23m33=[xm11+ym21+zm31xm12+ym22+zm31xm13+ym23+zm33]m11m21m31m12m22m32m13m23m33xyz=xm11+ym12+zm13xm21+ym22+zm23xm31+ym32+zm33m11m21m31m12m22m32m13m23m33[xyz]=(undefined)xyzm11m21m31m12m22m32m13m23m33=(undefined)
向量与矩阵中的一些特性如下:
- 结果向量中的每个元素是原始向量与矩阵中的单个行或列的点积。
- 矩阵中的每个元素确定输入向量中的特定元素对输出向量中的元素有多大“权重”。如M12就是控制输入的x元素,在输出的y元素上的占比(权重)。所以对输入的向量而言,所有控制输入向量X分量的元素都在第一行,所有控制Y分量的元素都在第二行,所有控制Z分量的元素都在第三行,即矩阵的每一行都代表一个基础向量(类似于X轴,Y轴)。
- 向量与矩阵乘法分布在向量加法上,即对向量v、w和矩阵M,有(v+w)M=vM+wM。
- 乘法的结果是矩阵的行或列的线性组合。
4.1.8 行与列向量
行向量与列向量本质上并没有区别,但需要注意使用行列向量与矩阵相乘时的顺序是不同的。假设向量v需要与矩阵A,B,C依次相乘。如果v是列向量,那么向量应该出现在右侧,因此转换将从右到左的顺序进行,即写为CBAv。如果v是行向量,那么向量应该出现在左侧,矩阵转换将从左到右的变换顺序列出,即写为vABC。
且行向量与列向量与同一个矩阵相乘后,对应的元素是不同的(如行向量计算结果的第一个元素与列向量计算结果的第一个元素不同)。因此如果想要使用行向量进行计算和使用列向量进行计算的结果向量元素一一对应相等的话,则它们各自使用的矩阵必须是不同的,且为转置关系。
行向量的优点在于,阅读的顺序和相乘的顺序是一致的,即从左到右,而列向量乘积的相乘顺序则是从右到左,但行向量的主要缺点在于,当向量的维度增加时,会让表达式变得非常的长,造成书写的不便,而使用列向量就不会有这个问题。
对于数学家而言,因为需要用到推到,所以他们更喜欢用写起来较短的列向量表达式。而对于计算机而言,因为没有书写的问题,所以更喜欢阅读和相乘顺序相同的行向量,本书也是使用行向量作为与矩阵相乘的向量,之后章节计算出的各种变换矩阵都是基于行向量的,如果要使用在列向量的计算环境下,需要进行转置。
DirectX使用行向量,OpenGL使用列向量。当使用别人的表达式或者代码时,需要特别注意它使用的是行向量还是列向量。
4.2 矩阵的几何解释
从几何意义角度来说,方阵可以描述任何的线性变化(Linear transformation)。
线性变化保证了图形中的线条不会被弯曲,且线条们的平行性质不会给改变,但其他的几何性质,如角度,面积,体积,长度都可能发现变化。线性变化包括:
- 旋转(Rotation)
- 缩放(Scale)
- 正交投影(Orthographic projection)
- 反射(Reflection)
- 切边(shearing)
已知标准基向量i=[1,0,0],j=[0,1,0],k=[0,0,1],当它们乘以任意矩阵M时:
iM=[100]m11m21m31m12m22m32m13m23m33=[m11m12m13]jM=[100]m11m21m31m12m22m32m13m23m33=[m21m22m23]kM=[100]m11m21m31m12m22m32m13m23m33=[m31m32m33]
任何向量都可以写成标准基向量的线性组合,如:v=vxi+vyk+vzk。
使用该表达式乘以右侧矩阵,可获得:
vM=(vxi+vyk+vzk)M=(vxi)M+(vyk)M+(vzk)M=vx(iM)+vy(kM)+vz(kM)=vx[m11m12m13]+vy[m21m22m23]+vz[m31m32m33]
可以将矩阵的每一行看作是一个基本向量,即[m11m12m13],[m21m22m23],[m31m32m33]都是基本向量,将其命名为p,q,r,则上式结果可以改写为:vM=vxp+vyq+vzr。
可以通过上述的方法来直接判断一个方阵所代表的线性变化,方阵的每一行都是变换后的基本向量,如有2×2的矩阵M:
M=[2−112]
提取基向量p和q:
p=[21],q=[−12]
矩阵可视化如下:
矩阵可视化后,M不仅可以旋转坐标空间,还可以进其缩放,如下图所示:
对于三维矩阵同样如此,如有三维矩阵0.7071.250−0.7071.250001,将其用于三维模型的坐标变换,则结果如下图所示:
如同可以通过矩阵来直接判断出基本向量的变换,也可以直接通过基本向量的变换来构建出矩阵,只要将对应的基本向量填入每一行即可。
- 方形矩阵的行可以解释为坐标空间的基向量。
- 要将向量从原始坐标空间变换到新坐标空间,可以将向量乘以矩阵。
- 从原始坐标空间到由这些基向量定义的坐标空间的变换是线性变换。线性变换将保留直线,平行线也将保持平行。但是,角度、长度、面积和体积等可能在变换后发生改变。
- 将零向量乘以任何方形矩阵,得到的是零向量。因此,有方形矩阵表示的线性变换将具有与原始坐标空间相同的原点,这意味着变换不包含平移。
- 我们可以通过可视化变换后坐标空间的基向量来可视化矩阵。这些基向量在二维中形成L形,而在三维中形成的则是三脚架,使用倾斜框或辅助对象也有助于可视化。
4.3 线性代数的宏达图景
线性代数被发明用于操纵和求解线性方程组。
传统线性代数可以求解以下方程组:
−5x1+x2+x3=−10,2x1+2x2+4x3=12,x1−3x3=9
当用矩阵表达这个方程组时:
−52112014−3x1x2x3=−10129
引用:
- Dunn, F. and Parberry, I. (2011). 3D math primer for graphics and game development 2nd.