第 7 章 极坐标系 (Polar Coordinate Systems)
核心结论
-
2D 极坐标 = (距离 r, 角度 θ);与笛卡尔的互转靠
sin / cos;本质上描述"方向 + 距离",与向量语义天然契合。 -
别名 (aliasing):同一空间有无穷多极坐标表达;canonical 形式(
r ≥ 0、θ ∈ (-180°, +180°]、r=0 ⇒ θ=0)保证每个点只有唯一表达。 -
3D 极坐标分两种:柱坐标
(r, θ, z)——加线性距离;球坐标(r, θ, φ)——加角度。 -
heading / pitch 约定 (本书):h = 偏航(绕 y 轴,0° 朝 +z)、p = 俯仰(绕右臂轴,0° 水平,正值向下);与左手系 + 航空 / 游戏惯例对齐。
-
球坐标别名 + 万向锁 (Gimbal lock):pitch = ±90° 时 heading 无意义(奇异点);游戏相机与四元数旨在规避。
-
极坐标描述向量:与位置完全相同的算法,只是"从原点出发"换成"按给定方向走给定长度";物理书常用此约定描述力 / 位移。
|
本章主旨
本章补充笛卡尔之外的另一种坐标系——极坐标 / 柱坐标 / 球坐标。它们对"方向 + 距离"问题(雷达、相机朝向、地理定位、物理力)天然友好。理解别名 / canonical 形式是处理实际工程问题的前提(如相机控制、AI 追踪、空间索引)。第 8 章讲旋转表示时会再次碰到球坐标的万向锁问题。 |
一、核心概念
本章围绕 6 个核心概念展开:从 2D 极坐标出发,澄清别名与 canonical 形式,扩展到 3D 柱 / 球坐标,定义本书 heading / pitch 约定,最后给出极坐标描述向量的等价方法。
| 概念 | 定义 + 重要性 | 实现提示 |
|---|---|---|
2D 极坐标 |
|
§7.1.1; |
别名与 canonical 形式 |
同一空间有无穷多极坐标表达( |
§7.1.2;列表 7.1 C 代码给出了"to canonical"的算法。3D 球坐标需更复杂(heading + pitch)。 |
柱坐标 (cylindrical) |
2D 极坐标 + 线性 z 轴: |
§7.3.1;柱形环境 / 圆柱体建模时自然。 |
球坐标 (spherical) |
2D 极坐标 + 第二角度: |
§7.3.2-§7.3.3;§7.3.5 转换公式。球坐标用在雷达、地理(lat/long)、相机空间。 |
heading / pitch 约定 (本书) |
h = 水平偏航(绕 y 轴,0° 朝 +z,"北");p = 俯仰(绕右臂轴,0° 水平,正值向下)。匹配左手系 + 航空惯例。 |
§7.3.3;§7.3.4 canonical 形式:r≥0、h∈(-180°,180°]、p∈[-90°,+90°];万向锁时 h=0。 |
极坐标描述向量 |
同一对 |
§7.4;物理书常用此约定描述力 / 速度 / 位移向量。 |
二、详细笔记
2.1 2D 极坐标 (2D Polar Space)
What:用一对值 (r, θ) 描述 2D 平面上的点或向量:r = 距原点的距离,θ = 与极轴(通常 +x 方向)的夹角。
Why:天然描述"距离 + 方向"的问题(雷达、相机视野、追逐目标);与日常用语"向东 10 公里"自然对应。
How:
定位算法("两步走"):
-
从原点出发,面朝极轴方向;
-
逆时针旋转 θ(负值顺时针);
-
沿当前方向走 r 单位。
笛卡尔 ↔ 极坐标互转(式 7-1,§7.1.3):
atan2(y, x) 比 atan(y/x) 鲁棒——自动处理象限。
|
角度单位
书中文本常用度(°),但代码侧必须用弧度(rad)。 |
When:雷达;枪口 / 炮塔朝向;AI 视锥检测;地理定位(极地投影)。
Example:极坐标 (5, 30°) = 笛卡尔 (5cos30°, 5sin30°) ≈ (4.33, 2.5)。
2.2 别名与 Canonical 形式 (Aliasing & Canonical Form)
What:同一空间点有无穷多极坐标表达;canonical 形式("标准型")保证唯一性。
Why:相机控制、空间索引、几何查询都需要"同一点 = 同坐标"才能正确比较;别名会导致"`θ = 720°` 与 θ = 0° 被认为不同"的 bug。
How:
别名规则(§7.1.2):
常见特例:(-r, θ + 180°) ≡ (r, θ)、(r, θ + 360°k) ≡ (r, θ)。
2D Canonical 形式约束:
-
r ≥ 0(不测负距离)。 -
θ ∈ (-180°, +180°](半开区间,+180° 用于"西"方向)。 -
r = 0 ⇒ θ = 0(原点处角度无意义,强制设为 0)。
Canonical 转换算法(列表 7.1):
-
r = 0 ⇒ θ = 0。 -
r < 0 ⇒ r := -r; θ := θ + 180°。 -
θ ≤ -180° ⇒ θ := θ + 360°循环到范围内。 -
θ > +180° ⇒ θ := θ - 360°循环到范围内。
|
π 的浮点不精确
|
When:AI 路径点比较;相机角度插值(避免"转 720° 回到原位");几何哈希。
Example:(-5, 30°) 的 canonical 形式是 (5, 210°) ⇒ 经过 θ > 180° 减 360° ⇒ (5, -150°)。
2.3 3D 极坐标:柱与球 (Cylindrical & Spherical)
What:3D 极坐标分两种——柱坐标 (r, θ, z)(加线性 z 轴)和球坐标 (r, θ, φ)(加第二角度)。
Why:柱坐标自然描述柱形物体;球坐标自然描述"方向 + 距离"问题(雷达、相机、地理)。
How:
柱坐标(§7.3.1):在 2D 极坐标基础上加 z 轴(与 xy 平面垂直);
球坐标(数学界,§7.3.2):(r, θ, φ),θ = 与 +x 轴的水平夹角(azimuth),φ = 与 +z 轴的垂直夹角(zenith,0° = 北极);
|
数学界球坐标的缺陷(§7.3.3)
本书改用 heading / pitch 约定解决这些问题(§7.3.3)。 |
When:柱坐标用于柱形几何(管道、圆柱);球坐标用于雷达、地理、相机空间;高度场(游戏引擎常用"高度 + 球坐标"组合)。
Example:球坐标 (5, 45°, 90°)(数学界)= (5sin90°cos45°, 5sin90°sin45°, 5cos90°) = (3.54, 3.54, 0)——xy 平面上的点。
2.4 heading / pitch 约定 (Heading / Pitch Convention)
What:本书定义的球坐标约定——h = heading(水平偏航)、p = pitch(垂直俯仰);匹配左手系 + 航空惯例。
Why:跨引擎 / 跨物理引擎 / 跨论文时约定不一致会引发"+x 是前还是右"的方向混淆;heading / pitch 与 Unity / Unreal / 飞行模拟器惯例一致。
How:
约定(§7.3.3):
-
h (heading):绕 +y 轴(垂直轴)旋转,0° 朝 +z("北" / "前"),顺时针为正(左手系)。
-
p (pitch):绕右臂轴(即"右"向量)旋转,0° 水平,正值 向下(左手系一致)。
-
r:径向距离,r ≥ 0。
转换公式(式 7-3):
|
pitch 正值向下的"反直觉"
直觉上"抬头"应该是正 pitch,但本书用正向下的定义——这与左手系下"绕右臂顺时针"的正向一致。带来的好处:相机 / 飞行控制中"鼠标前推 = 视角下俯"自然对应 pitch 增加。 |
When:相机控制(FPS、飞行模拟);AI 视锥;物理引擎中的刚体朝向更新。
Example:heading / pitch = (45°, -30°) = "朝东北方看,向上 30°" = 笛卡尔方向约 (0.61, 0.50, 0.61)(标准化)。
2.5 球坐标别名与万向锁 (Spherical Aliasing & Gimbal Lock)
What:球坐标除 §2.2 的别名外还有 heading / pitch 互依 导致的额外别名与奇异点(万向锁)。
Why:万向锁是 3D 旋转 / 相机控制最常踩的坑——一旦 pitch = ±90°,heading 完全无意义,相机姿态自由度从 3 降到 2,会出现"无法转到的方向"。
How:
球坐标 canonical 形式(§7.3.4,本书约定):
-
r ≥ 0 -
h ∈ (-180°, +180°] -
p ∈ [-90°, +90°] -
r = 0 ⇒ h = p = 0 -
|p| = 90° ⇒ h = 0(万向锁)
额外别名(数学意义上):
例如"朝东转 90° 俯下 45°" ≡ "朝西转 90° 俯下 135°"(物体倒置但方向相同)。
万向锁:p = ±90° 时方向"垂直"(朝正上 / 正下),heading 任意值都指向同一方向——此时 heading 无意义。
|
万向锁的工程影响
|
When:所有用欧拉角做相机 / 刚体朝向的系统;FPS 游戏镜头;飞行模拟器;机器人关节。
Example:相机朝向 (h=0°, p=+90°) 时朝正上方看;(h=180°, p=+90°) 也朝正上方看——h 无效。
2.6 极坐标描述向量 (Polar Vectors)
What:同一对 (r, θ) 可描述点(位移从原点出发)或向量(按给定方向走 r);算法只差"是否回到原点"。
Why:物理书描述力 / 速度 / 位移常用极坐标;向量库可以同时支持"点模式"与"向量模式"——底层数据相同。
How:
向量极坐标解释(§7.4):
-
与定位算法 几乎相同,但去掉"从原点出发"——直接按
(r, θ)画一个有向线段。 -
与点的极坐标转换公式 完全相同(§7.1.3 公式对点 / 向量均适用)。
|
"向量是位置 + 极坐标 = 位移"
向量 vs 点的根本区别(§2.2)是"无位置"vs"有位置"。但当你用极坐标描述时:(r,θ) 描述 从原点出发 走 r 到某点——这恰好是 位移向量 的定义。所以极坐标下"向量"和"点"是同一对象的两种视角,无需区分。 |
When:物理引擎(力 / 速度 / 加速度用极坐标 / 球坐标描述);雷达(目标距离 + 方向);2D / 3D 子弹轨迹。
Example:力 (F, θ) = (10N, 30°) = "10 牛顿,朝东北方向" = 向量 (8.66, 5, 0) 牛顿。
三、关键图表
视觉图表
非可视化条目
|
非可视化条目(表 / 算法)
|
核心公式对照表
|
核心公式对照表
|
四、思维导图
mindmap
root((第 7 章 极坐标系))
2D极坐标
距离加角度
atan2互转
方向加距离语义
别名canonical
同一空间无穷表达
r非负theta半开
原点theta归零
3D柱坐标
极坐标加z轴
柱形几何
3D球坐标
两个角度
数学界约定
headingpitch约定
headingpitch
左手系航空
偏航绕y
俯仰绕右臂
别名万向锁
pitch正负90奇异
heading无效
解决方案四元数
极坐标向量
与点同算法
物理常用
力速度描述
五、重点与易错点
-
2D 极坐标的"别名" ≠"无解":任意
(r, θ)都对应唯一点;但一个点有无穷多极坐标表达——务必先 canonical 化再比较。 -
canonical 转换算法:先处理
r=0,再处理r<0,最后循环 θ 到(-180°, +180°];常见 bug 是忘了"半开区间"导致+180°与-180°都存在。 -
柱坐标 vs 球坐标:柱 = 加线性 z;球 = 加角度。柱形物体用柱坐标,"方向 + 距离"问题用球坐标。
-
heading / pitch 约定与数学界 (θ, φ) 不同:本书 h 是绕 y 轴、0° 朝 +z;p 0° 水平、正值向下。跨代码搬运时第一件事是验证约定。
-
pitch 正值向下是"反直觉"但工程必要:与左手系 + 飞行控制 + "鼠标前推 = 视角下俯"自然对应;不要试图"修正"成正值向上。
-
万向锁 = 自由度丢失:pitch = ±90° 时 heading 无意义;相机控制中应限制 pitch ∈ (-89°, +89°)。
-
heading / pitch 互依别名:
(h, p) ≡ (h ± 180°, 180° - p);调相机时若"转错方向"往往是别名 bug。 -
极坐标描述向量:与点完全相同的算法——
(r, θ)既可描述点也可描述向量;物理书描述力时常用此约定。 -
π 的浮点不精确:
M_PI不严格等于 π;canonical 算法可能产出θ = -π(理论上不在区间),实际工程中可接受。 -
跨章衔接:第 8 章欧拉角 / 四元数会再次提到万向锁;第 10 章相机空间用球坐标描述 fov;第 11 章力学用极坐标描述向心力。
-
应用提示:地理坐标(lat / long)是球坐标;游戏雷达 / 视野锥用极坐标;FPS 相机用 heading / pitch + 限制 pitch 范围规避万向锁。