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

游戏中的数学 (0) - 基础工具箱:三角函数

目录

引言

三角函数 (Trigonometry) 是游戏开发中处理旋转周期性运动角度计算的核心工具。 很多初学者看到 Sin, Cos 就头大,但只要理解了单位圆 (Unit Circle),一切都会变得直观起来。

1. 角度与弧度 (Degrees vs Radians)

在数学库中,你经常会看到两个版本的函数,或者需要进行转换。

为什么计算机喜欢弧度?

因为在微积分和泰勒级数展开中,使用弧度可以大大简化公式(例如 \(\frac{d}{dx}\sin(x) = \cos(x)\) 仅在 \(x\) 为弧度时成立)。

转换公式

\[ Rad = Deg \times \frac{\pi}{180} \] \[ Deg = Rad \times \frac{180}{\pi} \]

在 Unity/Unreal 中: - Mathf.Sin, Mathf.Cos 等大多数数学函数输入必须是弧度。 - transform.rotation (欧拉角) 在 Inspector 面板中显示的是角度。 - 务必注意区分!

2. 正弦 (Sin) 与 余弦 (Cos)

单位圆原理

想象一个半径为 1 的圆,圆心在原点 \((0,0)\)。 如果你从 X 轴正方向开始,逆时针旋转一个角度 \(\theta\): - \(\cos(\theta)\) 就是你在 X 轴 上的投影长度。 - \(\sin(\theta)\) 就是你在 Y 轴 上的投影长度。

Unit Circle

核心公式

\[ x = \cos(\theta) \times r \] \[ y = \sin(\theta) \times r \]

游戏中的应用

A. 圆周运动

想让一个物体绕着另一个物体转圈?

float angle = Time.time * speed; // 随时间增加的角度
float x = Mathf.Cos(angle) * radius;
float y = Mathf.Sin(angle) * radius;
transform.position = center + new Vector3(x, y, 0);

B. 波浪与悬浮 (Bobbing)

Sin 函数的值永远在 -1 到 1 之间循环。这非常适合做往复运动。 - 物品悬浮动画 - 水面波浪 - 呼吸灯效果

// 让物体上下浮动
float newY = originalY + Mathf.Sin(Time.time * frequency) * amplitude;
transform.position = new Vector3(transform.position.x, newY, transform.position.z);

3. 反正切 (Atan2)

已知角度求坐标用 Sin/Cos已知坐标求角度用什么?用 Atan2

为什么是 Atan2 而不是 Atan?

普通的 \(\tan(\theta) = \frac{y}{x}\),所以 \(\theta = \arctan(\frac{y}{x})\)。 但是,\(\frac{y}{x}\) 会丢失象限信息。例如 \(\frac{-1}{-1}\)\(\frac{1}{1}\) 都是 1,但一个在第三象限,一个在第一象限。而且当 \(x=0\) 时会除以零。

Atan2(y, x) 解决了这个问题。它接受两个参数,能正确返回 \((-\pi, \pi]\) 之间的所有角度。

Atan2 Visual

游戏中的应用:朝向目标 (Look At)

这是 Atan2 最经典的应用。玩家在 \((px, py)\),敌人出现在 \((tx, ty)\),玩家应该旋转多少度才能面向敌人?

  1. 计算差值向量:\(dx = tx - px, dy = ty - py\)
  2. 计算弧度:\(radians = \text{Atan2}(dy, dx)\)
  3. 转换为角度并应用旋转。
Vector2 direction = target.position - player.position;
float angleRad = Mathf.Atan2(direction.y, direction.x);
float angleDeg = angleRad * Mathf.Rad2Deg;

// 在 2D 中应用旋转 (Z轴)
player.rotation = Quaternion.Euler(0, 0, angleDeg);

总结

函数 输入 输出 典型应用
Sin/Cos 角度 (弧度) 坐标 (-1 到 1) 圆周运动、波浪、震动
Atan2 坐标 (y, x) 角度 (弧度) 让角色看向鼠标、炮塔瞄准

记住:Sin 对应 Y (上下),Cos 对应 X (水平)(在标准数学坐标系中)。在 3D 游戏中,Y 轴通常是垂直方向,所以平面圆周运动通常是 X 和 Z 轴,这时候 \(x=\cos, z=\sin\)


< 上一篇: 标量数学 | 回到目录 | 下一篇: 向量 >


By .