3D数学基础-图形和游戏开发-学习笔记 第五章 矩阵和线性变换

本章讨论使用3x3矩阵再三位中表达线性变换(旋转、比例缩放、正交投影、反射和错切)

本章分为两大部分

  • 第一部分包括 第5.1节~5.5节,采用前面章节中介绍的基本工具来推导旋转、比例缩放、正交投影、反射和错切的原始线性变换的矩阵。
  • 第二部分回到变换的一般性原则。
    • 第5.6节展示 如何通过使用矩阵乘法来组合原始变换序列以形成更复杂的变换
    • 第5.7节讨论各种有趣的变换类型。 线性、方式、可逆、角度保持、正交和刚体变换

5.1 旋转

5.1.1 在二维中的旋转

  1. 二维中旋转,只能进行绕点旋转,具有一个参数,即角度θ\theta,定义旋转量。大多数书籍的标准惯例都是逆时针旋转正向和顺时针旋转负向
  2. 下图显示了基矢量p\vec{p}q\vec{q}如何围绕原点旋转,从而产生新的矢量p\vec{p'}q\vec{q'}
  3. 知道旋转后基矢量的值后,构建一下矩阵

5.1.2 围绕主轴的三维旋转

  1. 三维中,旋转发生在一个轴,而不是一个点上,即绕轴旋转。旋转轴不一定必须是基本的xyzx、y、z轴之一。本文旋转方向的正负标准遵循左手规则(可看第一章的1.3.3节)

  2. 围绕x轴的旋转,从旋转的基矢量构造矩阵,可得

  3. 围绕y轴的旋转矩阵

  4. 围绕z轴的旋转矩阵

  5. 三维中围绕x、y、z轴旋转


  6. 虽然定义正负向使用的是左手规则,但矩阵在左手或右手坐标系中均可正常使用。

5.1.3 围绕任意轴的三维旋转

