3D数学基础:图形与游戏开发笔记 第7~8章 矩阵

Posted 思考与实践同等重要

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3D数学基础:图形与游戏开发笔记 第7~8章 矩阵相关的知识,希望对你有一定的参考价值。

【3D数学基础:图形与游戏开发】笔记 第7~8章 矩阵

矩阵有关基础概念

矩阵

向量是标量的数组,矩阵是向量的数组。可以定义为任意行和任意列。

前面我们把向量的维度定义为它所包含的数的个数,与之类似,矩阵的维度被定义为它包含了多少有和多少列。一个r×c矩阵有r行、c列。下面是一个4×3矩阵的例子:

方阵

行数和列数相问的矩阵称作方阵。例如:方阵的对角线元素就中行号和列号相同的元素。例如,3×3矩阵M的对角线元素为m1,m2和m3。其他元素均为非对角线元素。简单地说,方阵的对角线元素就是方阵对角线的元素。即:

对角矩阵

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

单位矩阵

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

通常,上下文会说明特定情况下单位矩阵的维数,此时可省略下标直接记单位矩阵为I。单位矩阵非常特殊,因为它是矩阵的乘法单位元。其基本性质是用任意个矩阵乘以单位矩阵,都将得到原矩阵。所以,在某种意义上,单位矩阵对矩阵的作用就犹如1对于标量的作用。对于任意矩阵A和B来说,都有:

  • AA-1= A-1A=I
  • (AB)-1 =B-1A-1

转置矩阵

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

注意:

矩阵的几何意义

一句话来说就是矩阵是用来对多对向量进行坐标变换,或者又叫图形变换。例如,在2D中:

注意q和p变换后,他们的方向和大小发生了变化,即发生了缩放和旋转,产生了图形变换。如果他是一张图片的话:

一般来说,方阵能描述任意线性变换。但现在,知道线性变换保留了直线和平行线,而原点没有移动就足够了。线性变换保留直线的同时,其他的几何性质如长度、角度、面积和体积可能就被变换改变了。

从非技术意义上说,线性变换可能“拉伸”坐标系,但不会“弯曲或“卷折”坐标系。

下面是一组非常常见的线性变换:缩放、旋转、投影、镜像。注意平移不是线性变换,因为它不能和上面的矩阵写成一个矩阵形式。引入齐次矩阵可以解决,下文会说到。线性变换 + 平移= 仿射变换。

矩阵的有关计算

标量和矩阵的乘法

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

矩阵乘法

某些情况下,两个矩阵能够相乘。决定矩阵能否相乘以及怎样计算结果的法则初看起来有些奇怪个r×n矩阵A能够乘以一个n×c矩阵B,结果是一个r×c矩阵,记作AB例如,设A为4×2矩阵,B为2×5矩阵,那么结果AB为4×5矩阵:

如果矩阵A的列数和B的行数不匹配,则乘无意义。

矩阵乘法计算如下:记rXn矩阵A与n×c矩阵B的积rc矩阵AB为C。C的任意元素C等于A的第i行向量与B的第j列向量的点乘结果。正式定义为:

(推荐记忆方法)另一种帮助记忆这个法则的方法是将B写在C如下所示。这种写法的目的是使A的行和B的列与C中的对应元素对齐:

例如:

注意

  • 任意矩阵M乘以方阵S,不管从哪边乘,都将得到与原矩阵大小相同的矩阵。当然,前提是假定乘法有意义。如果S是单位矩阵,结果将是原矩阵M,即:M=IM=MI(这就是被称为单位矩阵的缘故).
  • 矩阵乘法不满足交换律。
  • 矩阵乘法满足结合律,即:(AB)C=A(BC)(假设A,B,C的维数使其乘法有意义,要注意如果(AB)C有意义,那么A(BC)一定也有意义。)矩阵乘法结合律可以扩展到多个矩阵的情况下,如:

向量与矩阵的乘法

为向量能被当作是一行或一列的矩阵,所以能够用前一节所讨论的规则与矩阵相乘。在这里,行向量和列向量的区别非常重要。公式7.7展示了3D行、列向量如何左乘、右乘3×3矩阵:

如您所见,行向量左乘矩阵时,结果是行向量:列向量右乘矩阵时,结果是列向量。另外两种组合是不允许的,不能用行向量右乘矩阵,列向量左乘矩阵。

