3D游戏开发所需的数学基础——点和矢量

一:点(point)

点是N维空间(游戏中主要是二维和三维空间)中的一个位置,它没有大小,宽度这类概念。
在笛卡尔坐标系中,我们可以这样表示一个点。
二维空间中的点如:P=( P x P_{x} Px, P y P_{y} Py)
三维空间中的点如:P=( P x P_{x} Px, P y P_{y} Py, P z P_{z} Pz)

二:矢量(vector, 也称为向量)

通常来讲,矢量是指N维空间中一种包含了模(magnitude)和方向(direction)的有向线段
我们通常讲的速度就是一种典型的矢量,例如:一辆车的速度是向北40km/h。向北指明了矢量的方向,40km/h指明了矢量的模。
而标量只有模没有方向,生活中常说到的距离就是一种标量。例如:我家离公司只要100米,这里的100米就是一个标量。

1. 矢量的模指的是这个矢量的长度。一个矢量的长度可以是任意的非负数。
2. 矢量的方向则描述了这个矢量在空间中的指向。

我们可以用v=(x, y)来表示二维矢量,用v=(x, y, z)来表示三维矢量,用v=(x, y, z, w)来表示四维矢量。

三:点和矢量的区别

  1. 点是一个没有大小之分的空间中的位置,而矢量是一个有模和方向但没有位置的量。
  2. 矢量通常用于描述偏移量,它可以用于描述相对位置,即相对于另一个点的位置。
  3. 如果我们把矢量的尾固定在坐标系原点,那么这个矢量的表示就和点的表示重合了。

四:矢量运算

1. 矢量和标量的乘法/除法

乘法只需把矢量的每个分量和标量相乘即可;
公式如下:kv = (k v x v_{x} vx, k v y v_{y} vy, k v z v_{z} vz)

同理,除法等同于和这个标量的倒数相乘;

注意: 对于乘法,矢量和标量的位置可以互换。但对于除法,只能是矢量被标量除。

几何意义: 把一个矢量v和一个标量k相乘,意味着对矢量v进行一个大小为|k|的缩放。

2. 矢量的加法和减法

只需把两个矢量的对应分量进行相加或相减即可,公式如下:
a + b = ( a x a_{x} ax + b x b_{x} bx, a y a_{y} ay + b y b_{y} by, a z a_{z} az + b z b_{z} bz)

a - b = ( a x a_{x} ax - b x b_{x} bx, a y a_{y} ay - b y b_{y} by, a z a_{z} az - b z b_{z} bz)

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

几何意义:
对于加法,我们可以把矢量a的头连接到矢量b的尾,然后画一条从a的尾到b的头的矢量,来得到ab相加后的矢量。
即,我们从一个起点开始进行了一个位置偏移a,然后又进行了一个位置偏移b,等同于进行了一个a + b 的位置偏移。这也被称为矢量加法的三角形法则
矢量的减法同理;
3D游戏开发所需的数学基础——点和矢量_第1张图片

3. 矢量的模

矢量的模是一个标量,可以理解为是矢量在空间中的长度。
三维矢量的模的计算公式如下:
|v| = v x 2 + v y 2 + v z 2 \sqrt{v_{x}^{2} + v_{y}^{2} + v_{z}^{2} } vx2+vy2+vz2

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

4. 单位矢量

很多情况下,我们只需关心矢量的方向而不是模。这个时候就需要计算单位矢量(unit vector)。

单位矢量是指模为1的矢量。也被称为被归一化的矢量(normalized vector)。

对任何给定的非零矢量,把它转为单位矢量的过程就被称为归一化(normalization)。

我们可以用该矢量除以它的模来得到单位矢量,公式如下:

v ^ \hat{v} v^ = v ∣ v ∣ \frac{v}{|v|} vv
这里的v是非零矢量。

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

几何意义:
在二维空间,单位矢量就可以是:从单位圆心出发,到圆边界的矢量。
在三维空间,单位矢量就可以是:从单位球的球心出发,到达球面的矢量。

5. 矢量的点积

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

点积公式如下:

公式一: a · b = ( a x a_{x} ax, a y a_{y} ay, a z a_{z} az) · ( b x b_{x} bx, b y b_{y} by, b z b_{z} bz) = a x b x a_{x}b_{x} axbx + a y b y a_{y}b_{y} ayby + a z b z a_{z}b_{z} azbz

矢量的点积满足交换律,即a·b = b·a

点积的几何意义:投影
投影是什么么?
如下图所示:现在有一个光源,它发出的光线是垂直于 a ^ \hat{a} a^方向的,那么b在 a ^ \hat{a} a^方向上的投影就是b在 a ^ \hat{a} a^方向上的影子。
在这里我们可以使用点积 a ^ \hat{a} a^·b来得到b在 a ^ \hat{a} a^方向上的影子。
3D游戏开发所需的数学基础——点和矢量_第2张图片

