引言
三角函数 (Trigonometry)
是游戏开发中处理旋转、周期性运动和角度计算的核心工具。
很多初学者看到 Sin, Cos
就头大,但只要理解了单位圆 (Unit
Circle),一切都会变得直观起来。
1. 角度与弧度 (Degrees vs Radians)
在数学库中,你经常会看到两个版本的函数,或者需要进行转换。
- 角度 (Degrees): 一个圆是 360 度。符合人类直觉。
- 弧度 (Radians): 一个圆是 \(2\pi\) (约 6.28) 弧度。符合计算机和数学家的直觉。
为什么计算机喜欢弧度?
因为在微积分和泰勒级数展开中,使用弧度可以大大简化公式(例如 \(\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 轴 上的投影长度。
核心公式
\[ 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]\)
之间的所有角度。
游戏中的应用:朝向目标 (Look At)
这是 Atan2 最经典的应用。玩家在 \((px, py)\),敌人出现在 \((tx,
ty)\),玩家应该旋转多少度才能面向敌人?
- 计算差值向量:\(dx = tx - px, dy = ty - py\)
- 计算弧度:\(radians = \text{Atan2}(dy, dx)\)
- 转换为角度并应用旋转。
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\)。
< 上一篇: 标量数学 | 回到目录 | 下一篇: 向量 >