跳转到主要内容
Game Engine Apr 30, 2022 2 tags

第4章 数学基础

第4章 数学基础

cover

左手坐标系和右手坐标系

为什么在三维笛卡儿坐标系中要区分左手坐标系和右手坐标系,而二维中就没有这些烦人的事情呢?这是因为,在二维笛卡儿坐标系中, x 轴和y 轴的指向虽然可能不同,就如我们在图4.4中看到的一样。但我们总可以通过一些旋转操作来使它们的坐标轴指向相同。

从这种意义上来说,所有的二维笛卡儿坐标系都是等价的。

但对于三维笛卡儿坐标系,靠这种旋转有时并不能使两个不同朝向的坐标系重合。例如,在图4. 6 中, +z 轴的方向指向纸面的内部,如果有另一个三维笛卡儿坐标系,它的+z 轴指向纸面外部, x 轴和y 轴保持不变,那么我们可以通过旋转把这两个坐标轴重合在一起吗?答案是否定的。我们总可以让其中两个坐标轴的指向重合,但第三个坐标轴的指向总是相反的。

也就是说, 三维笛卡尔坐标系并不都是等价的。

因此,就出现了两种不同的三维坐标系: 左手坐标系和右手坐标系。

除了坐标轴朝向不同之外,左手坐标系和右手坐标系对千正向旋转的定义也不同,即在初高 中物理中学到的左手法则(left-band rule) 右手法则(right-band rule)

我们可以分别在一个左手坐标系和右手坐标系中描述这样一次运动, 即使用数学表达式来描 述它。我们会发现,在不同的坐标系中描述这样同一次运动是不一样的,如图4.11 所示。

为了达到同样的视觉效果,左右手坐标系在z 轴上的移动以及旋转方向是不同的。

点和矢量

**点(point) **是n 维空间(游戏中主要使用二维和三维空间)中的一个位置, 它没有大小、宽度这类概念。

**矢量(vector, 也被称为向量)的定义则复杂一些。矢量是指n 维空间中一种包含了模(magnitude) 方向(direction) **的有向线段。

  • 矢量的模指的是这个矢量的长度。一个矢量的长度可以是任意的非负数。
  • 矢量的方向则描述了这个矢量在空间中的指向。
  • 矢量的表示方法和点类似。我们可以使用v=(x,y)来表示二维矢拯,用v=(x,y,z)来表示三维矢 量,用v=(x,y,z,w)来表示四维矢量。 通常,矢量被用于表示相对于某个点的偏移(displacement), 也就是说它是一个相对量。只要矢量的模和方向保持不变, 无论放在哪里,都是同一个矢量。

矢量通常用千描述偏移扯,因此,它们可以用千描述相对位置,即相对于另一个点的位置,此时矢量的尾是一个位置,那么矢量的头就可以表示另一个位置了。而一个点可以用于指定空间中的一个位置(即相对于原点的位置) 。如果我们把矢量的尾固定在坐标系原点, 那么这个矢量的表示就和点的表示重合了。图4.16表示了两者之间的关系。

为了方便阐述,我们对不同类型的变量在书写和印刷上使用不同的样式。

  • 对于标量,我们使用小写字母来表示,如a, b, x, y, z, θ, α等。
  • 对于矢量, 我们使用小写的粗体字母来表示,如a, b, u, v等。
  • 对于后面要学习的矩阵,我们使用大写的粗体字母来表示,如**A, B, S, M, R **等。

矢量和标量的乘法/除法

标量是只有模没有方向的童, 虽然我们不能把矢量和标盘进行相加/相减的运算(想象一下, 你会把速度和距离相加吗), 但可以对它们进行乘法运算, 结果会得到一个不同长度且可能方向相反的新的矢量。

注意, 对于乘法来说, 矢量和标量的位置可以互换。但对于除法, 只能是矢量被标量除, 而不能是标量被矢量除, 这是没有意义的。

矢量的加法和减法

我们可以对两个矢量进行相加或相减, 其结果是一个相同维度的新矢量。

需要注意的是,一个矢量不可以和一个标量相加或相减,或者是和不同维度的矢量进行运算。

从几何意义上来看, 对于加法, 我们可以把矢量a 的头连接到矢量b的尾, 然后画一条从a的尾到b的头的矢量, 来得到a和b相加后的矢量。也就是说, 如果我们从一个起点开始进行了一个位置偏移a, 然后又进行一个位置偏移b, 那么就等同于进行了一个a+b的位置偏移。这被称为矢量加法的**三角形定则(triangle rule) **。矢量的减法是类似的,如图4.18 所示。

矢量的模

正如我们之前讲到的一样,矢量是有模和方向的。矢量的模是一个标量,可以理解为是矢量在空间中的长度。它的表示符号通常是在矢量两旁分别加上一条垂直线(有的文献中会使用两条垂直线)。

三维矢量的模的计算公式如下:

|v|=\sqrt{{v_x^2+v_y^2+v_z^2}}

其他维度的矢量的模计算类似,都是对每个分量的平方相加后再开根号得到。

