土法炼钢兴趣小组的算法知识备份

游戏中的数学 (1) - 向量基础

目录

引言

在游戏开发中,向量 (Vector) 是最基础也是最重要的数学工具之一。无论是角色的位置、速度,还是光照的方向、摄像机的朝向,几乎所有的空间概念都离不开向量。

什么是向量?

在几何意义上,向量是一个既有大小 (Magnitude/Length) 又有方向 (Direction) 的量。 在编程中,我们通常用一个包含 \(x, y\) (2D) 或 \(x, y, z\) (3D) 分量的结构体或类来表示。

struct Vector3 {
    float x, y, z;
};

向量的基本运算

加法与减法

向量的加法符合三角形法则。 - 加法\(A + B\) 表示从 \(A\) 的起点出发,经过 \(A\) 到达 \(A\) 的终点,再以 \(A\) 的终点为起点,经过 \(B\) 到达 \(B\) 的终点。结果向量是从 \(A\) 的起点指向 \(B\) 的终点。 - 应用:位置更新 (新位置 = 旧位置 + 位移)。 - 减法\(B - A\) 表示从 \(A\) 的终点指向 \(B\) 的终点的向量。 - 应用:计算从一个物体指向另一个物体的向量 (目标位置 - 玩家位置)。

Vector Operations

标量乘法

将向量的每个分量乘以一个标量 \(k\)。 - 应用:缩放物体,或者根据时间步长缩放速度向量 (\(Position += Velocity * \Delta t\))。

点积 (Dot Product)

点积是两个向量之间的一种运算,结果是一个标量。 公式:\(A \cdot B = |A| |B| \cos \theta\) 或者代数形式:\(A \cdot B = A_x B_x + A_y B_y + A_z B_z\)

Dot Product

几何意义

点积描述了两个向量方向的相似程度。 - 如果 \(A \cdot B > 0\),夹角小于 90度 (方向大致相同)。 - 如果 \(A \cdot B = 0\),夹角等于 90度 (垂直)。 - 如果 \(A \cdot B < 0\),夹角大于 90度 (方向大致相反)。

游戏中的应用

  1. 视野检测:判断敌人是否在玩家的前方。计算 (敌人位置 - 玩家位置) 与 玩家朝向向量 的点积。
  2. 光照计算:漫反射光照 (Lambert) 取决于光线方向与表面法线的点积。

叉积 (Cross Product)

叉积仅在 3D 空间中有定义,结果是一个新的向量,该向量垂直于参与运算的两个向量构成的平面。 公式:\(A \times B = (A_y B_z - A_z B_y, A_z B_x - A_x B_z, A_x B_y - A_y B_x)\)

Cross Product

几何意义

结果向量的方向遵循右手定则。大小等于以 \(A\) and \(B\) 为边的平行四边形的面积。

游戏中的应用

  1. 计算法线:通过三角形的两个边向量计算表面的法线。
  2. 判断左右:在 2D 游戏中 (将 z 轴视为 0),可以通过叉积的 z 分量判断一个向量在另一个向量的左侧还是右侧。
  3. 构建坐标系:给定前方向量和上方向量,通过叉积计算右方向量。

总结

掌握向量运算是进行 3D 编程和物理模拟的第一步。下一章我们将讨论矩阵与坐标变换。


< 上一篇: 三角函数入门 | 回到目录 | 下一篇: 矩阵与变换 >


By .