注意:
投影的值可能是负数。投影结果的正负号与 a ^ \hat{a} a^和b的方向有关。

  1. 当它们的方向相反(夹角大于90°)时,结果小于0;
  2. 当它们的方向相互垂直(夹角为90°)时,结果等于0;
  3. 当它们的方向相同(夹角小于90°)时,结果大于0.
    3D游戏开发所需的数学基础——点和矢量_第3张图片

点积的符号可以来判断两个矢量的方向关系。
并且任何两个矢量的点积a·b等同于b在a方向上的投影值,再乘以a的长度。

点积的一些重要性质:
1. 性质一: 点积可结合标量乘法。
(ka)·b = a·(kb) = k(a·b)
2. 性质二: 点积可结合矢量加法和减法,和1类似。
a·(b + c) = a·b + a·c
3. 性质三: 一个矢量和本身进行点积的结果,是该矢量的模的平方。
v·v = v x v x v_{x}v_{x} vxvx + v y v y v_{y}v_{y} vyvy + v z v z v_{z}v_{z} vzvz = ∣ v ∣ 2 |v|^{2} v2
我们可以直接用点积来比较两个矢量的长度大小。

公式二: a·b = |a||b|cos θ \theta θ

由下图得知:

  1. b ^ \hat{b} b^的模等于1。
  2. cos θ \theta θ = 直角边 斜边 \frac{直角边}{斜边} 斜边直角边
  3. a ^ \hat{a} a^· b ^ \hat{b} b^的结果就是cos θ \theta θ对应的直角边。

可以得到: a ^ \hat{a} a^· b ^ \hat{b} b^ = 直角边 斜边 \frac{直角边}{斜边} 斜边直角边 = cos θ \theta θ
3D游戏开发所需的数学基础——点和矢量_第4张图片

根据上述结果和性质一,就可以得到公式二了:
a·b = (|a| a ^ \hat{a} a^)· (|b| b ^ \hat{b} b^) = |a||b|( a ^ \hat{a} a^ · b ^ \hat{b} b^) = |a||b|cos θ \theta θ

两个矢量的点积可以表示为两个矢量的模相乘,再乘以它们之间夹角的余弦值。由此也可以知道为什么计算投影时两个矢量的方向不同会得到不同符号的投影值:

  1. 当夹角小于90°时,cos θ \theta θ > 0;
  2. 当夹角等于90°时,cos θ \theta θ = 0;
  3. 当夹角大于90°时,cos θ \theta θ < 0;

利用这个公式,还可以求得两个向量之间的夹角(0°~180°)
θ \theta θ = arcos( a ^ \hat{a} a^· b ^ \hat{b} b^),这里 a ^ \hat{a} a^ b ^ \hat{b} b^是单位矢量。arcos是反余弦操作。

6. 矢量的叉积

叉积(cross product),也称为外积(outer product)。
与点积不同的是,矢量的叉积结果是一个矢量。
叉积公式如下:
a x b = ( a x a_{x} ax, a y a_{y} ay, a z a_{z} az) x ( b x b_{x} bx, b y b_{y} by, b z b_{z} bz) = ( a y b z a_{y}b_{z} aybz - a z b y a_{z}b_{y} azby, a z b x a_{z}b_{x} azbx - a x b z a_{x}b_{z} axbz, a x b y a_{x}b_{y} axby - a y b x a_{y}b_{x} aybx)

注意

  1. 叉积不满足交换律,即a X b ≠ \not= = b X a
  2. 叉积满足反交换律,即a X b = -(b X a)
  3. 叉积不满足结合律,即(a X b) X c ≠ \not= = a X (b X c)

几何意义: 对两个矢量进行叉积的结果会得到一个同时垂直于这两个矢量的新矢量。

a X b 的长度等于a和b的模的乘积再乘以它们之间夹角的正弦值
公式如下:|a X b| = |a||b|sin θ \theta θ

另外,垂直于两个矢量的新矢量是有两个方向可选的,我们可以使用对应坐标系的法则来判断选择哪个方向。

如下图所示,在右手坐标系中,a X b的方向将使用右手法则来判断。我们把右手手心放在a和b的尾部交点处,然后张开你的手掌方向和a的方向重合,再弯曲你的四指让它们向b方向靠拢,最后伸出你的大拇指,大拇指指向的方向就是右手坐标系中a X b的方向了。
3D游戏开发所需的数学基础——点和矢量_第5张图片

注意: 使用左手/右手坐标系并不会对计算结果产生任何影响,它影响的只是数字在三维空间中的视觉化表现而已。

叉积可以用于计算垂直一个平面的矢量,判断三角面片的朝向等

你可能感兴趣的:(游戏开发,3d,图形学,数学,游戏,点和矢量)