|(1,2,3)|=\sqrt{{1^2+2^2+3^2}}=\sqrt{1+4+9}=\sqrt{14}≈3.742

|(3,4)|=\sqrt{{3^2+4^2}}=\sqrt{9+16}=\sqrt{25}=5

我们可以从几何意义来理解上述公式。对于二维矢量来说,我们可以对任意矢量构建一个三角形,如图4.20 所示。

从图4.20 可以看出,对于二维矢量,其实就是使用了勾股定理,矢量的两个分量的绝对值对应了三角形两个直角边的长度,而斜边的长度就是矢量的模。

单位矢量

在很多情况下,我们只关心矢量的方向而不是模。

单位矢量指的是那些模为1的矢量。单位矢量也被称为被归一化的矢量(normalized vector)。对任何给定的非零矢量,把它转换成单位矢量的过程就被称为归一化(normalization)

为了对矢量进行归一化,我们可以用矢量除以该矢量的模来得到。公式如下:

\hat{v} = \frac {v}{|v|}

零矢量(即矢量的每个分量值都为0, 如v=(0,0,0)) 是不可以被归一化的。这是因为做除法运算时分母不能为0。

矢量的点积

矢量之间也可以进行乘法,但是和标量之间的乘法有很大不同。矢量的乘法有两种最常用的种类:点积(dot product, 也被称为内积,inner product) 叉积(cross product, 也被称为外积, outer product)

公式一:a\cdot b=(a_x,a_y,a_z)\cdot (b_x,b_y,b_z)=a_x b_x+a_y b_y+a_y b_y

点积的符号可以让我们知道两个矢量的方向关系。

这意味着, 我们可以直接利用点积来求矢量的模, 而不需要使用模的计算公式。 当然, 我们需要对点积结果进行开平方的操作来得到真正的模。 但很多情况下, 我们只是想要比较两个矢量的长度大小, 因此可以直接使用点积的结果。 毕竟, 开平方的运算需要消耗一定性能。

矢量的叉积

另一个重要的矢量运算就是叉积(cross product), 也被称为外积(outer product)。与点积不同的是, 矢量叉积的结果仍是一个矢量, 而非标量。

需要注意的是,叉积不满足交换律, 即ab \ne ba 。实际上,叉积是满足反交换律的,即ab=-(ba) 。而且叉积也不满足结合律,即(ab)c \ne a(bc) 。

我们先来看它的模。a*b 的长度等于a 和b 的模的乘积再乘以它们之间夹角的正弦值。公式如下:

|a*b|=|a||b|sin\theta

需要注意的是, 虽然看起来左右手坐标系的选择会影响叉积的结果, 但这仅仅是“看起来” 而已。从叉积的数学表达式可以发现, 使用左手坐标系还是右手坐标系不会对计算结果产生任何影响, 它影响的只是数字在三维空间中的视觉化表现而已。当从右手坐标系转换为左手坐标系时, 所有点和矢量的表达和计算方式都会保持不变,只是当呈现到屏幕上时,我们可能会发现,'`咦,怎么图像反过来了! ”。当我们想要两个坐标系达到同样的视觉效果时, 可能就需要改变一些数学运算公式, 这不在本书的范畴内。有兴趣的读者可以参考本章的扩展阅读部分。

矩阵

定义:从它的外观上来看,就是一个长方形的网格,每个格子里放了一个数字。的确,矩阵就是这么简单: 它是由mXn 个标量组成的长方形数组。

m_{ij} 表明了这个元素在矩阵m的第i 行、第j 列。

和矢量联系起来

我们可以用矩阵来表示矢量。实际上,矢量可以看成是*n1 的列矩阵(column matrix) 或*1n** 的行矩阵(row matrix)**, 其中n 对应了矢量的维度

矢量可以像一个矩阵一样一起参与矩阵运算。这在空间变换中将非常有用。

矩阵运算

矩阵和标量的乘法

解释:对于每个元素C_{ij}, 我们找到A 中的第i行和B 中的第j列,然后把它们的对应元素相乘后再加起来,这个和就是C_{ij}

特殊的矩阵

方块矩阵(square matrix)

单位矩阵(identity matrix)

转置矩阵(transposed matrix)

逆矩阵(inverse matrix)

不是所有的矩阵都有逆矩阵,第一个前提就是,该矩阵必须是一个方阵。

正交矩阵(orthogonal matrix)

在Unity 中,常规做法是把矢量放在矩阵的右侧,即把矢量转换成列矩阵来进行运算。

矩阵的几何意义:变换

什么是变换

我们先来看一个非常常见的变换类型一线性变换(linear transform)。线性变换指的是那些可以保留矢量加标量乘的变换。用数学公式来表示这两个条件就是:

f(x)+f(y)=f(x+y)

kf(x)=f(kx)

仿射变换(affine transform) 。仿射变换就是合并线性变换和平移变换的变换类型。仿射变换可以使用一个4x4的矩阵来表示,为此,我们需要把矢量扩展到四维空间下,这就是齐次坐标空间(homogeneous space) 。

Related Articles

继续阅读