行向量与列向量

行向量

例如DirectX使用的是行向量。行向量要左乘:vABC。

列向量

例如OpenGL使用的是列向量。列向量要右乘:ABC。

旋转

2D中的旋转

注意:逆时针是正方向,顺时针是负方向。

左手坐标系和左手法则

3D中的旋转

记住它们的方法很简单:绕哪个轴旋转,哪个轴就是1(因为是单位向量),其余的轴就是0。

绕X轴旋转

旋转矩阵:

绕Y轴旋转

旋转矩阵:

绕Z轴旋转

旋转矩阵:

绕任意轴的旋转

推理过程省略,结果是:

旋转矩阵运算量大,速度慢,一般用欧拉角来计算。

缩放

我们可以通过让比例因子k按比例变大或缩小来缩放物体,如果在各方向应用同比例的缩放,并且沿原点“膨胀”物体,那么就是均匀缩放。均匀缩放可以保持物体的角度和比例不变。如果长度增加或减小因子k,则面积增加或减小因子k2,在3D中,体积因子是k。如果需要“挤压”或“拉伸”物体称作非均匀缩放。非均匀缩放时,物体角度将发生变化。视各方向缩放因子的不同,长度、面积、体积的变化因子也各不相同。

如果丨k丨<1,物体将"变短"。

如果丨k丨>1,物体"变长"。

如果k=0,就是正交投影。

如果k<0就是镜像。

沿坐标轴的缩放

最简单的缩放方法是沿着每个坐标轴应用单独的缩放因子缩放是沿着垂直的轴(2D中)或平面(3D中)进行的。如果每个轴的缩放因子相同(Kx=Ky),就是均匀缩放,否则是非均匀缩放。

沿坐标轴2D缩放

沿坐标轴3D缩放

沿任意轴缩放

沿任意轴2D缩放

沿任意轴3D缩放

正交投影

一般来说,投影意味着降维操作。曾提到,有一种投影方法是在某个方向上用零作为缩放因子。这种情况下,所有点都被拉平至垂直的轴(2D)或平面(3D)上。这种类型的投影称作正交投影,或者平行投影,因为从原来的点到投影点的直线相互平行。

向坐标轴(2D)或平面(3D)投影

向坐标轴或平面投影在实际变换中不常发生,大多数情况是向低维的变量赋值,且要抛弃维数时。例如,将3D点赋值给2D点,抛弃z分量,只复制x和y。

通过使垂直方向上的缩放因子为零,就能向坐标轴或平面投影。

2D沿坐标轴投影矩阵

3D沿平面投影矩阵

总结:向哪个轴投影就保留哪个轴,另一个轴的分量为零。

也能向任意直线或平面投影。像往常一样,由于不考虑平移,这些直线或平面必须通过原点。投影由垂直于直线或平面的单位向量n定义。通过使该方向的缩放因子为零能够导出向任意方向投影的矩阵。

2D沿任意轴投影矩阵

记住这里n垂直于投影直线,而不是平行。

3D沿任意平面投影矩阵

3D中,向垂直于n的平面投影的矩阵:

镜像

镜像(也叫作反射)是一种变换,其作用是将物体沿直线(2D中)或平面(3D中)“翻折”。

2D沿任意轴镜像矩阵

使缩放因子为-1能够很容易地实现镜像变换。设n为2D单位向量,公式8.17所示的矩阵将沿通过原点且垂直于n的反射轴来进行镜像变换。

3D沿任意轴镜像矩阵

3D中,用反射平面代替直线。公式818中的矩阵将沿通过原点且垂直于n的平面来进行镜像变换。

注意:一个物体只能“镜像”一次,如果再次镜像(当沿不同的轴或平面的时候),物体将翻回“正面”(用张纸来想象),这和在原位置旋转物体的效果一样。

切变

切变是一种坐标系“扭曲”变换,非均匀地拉伸它。切变的时候角度会发生变化,但令人惊奇的是面积和体积却保持不变。基本思想是将某一坐标的乘积加到另一个上。

2D中的切变

2D中,将y乘以某个因子然后加到x上,得到x=x+Sy。如图8.17所示:

实现这个切变变换的矩阵为:

记法H的意义是x坐标根据坐标y被切变,参数s控制着切变的方向和量。

另一种则与之对应:

3D中的切变

