2025-11-30 · game_math
【游戏中的数学】游戏中的数学 (7) - 相交检测
从射线检测到包围盒碰撞。详解 Raycast 原理、AABB 碰撞检测算法以及它们在物理引擎中的应用。
前置阅读:建议先阅读向量(点积、归一化)。
“距离”是游戏中判断互动的核心标准。 - 玩家是否进入了怪物的攻击范围? - 赛车离终点还有多远? - 摄像机是否穿墙了?
这是最常用的直线距离。 \[ d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2} \]
在代码中:
float dist = Vector3.Distance(a, b);
// 或者
float dist = (a - b).magnitude;在网格地图(如《火焰纹章》或《文明》)中,你不能斜着走,只能沿格子走。此时距离是 x 轴差值与 y 轴差值的和。 \[ d = |x_2-x_1| + |y_2-y_1| \]
计算 sqrt (开平方) 是一个相对昂贵的操作。
如果你只是想比较距离(例如:谁离我更近?或者是否在攻击范围内?),你完全不需要开平方。
判断 dist < range 等价于判断
distSq < range * range。
float distSq = (target.position - player.position).sqrMagnitude;
float attackRangeSq = attackRange * attackRange;
if (distSq < attackRangeSq) {
// 在攻击范围内
}这在需要检测成百上千个物体时能显著提升性能。
平面在游戏中通常用于墙壁、地面或触发区域。 一个平面由一个法线 (Normal) \(\vec{n}\) 和一个距离常数 \(d\) 定义。 方程:\(\vec{n} \cdot P + d = 0\)
将任意点 \(P\) 代入平面方程,得到的结果不仅仅是 0。 \[ dist = \vec{n} \cdot P + d \]
如何计算点 \(P\) 到直线 \(AB\) 的最短距离?
点到直线距离的计算本质是向量投影。如果你对投影的概念还不太熟悉,可以回顾向量一章中的投影部分。
核心思想:将 \(\vec{AP}\) 投影到直线方向 \(\vec{AB}\) 上,投影点就是直线上离 \(P\) 最近的点。\(P\) 到该投影点的距离就是所求。
这需要用到投影 (Projection)。
这在赛车游戏中非常有用,用于计算车辆偏离赛道中心线的距离。
< 上一篇: 四元数 | 回到目录 | 下一篇: 相交检测 >
把当前热点继续串成多页阅读,而不是停在单篇消费。
2025-11-30 · game_math
从射线检测到包围盒碰撞。详解 Raycast 原理、AABB 碰撞检测算法以及它们在物理引擎中的应用。
2025-11-30 · game_math
详解游戏引擎中常用的标量数学函数:Lerp, InverseLerp, Remap, Clamp, SmoothStep 等。不仅有公式,更有实际应用场景。
2025-11-30 · game_math
深入浅出地讲解游戏开发中的三角函数:Sin, Cos, Atan2。从单位圆原理到圆周运动、波浪动画和朝向计算的实际应用。
2025-11-30 · game_math
深入理解游戏开发中的矩阵:TRS 变换与代码实践、矩阵乘法与组合变换、MVP 管线详解、逆矩阵、法线变换,以及旋转表示方式对比。
前置阅读:建议先阅读向量(点积、归一化)。
“距离”是游戏中判断互动的核心标准。 - 玩家是否进入了怪物的攻击范围? - 赛车离终点还有多远? - 摄像机是否穿墙了?
这是最常用的直线距离。 \[ d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2} \]
在代码中:
float dist = Vector3.Distance(a, b);
// 或者
float dist = (a - b).magnitude;在网格地图(如《火焰纹章》或《文明》)中,你不能斜着走,只能沿格子走。此时距离是 x 轴差值与 y 轴差值的和。 \[ d = |x_2-x_1| + |y_2-y_1| \]
计算 sqrt (开平方) 是一个相对昂贵的操作。
如果你只是想比较距离(例如:谁离我更近?或者是否在攻击范围内?),你完全不需要开平方。
判断 dist < range 等价于判断
distSq < range * range。
float distSq = (target.position - player.position).sqrMagnitude;
float attackRangeSq = attackRange * attackRange;
if (distSq < attackRangeSq) {
// 在攻击范围内
}这在需要检测成百上千个物体时能显著提升性能。
平面在游戏中通常用于墙壁、地面或触发区域。 一个平面由一个法线 (Normal) \(\vec{n}\) 和一个距离常数 \(d\) 定义。 方程:\(\vec{n} \cdot P + d = 0\)
将任意点 \(P\) 代入平面方程,得到的结果不仅仅是 0。 \[ dist = \vec{n} \cdot P + d \]
如何计算点 \(P\) 到直线 \(AB\) 的最短距离?
点到直线距离的计算本质是向量投影。如果你对投影的概念还不太熟悉,可以回顾向量一章中的投影部分。
核心思想:将 \(\vec{AP}\) 投影到直线方向 \(\vec{AB}\) 上,投影点就是直线上离 \(P\) 最近的点。\(P\) 到该投影点的距离就是所求。
这需要用到投影 (Projection)。
这在赛车游戏中非常有用,用于计算车辆偏离赛道中心线的距离。
< 上一篇: 四元数 | 回到目录 | 下一篇: 相交检测 >
把当前热点继续串成多页阅读,而不是停在单篇消费。
2025-11-30 · game_math
从射线检测到包围盒碰撞。详解 Raycast 原理、AABB 碰撞检测算法以及它们在物理引擎中的应用。
2025-11-30 · game_math
详解游戏引擎中常用的标量数学函数:Lerp, InverseLerp, Remap, Clamp, SmoothStep 等。不仅有公式,更有实际应用场景。
2025-11-30 · game_math
深入浅出地讲解游戏开发中的三角函数:Sin, Cos, Atan2。从单位圆原理到圆周运动、波浪动画和朝向计算的实际应用。
2025-11-30 · game_math
深入理解游戏开发中的矩阵:TRS 变换与代码实践、矩阵乘法与组合变换、MVP 管线详解、逆矩阵、法线变换,以及旋转表示方式对比。