引言
在游戏开发中,向量 (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\) 的终点的向量。 - 应用:计算从一个物体指向另一个物体的向量 (目标位置 - 玩家位置)。
标量乘法
将向量的每个分量乘以一个标量 \(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\)
几何意义
点积描述了两个向量方向的相似程度。 - 如果 \(A \cdot B > 0\),夹角小于 90度 (方向大致相同)。 - 如果 \(A \cdot B = 0\),夹角等于 90度 (垂直)。 - 如果 \(A \cdot B < 0\),夹角大于 90度 (方向大致相反)。
游戏中的应用
- 视野检测:判断敌人是否在玩家的前方。计算 (敌人位置 - 玩家位置) 与 玩家朝向向量 的点积。
- 光照计算:漫反射光照 (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)\)
几何意义
结果向量的方向遵循右手定则。大小等于以 \(A\) and \(B\) 为边的平行四边形的面积。
游戏中的应用
- 计算法线:通过三角形的两个边向量计算表面的法线。
- 判断左右:在 2D 游戏中 (将 z 轴视为 0),可以通过叉积的 z 分量判断一个向量在另一个向量的左侧还是右侧。
- 构建坐标系:给定前方向量和上方向量,通过叉积计算右方向量。
总结
掌握向量运算是进行 3D 编程和物理模拟的第一步。下一章我们将讨论矩阵与坐标变换。