3D中的切变方法是取出一个坐标,乘以不同因子再加到其他两个坐标上,记法H的意义是x,y坐标被坐标z改变。这些矩阵如公式8.19所示。

切变是一种很少用到的变换,它也被称作扭曲变换。包含切变与缩放(均匀或非均匀)变换通常很容易与包含旋转与非均匀缩放(只能是非均匀)变换发生混淆。

变换的组合

变换可以连续变换,比如可以先平移再旋转,再切变。

或者是某个东西需要渲染。设想世界中有一个任意方向、任意位置的物体,我们要把它渲染到任意方向、任意位置的摄像机中。为了做到这一点,必须将物体的所有顶点从物体坐标系变换到世界坐标系接着再从世界坐标系变换到摄像机坐标系。

变幻的分类

变换的类別并不是互斥的,也不存在一定的“次序”或“层次”使得某一类比另一类多或少一些限制论一般意义上的变换时,我们将使用类似的术语:映射或函数。在最一般的意义上,映射就是种简单的规则,接收输入,产生输出。我们把从a到b的F映射记作Fa)=b。当然,我们的兴趣在于能用矩阵表达的映射,但讨论其他映射也是可能的。

线性变换

我们曾遇到过线性函数的非正式形式。在数学上,如果满足下式,那么映射F(a)就是线性的:F(a+b)=f(a)+F(b)以及:F(ka)=kF(a)。

如果映射F保持了基本运算:加法和数量乘,那么就可以称该映射为线性的。在这种情况下,将两向量相加然后再进行变换得到的结果和先分别进行变换再将变换后的向量相加得到的结果相同。同样,将个向量数量乘再进行变换和先进行变换再数量乘的结果也是一样的。即平行线变换后任然是平行线。

仿射变换

仿射变换是指线性变换后接着平移。因此,仿射变换的集合是线性变换的超集,任何线性变换都是射变换,但不是所有仿射变换都是线性变换。以后我们将要讨论的大多数变换都是仿射变换,任何具有形式v\'=vM+b的变换都是仿射变换。

可逆变换

如果存在一个逆变换可以“撒消”原变换,那么该变换是可逆的。换句话说,如果存在逆变换F使得F(F(a)=a,对于任意a,映射F(a)是可逆的。

显然,除了投影以外,其他变换都能“撤消”。当物休被投影时,某一维有用的信息被抛弃了,而这些信息是不可能恢复的。因此,所有基本变换除了投影都是可逆的。

因为任意线性变换都能表达为矩阵,所以求逆变换等价于求矩阵的逆。如果矩阵是奇异的,则变换不可逆:可逆矩阵的行列式不为零。

等角变换

如果变换前后两向量夹角的大小和方向都不改变,该变换是等角的。只有平移,旋转和均匀缩放是等变换。等角变换将会保持比例不变。镜像并不是等角变换,因为尽管两向量夹角的大小不变,但夹角的方向改变了。所有等角变换都是仿射和可逆的。

刚体变换

刚体变换只改变物体的位置和方向,不包括形状。所有长度、角度、面积和体积都不变。平移和旋转是仅有的刚体变换,镜像并不被认为是刚体变换。

刚体变换也被称作正规变换。所有刚体变换都是正交、等角、可逆和仿射的。

某些刚体变换旋转矩阵的行列式为1。

变换类型小结

表列出了变换类别之间的关系。表中,“Y”代表该行具有其所在列的性质,这里没有“Y”的列并非表示“从不”,而是表示“不经常。

参考资料&原文链接

Bilibili_猎豹网校:游戏开发之3D数学基础

本文标签

游戏开发3D数学基础:图形与游戏开发Unreal Engine游戏开发基础数学游戏开发数学基础书籍笔记

以上是关于3D数学基础:图形与游戏开发笔记 第7~8章 矩阵的主要内容,如果未能解决你的问题,请参考以下文章

[3D数学基础:图形与游戏开发]专栏前言

三维图形学课程笔记,3D建模与游戏开发方向(unity3d,c4d,3dsmax, maya的对比与联系)

三维图形学课程笔记,3D建模与游戏开发方向(unity3d,c4d,3dsmax, maya的对比与联系)

三维图形学课程笔记,3D建模与游戏开发方向(unity3d,c4d,3dsmax, maya的对比与联系)

3D游戏开发需要的数学基础(1) - 向量 Vector

3D数学基础:图形与游戏开发