在三维中可以围绕任意轴进行旋转,但前提是该轴需要穿过原点,因为此刻不考虑平移。下面将将θ\theta定义为绕轴的旋转量,轴将由单位矢量n^\bold{\widehat{n}}定义。
下面推导出一个围绕n^\bold{\widehat{n}}旋转角度θ\theta的矩阵,即推导出R(n^,θ)\bold{R}(\bold{\widehat{n}},\theta),是的当将矢量v\vec{v}乘以R(n^,θ)\bold{R}(\bold{\widehat{n}},\theta)时,得到的矢量v\vec{v'}是将vv围绕n^\bold{\widehat{n}}旋转角度θ\theta的以下结果:

v=vR(n^,θ)\vec{v'}=\vec{v}\bold{R}(\bold{\widehat{n}},\theta)

推导过程较为繁琐,这里直接的出结论,围绕任意轴旋转的三维矩阵:

5.2 缩放

缩放一个对象,使其按比例增大或减小一个k的因子。如果将这个比例应用于整个对象,则可以基于原点"扩展"对象。

  1. 我们要执行的是均匀缩放(UniformScale),即保留角度和比例:长度统一增加或减少一个 kk 的因子;面积增加或减小一个 k2k^2 的因子;体积(在三维中)增加或减少一个 k3k^3 的因子子。
  2. 如果希望"拉伸"或"挤压"对象,则可以在不同的方向上应用不同的比例因子,这样会导致不均匀缩放(NonuniformScale)。不均匀缩放将不会保留角度;而长度、面积和体积等则会根据相对于比例方向而发生变化的因子来进行调整。具体如下:
    • 如果|k|<1,则对象在那个方向会变得“更短”。
    • 如果|k|>1,则对象在那个方向会变得“更长”。
    • 如果k=0,那么将获得一个正交投影(Orthographic Projection),这在第5.3节中将会讨论。
    • 如果k<0,那么将获得一个反射的结果,这在第5.4节中将会涉及。
    • 在本节的其余部分中,假设k>0

5.2.1 沿主轴缩放

最简单的缩放操作是沿每个轴线应用单独的比例因子。沿着轴的缩放将围绕垂直轴(在二维中)或平面(在三维中)应用。如果所有轴的比例因子相等,则执行的是均匀缩放;否则它就是不均匀缩放。

  1. 在二维中,有两个比例因子:kxk_xkyk_y。下图显示了使用kxk_xkyk_y的各种不同比例因子缩放的一个二维对象。
  2. 从直观上看,基矢量p\vec{p}q\vec{q}独立地受相应比例因子的影响,具体如下:
  3. 从这些基矢量构造二维缩放矩阵S(kx,ky)\bold{S}(k_x,k_y),可得
  4. 对于三维来说,可以添加第三个比例因子kzk_z,然后按下式给出三维缩放矩阵:
  5. 如果将任意矢量乘以上述三维矩阵,那么,正如预期的那样,每个分量都将按适当的比例因子进行缩放,具体如下:

5.2.2 任意方向的缩放

  1. 可以应用独立于坐标系统的缩放,方法是在任意方向上缩放。将n^\bold{\widehat{n}}定义为平行于缩放方向的单位矢量,并且kk是要应用于通过原点并垂直于n^\bold{\widehat{n}}的线(在二维中)或平
    面(在三维中)的比例因子。缩放是沿着n^\bold{\widehat{n}}执行,而不是围绕n^\bold{\widehat{n}}

  2. 为了推导出一个沿任意轴缩放的矩阵,使用类似于第5.1.3节中用于围绕任意轴旋转的方法。如图所示

  3. 推导过程较为繁琐,这里直接的出结论。得到一个二维矩阵,该矩阵将在由单位矢量n^\bold{\widehat{n}}指定的任意方向上按kk的因子缩放。

  4. 根据二维矩阵进一步得到三维矩阵,该矩阵也将在由单位矢量n^\bold{\widehat{n}}指定的任意方向上按kk的因子缩放:

5.3 正交投影

一般来说,术语投影(Projection)指的是任何降维操作。正如在第5.2节中讨论的那样,我们可以实现投影的一种方法是在一个方向上使用零比例因子。在这种情况下,所有点都被扁平化或投影到垂直轴(在二维中)或平面(在三维中)。这种类型的投影是正交投影(Orthographic Projection),也称为平行投影(Parallel Projection),因为从原始点到其投影对应物的线是平行的。在第6.5节中还将介个绍另一种投影,即透视投影(Perspective Projection)。

5.3.1 投影到主轴或主平面上

  1. 当将三维对象投影到主轴(在二维中)或主平面(在三维中)上时,会发生最简单
    的投影。下图显示了关于将三维对象投影到主平面上的结果。
  2. 在主轴或平面上的投影往往不是通过实际变换发生的,而是通过简单地丢弃其中一个坐标,同时将数据指定给较小维度的变量而进行的。例如,我们可以通过丢弃点的zz分量并仅复制xxyy来将三维对象转换为二维对象
  3. 但是,我们也可以通过在垂直轴上使用零刻度值投影到主轴或主平面上。为完整起见,下面提出了这些变换的矩阵。
  • 投影到主轴(在二维中)上的矩阵如下:
  • 投影到主平面(在三维中)上的矩阵如下:

5.3.2 投影到任意线或平面上

我们还可以投影到任意线(在二维中)或平面(在三维中)上。和以前一样,由于不考虑平移 ,因此线或平面必须通过原点。投影将由垂直于线或平面的单位矢量n^\bold{\widehat{n}}定义。

  1. 我们可以使用在第5.2.2节中开发的公式,通过沿此方向应用零比例因子,推导出以任意方向投影的矩阵。在二维中,我们有
  2. 请记住, n^\bold{\widehat{n}}垂直于正在投影的线,而不是与之平行的。在三维中,投影到垂直于n^\bold{\widehat{n}}的平面上,具体如下:

5.4 反射

反射(Reflection)也称为镜像(Mirroring),是一种围绕直线(在三维中)或平面(在三维中)"翻转"对象的变换。下图显示了分别围绕二维中的xx轴和yy轴反射对象的结果。

  1. 可以通过应用-1的比例因子来完成反射。设n^\bold{\widehat{n}}是二维单位矢量。然后,由下式给出围绕穿过原点并垂直于n^\bold{\widehat{n}}反射轴来执行反射的矩阵:
  2. 三维中,我们有一个反射平面而不是轴。为了使变换成为线性,平面必须包含原点,在这种情况下,执行反射的矩阵是

    请注意,对象只能"反射"一次。如果再次反射它(甚至是围绕不同的轴或平面),那么对象将被翻转回"右侧朝外",这与将对象从其初治位置旋转是一样的。图5.9的左下角显示了这样一个例子。

5.5 错切

错切(Shearing)是一种"倾斜"坐标空间的变形,它将不均匀地拉伸坐标空间,不保留角度。然而,令人惊讶的是,面积和体积却保留了。其基本思路是将一个坐标的倍数添加到另一个坐标上。例如,在二维中,可以取yy的倍数并将其添加到xx上,以便x=x+syx'=x+sy。下图显示了这个例子。

在上图中,执行二维中的错切的矩阵是

Hx(s)=[10s1] \bold{H}_x(s) = \begin{bmatrix} 1 && 0 \\ s && 1 \\ \end{bmatrix}

其中,符号Hx\bold{H}_x表示xx坐标被另一个坐标yy错切;参数ss控制错切的量和方向。另一个二维错切矩阵Hy\bold{H}_y,是
Hy(s)=[1s01] \bold{H}_y(s) = \begin{bmatrix} 1 && s \\ 0 && 1 \\ \end{bmatrix}

在三维中,我们可以采用一个坐标并将该坐标的不同倍数添加到另外两个坐标上。符号Hxy\bold{H}_{xy}表示xx坐标和yy坐标按照另一个坐标zz移动。完整的矩阵如下:

错切是一种很少使用的变换,它也被称为倾斜变形(SkewTransform)。结合错切和缩放(均匀或不均匀)会产生一种变形效果,使人分不清它是否包含了旋转和非均匀缩放的变换。

5.6 组合变换

本节将介绍如何获取一系列变换矩阵并将它们组合(Combine)或连接(Concatenate)到一个单一的变换矩阵中。此新矩阵表示按顺序应用所有原原始变换的累积结果。这实际上非常简单。从应用矩阵A变换,接着通过应用矩阵B变换,从而累积得到的变换具有矩阵AB。也就是说,矩阵乘法即可将组合变换表示为矩阵

  1. 一个非常常见的例子是渲染(Rendering)。想象一下,世界上任意位置和方向都有一个对象。我们希望为给定的任何位置和方向上的相机渲染此对象。要做到这一点,我们必须取对象的顶点(假设渲染某种三角形网格)并将它们从对象空间变换到世界空间中。这种变换称为模型变换 (Model Transform),将其表示为 Mobjwld\bold{M}_{obj→wld} 。从那里,使用视图变换(ViewTransform,表示为Mwldcam\bold{M}_{wld→cam})将世界空间顶点变换到相机空间中。所涉及的数学可以概括为

    在第4.1.6节介绍了,矩阵乘法是可结合的,即 (AB)C=A(BC) 。因此,可以通过下式计算一个矩阵直接从对象空间变换到相机空间中:

    因此,可以连接顶点循环外的矩阵,并且在循环内只有一个矩阵乘法(请记住,有很多顶点),具体如下:
  2. 由此可以看到,通过使用矩阵乘法的可结合属性,从代数角度进行的矩阵连接是有效的。让我们看一看是否可以对正在发生的事情进行更多的几何解释。回顾一下,在之前第4.2节中有一个突破性的发现,那就是矩阵的行包含变换标准基矢量的结果,即使在多次变换的情况下也是如此。请注意,在矩阵乘积AB中,每个结果行是矩阵A的相应行与矩阵B的乘积。换句话说,设行矢量a1a_1a2a_2a3a_3代表A的行,则矩阵乘法可以写成

    这明确地表明,AB的乘积的行实际上是将A中的基矢量乘以B之后的变换结果。

5.7 变换的分类

我们可以根据若干个标准对变换进行分类。本节将讨论变换的分类。对于每个类,我们描述属于该类的变换的属性,并指出第5.1节~第5.5节中的哪些基本变换属于该类。变换的类不是相互排斥的,它们也不一定遵循"顺序"或"层次结构",每一个类都可能比其他的类具有更多或更少的限制

讨论一般的变换时,可以使用同义词映射(Mapping)或函数(Function)。在最一般意义上,映射只是一个接受输入并产生输出的规则。例如,要表示映射F将a映射到b,则可以记作F(a)=b(读作a等于b的F)。当然,我们主要对使用矩阵乘法可以表达的变换感兴趣,但重要的是,要注意其他映射也是可能的。

本节还提到了矩阵的行列式(Determinant)。在这里只是提前说一下,因为在第6.1节将给出有关行列式的完整解释。现在,只要知道矩阵的行列式是一个标量并且非常有用就足够了。

5.7.1 线性变换

  1. 在第4.2节中非正式地介绍了线性函数。在数学上,当以下公式成立时,映射F(a)F(a)就是线性的:

  2. 如果映射FF保留了标量加法和乘法的基本运算,则表明映射 FF是线性的;如果将两个矢量相加,然后执行变换,则得到的结果就和单独对两个矢量执行变换然后将变换后的矢量加在一起是一样的;同样,如果缩放一个矢量然后又对其进行变换,则得到的结果应该与先变换矢量然后再缩放它的结果相同

  3. 这种线性变换的定义有两个重要的含义。首先,映射F(a)=aMF(a)=aM(其中,MM是任意方形矩阵)是一个线性变换,因为



    换句话说:可以通过矩阵乘法实现的任何变换都是线性变换。

  4. 总结

    • 可以通过矩阵乘法实现的任何变换都是线性变换
      • 其次,任何线性变换都会将零矢量变换为零矢量。如果F(0)=a,a0\bold{F(0)=a,a\neq 0},则FF不能是线性映射,因为F(k0)=aF(k\bold{0})=\bold{a},所以F(k0)kF(0)F(k\bold{0})\neq kF(\bold{0})。因此,
    • 线性变换不包含平移
      • 由于在第5.1节~第5.5节中讨论的所有变换都可以使用矩阵乘法表示,因此它们都是线性变换在某些文献中,线性变换定义为变换后平行线保持平行的变换。这几乎是完全准确的,但是有两个例外。首先,平行线在平移后保持平行,但平移不是线性变换。其次,投影怎么样?当一条线被投射并成为一个点时,可以将这个个点与任何东西"平行"吗?排除这些技术,直觉是正确的:线性变换可以"拉伸"事物,但直线不会"扭曲",平行线保持平行

5.7.2 仿射变换

仿射(Affine)变换是线性变换+平移。因此,仿射变换集是该组线性变换的超集:任何线性变换都是仿射变换,但并非所有仿射变换都都是线性变换
由于本章所讨论的所有变换都是线性变换,因此它们都是仿射变换(尽管它们都没有平移的部分)。形式v=vM+b\bold{v'=vM+b}的任何变换都是仿射变换。

5.7.3 可逆变换

  1. 如果存在称为FF的逆(Inverse)的相反变换(即"撤销"原始变换),则该变换是可逆(Invertible)的。换句话说,如果存在逆映射(InverseMapping)F1F^{-1},则映射F(a)F(a)是可逆的,使得
    F1(F(a))=F(F1(a))=a F^{-1}(F(a)) = F(F^{-1}(a))=a

    同时,也意味着F1F^{-1}也是可逆的。
  2. 目前仅针对仿射变换的可逆进行探究。
  3. 直觉上我们知道,除了投影之外的所有变换都可以"撤销"。如果我们旋转、缩放、反射或倾斜,我们总是可以取消旋转(Unrotate)、取消缩放(Unscale)、取消反射(Unreflect)或取消倾斜(Unskew)。但是,当对象被投影时,我们会有效地丢弃一个或多个维度的信息,而这些信息无法恢复。因此,除了投影之外的所有原始变换都是可逆的
  4. 由于任何线性变换都可以表示为乘以矩阵,因此,找到线性变换的逆相当于找到矩阵的逆。我们将在第6.2节讨论如何执行此操作。如果矩阵没有逆,那么我们说它是奇异矩阵(SingularMatrix),并且变换是不可逆的。可逆矩阵的行列式是非零的。
  5. 在非奇异矩阵中,零矢量是唯一的输入矢量,它被映射到输出空间中的零矢量,所有其他矢量都映射到其他一些非零矢量。然而,在单个矩阵中,存在输入矢量的整个子空间,称为矩阵的零空间(Null Space),其被映射到零矢量。例如,考虑一个矩阵,该矩阵以正交方式投影到包含原点的平面上该矩阵的零空间由垂直于平面的矢量线组成,因为它们都映射到原点。
  6. 方形矩阵是奇异矩阵时,其基矢量不是线性无关的(参见第3.3.3节)。如果基矢量是线性无关的,则它们具有满秩,并且唯一地确定跨度中的任何给定矢量的坐标;如果矢量是线性有关的,那么整个n维空间的一部分不在基矢量的范围内。考虑两个矢量ab,它们通过位于矩阵MM的零空间中的矢量n差分,使得b = a + n。由于矩阵乘法的线性特性,MM会将ab映射到相同的输出:

5.7.4 保持角度的变换

如果两个矢量之间的角度在变换后的大小或方向上没有改变,则该变换就是保持角度(Angle-Preserving)的。只有平移、旋转和均匀缩放才是保持角度的变换。保持角
度的矩阵也将保留比例。我们不考虑反射保持角度的变换,因为即使变换后两个矢量之间的角度大小相同,角度的方向也可能是相反的所有保持角度的变换都是仿射和可逆的。

5.7.8 正交变换

  1. 正交(Orthogonal)是用于描述矩阵的术语,该矩阵的行将形成标准正交基。之前在第3.3.3节介绍了其基本思想是轴彼此垂直并具有单位长度。正交变换 (保持向量内积不变的线性变换) 很有意思,因为很容易计算出它们的逆,并且它们在实践中经常出现。将在第6.3节讨论更多关于正交矩阵的内容
  2. 平移、旋转和反射都只有正交变换,所有正交变换都是仿射和可逆的。其长度、角度、面积和体积均保留。话虽如此,我们仍然必须小心谨慎地确定其角度、面积和体积,但反射也是一个正交变换,但在第5.7.4节中刚刚说过,我们不认为反射是一个保持角度的变换。所以,也许应该更精确地说:正交矩阵将保留角度、面积和体积的大小,但其符号却可能不一样
  3. 在第6章介绍正交矩阵的行列式为±1

5.7.6 刚体变换

  1. 刚体变换(Rigid Body Transformation)是指改变对象的位置和方向但不改变其形状的变换。保留所有角度、长度、面积和体积。平移和旋转都是是刚体转换,但是反射则不被认为是严格的刚体变换。
  2. 刚体变换也称为合适变换(ProperTransformation)。所有刚体变换都是正交的、保持角度的、可逆的和仿射的。刚体变换是本节中讨论的最严路的变换类,但它们在实践中也非常常见。
  3. 任何刚体变换矩阵的行列式均为1

5.7.7 变换类型总结

下表5.1总结了各种类型的变换。在此表中,Y\bold{Y}表示该行中的的变换始终具有与该列关联的属性。没有Y\bold{Y}并不意味着“永远不”关联;相反,它意意味着"并不总是"关联