笛卡尔积坐标不是精确绘制空间和定义位置的唯一系统。它的替代方案是极坐标系(Polar Coordinate System)。

7.1 关于二维极坐标空间

7.1.1 使用二维极坐标定位点

二维极坐标空间和笛卡尔积一样,也有一个原点,它叫做极点(Pole),但在轴上和笛卡尔积不同,它就一个轴,称为极轴(Polar Axis),它通常被描述为来自原点的射线。在数学上,极轴是指向右侧,因此它对应笛卡尔坐标中的+x+x轴,如下图所示:

二维极坐标空间

笛卡尔坐标中,使用有符号距离xyx、y来描述一个二维点。而在极坐标中使用一个距离和一个角度来表示二维点。二维极坐标(r,θ)(r,\theta)指定二维空间中的点,rr是半径,也表示从原点向前移动rr个单位的距离;θ\theta是角度(也可以用弧度表示),它的正值通常被解释为逆时针旋转,负值解释为顺时针旋转。如下图表示:

使用二维极坐标定位点

上图极坐标系图中的同心圆,表示rr相同的点的集合,图中的直线则表示θ\theta相同的点的集合。

7.1.2 别名

在笛卡尔坐标系下,一个点只有一个表示。但是在极坐标系下,一个点有无数个表示。如过两个表示实际上是指同一个点,那么称这两个表示互为对方的别名(Aliasing)。

如果有点表示为(r,θ)(r,\theta),那么所有它的别名可以表示为((1)kr, θ+k180)((-1)^kr,\ \theta+k180^{\circ}),其中kk为任何整数。

极坐标中还有歧义性(singularity),即当r=0r=0时,无论θ\theta取何值,结果都没有区别。

别名和歧义性本身并不会引发任何问题,只不过表达起来存在困难而已。对于极坐标来说,描述任何给定的“首选”方式称为该点的规范坐标(Canonical Coordinate)。如果rr是非负的,并且在(180,+180](-180^{\circ},+180^{\circ}]区间内,则二维极坐标对(r,θ)(r,\theta)在规范集内。如果原点直接朝“西”的点(x<0,y<0),将使用θ=+180\theta=+180^{\circ}。如果极坐标对(r,θ)(r,\theta)要在规范集中,则需要满足以下的三个条件:

f(x)={r0不会测量向后的距离180<θ180角度限制为1/2圈,使用+180代表朝西r=0  θ=0在原点处,将角度设置为零f(x)= \begin{cases} r \geq 0 & 不会测量\textbf{向后}的距离 \\ -180^{\circ} < \theta \leq 180^{\circ} & 角度限制为1/2圈,使用+180^{\circ}代表朝\textbf{西} \\ r=0\ \Rightarrow\ \theta=0 & 在原点处,将角度设置为零 \end{cases}

可以通过以下方法将极坐标对(r,θ)(r,\theta)转换为其规范形式:

  1. 如果r=0r=0,则指定θ=0\theta = 0
  2. 如果r<0r <0,则取反rr,并向θ\theta加上180180^{\circ}
  3. 如果θ180\theta \leq -180^{\circ},则将360360^{\circ}加到θ\theta上,直到θ>180\theta > -180^{\circ}
  4. 如果θ>180\theta > 180^{\circ},则从θ\theta减去360360^{\circ},直到θ180\theta \leq 180^{\circ}

7.1.3 关于二维中笛卡尔坐标和极坐标之间的变换

二维极坐标和笛卡尔坐标之间的变换示意图:

极坐标和笛卡尔坐标之间的交换

将极坐标对(r,θ)(r,\theta)变换为相应的笛卡尔坐标,可以用正弦和余弦得到以下定义:

x=rcosθ,y=rsinθx=r\cos\theta,\quad y=r\sin\theta

再由毕达哥拉斯定理可得r=x2+y2r=\sqrt{x^2+y^2}。而θ\theta计算如下:

yx=rsinθrcosθ,yx=tanθ,θ=arctan(y/x)\begin{align} \frac{y}{x}&=\frac{r\sin\theta}{r\cos\theta},\\ \frac{y}{x}&=\tan\theta,\\ \quad\theta&=\arctan{(y/x)} \end{align}

arctan(y/x)\arctan{(y/x)}的表达式存在两个问题,第一是当x=0x=0时,表达式的除法是未定义的。第二是arctan\arctan的范围为[−90∘,+90∘]。这个原因是y/xy/x隐藏了一部分信息:和xxyy分别存在正负,所以一共有4种组合,但是y/xy/x却只有两个结果。直到这些则可以定义出新的函数atan2atan2

atan2(y,x)={0,x=0,y=0+90,x=0,y>090,x=0,y<0arctan(y/x),x>0arctan(y/x)+180,x<0,y0arctan(y/x)180,x<0,y<0atan2(y,x)= \begin{cases} 0, & x=0,y=0 \\ +90^{\circ}, & x=0,y>0 \\ -90^{\circ}, & x=0,y<0 \\ arctan(y/x), & x > 0 \\ arctan(y/x)+180^{\circ}, & x<0,y\geq0 \\ arctan(y/x)-180^{\circ}, & x<0,y<0 \end{cases}

则有将二维笛卡尔坐标变换为极坐标公式:

r=x2+y2;θ=atan2(y,x)r=\sqrt{x^2+y^2};\quad\quad \theta=atan2(y,x)

7.2 为什么会有人使用极坐标?

极坐标是一种表示平面上点位置的坐标系,它以点到原点的距离(称为极径)和点与极轴的夹角(称为极角)来描述点的位置。相对于直角坐标系,极坐标更适合描述圆形和环形结构,因为它们的对称性更明显。

以下是一些人们使用极坐标的原因:

  1. 易于描述圆形结构:极坐标非常适合描述圆形结构,例如齿轮、风车、花瓣等。在这些情况下,使用极坐标可以使得坐标系更加简洁明了。
  2. 易于计算极角和极径:在某些情况下,计算一个点的极坐标可能比计算它的直角坐标更加容易。例如,当你知道一个点在原点和另一个点之间的夹角和距离时,你可以更容易地计算出该点的极坐标。
  3. 可以更好地可视化数据:在某些情况下,使用极坐标可以更好地可视化数据。例如,对于某些类型的数据,如温度、湿度等,你可以将这些数据表示为一个环形图,其中每个数据点代表一个角度和一个距离。

总的来说,极坐标是一种非常有用的工具,可以使得对于某些特定的问题和数据集更容易和更直观地理解和处理。

7.3 关于三维极坐标空间

二维的极坐标有两个坐标值了,那么在三维中添加第三个坐标值有两种选择,一种是添加一个线性距离(如rr),这样我们会得到一个圆柱坐标(Cylindrical Coordinate);另一种是添加一个角度(如θ\theta),这样我们将得到一个球面坐标(Spherical Coordinate)。

7.3.1 圆柱坐标

我们添加一个向上的zz轴来表示圆柱坐标(r,θ,z)(r,\theta,z)。如图所示:

圆柱坐标

7.3.2 球面坐标

我们添加一个角度ϕ\phi来表示球面坐标(r,θ,ϕ)(r,\theta,\phi)。如图所示:

数学专业人士使用的球面坐标

描述极坐标在三维中的点会进过一下几个步骤:

  1. 首先站在原点,面向水平极轴的方向。垂直的指向是从脚指向头部。右臂向上,指向垂直极轴的方向。
  2. 逆时针旋转角度θ\theta
  3. 将右臂向下旋转角度ϕ\phi。你的手臂现在指向极角θ\thetaϕ\phi指定的方向。
  4. 沿着右臂的方向从原点位移距离rr。到达(r,θ,ϕ)(r,\theta,\phi)所描述的点。

θ\theta被称为方位角(Azimuth),ϕ\phi被称为天顶角(Zenith)。在地球仪中经度(Longitude)对应的为θ\theta,维度(Latitude)对应的为90ϕ90^{\circ}-\phi,海拔(Altitude)对应rr

7.3.3 在三维虚拟世界中有用的一些极坐标约定

之前章节描述的是数学层面上的极坐标系,但在3D游戏的使用中,数学层面的极坐标系存在以下问题:

  • θ=0\theta=0的位置,对应+x+x方向,但是希望对应的反向是+z+z方向。
  • ϕ=0\phi=0的位置,对应的是+y+y方向,但这样的话当ϕ=0\phi=0时,并不等于二维的极坐标系。而在(r,θ,90)(r,\theta,90^{\circ})时才等同于二维坐标系。
  • θ\thetaϕ\phi不方便记忆。

为此,3D游戏中的极坐标系做了如下改变

  • 水平角度θ\theta命名为hh(航向,heading),且当h=0h=0时指向+z+z方向。旋转正方向从yy轴正方向看为顺时针。
  • 垂直角度ϕ\phi命名为pp(俯仰,pitch),当p=0p=0时,为水平角度,旋转正方向为向下。

3D游戏中的极坐标系如下图所示:

本书中使用的航向角和俯仰角

7.3.4 球面坐标的别名

三维坐标中同样存在别名和歧义性。

  1. 当r取反时,h+k180h+k180^{\circ},并且p=pp=-p即能获得一样的值(别名)
  2. r=0r=0时,hhpp取任意值都没有区别。(歧义性)
  3. (h,p)(h,p)可以表示为(h±180,180p)(h\pm180^{\circ},180^{\circ}-p)(别名) 如hh向右转9090^{\circ}pp向下转4545^{\circ},等同于hh向左转9090^{\circ}pp向下转135135^{\circ}
  4. p=±90p=\pm90^{\circ}时,hh取任意值没有区别(歧义性)(万向节死锁,gimbal lock)。

如同在二维中做的一样,我们可以定义一组规范的球形坐标。这样,三维空间中的任何点都可以映射到规范集合中的一个坐标三元组(Triple)。规范球面坐标需要满足以下条件:

{r0我们不会测量向后的距离180<h180航向限制为1/2圈。使用+180袋面朝南r=0    h=p=0在原点处,将角度设置为零p=90    h=0在直接向上或向下看时,设置航向为0\begin{cases} r\geq0&我们不会测量\textbf{向后}的距离 \\ -180^{\circ}<h\leq180^{\circ} & 航向限制为1/2圈。使用+180^{\circ}袋面朝南 \\ r=0\ \ \Rightarrow \ \ h=p=0 & 在原点处,将角度设置为零 \\ |p|=90^{\circ}\ \ \Rightarrow \ \ h=0 & 在直接向上或向下看时,设置航向为0 \end{cases}

可以通过以下方法将球面坐标(r,h,p)(r,h,p)转换为其规范形式:

  1. 如果r=0r=0,则指定h=p=0h=p=0
  2. 如果r<0r<0,则将rr变负,给hh180180^{\circ},并使pp变负。
  3. 如果p<90p<-90^{\circ},则给pp360360^{\circ},直到p90p\geq-90^{\circ}$。
  4. 如果p>270p>270^{\circ},则给pp减去360360^{\circ},直到p270p\leq270^{\circ}
  5. 如果p>90p>90^{\circ},则给hh180180^{\circ},直到p=180pp=180^{\circ}-p
  6. 如果h190h\leq-190^{\circ},则给hh360360^{\circ},直到h>180h>-180^{\circ}
  7. 如果h>180h>180^{\circ},则从hh减去360360^{\circ},直到h180h\leq180^{\circ}

7.3.5 球面坐标和笛卡尔坐标之间的转换

球坐标系与笛卡尔坐标系的转换图如下所示(数学表示):

数学专业人士使用的球面坐标和笛卡尔坐标

我们引进了一个新的变量dd,它是点与垂直轴之间的水平距离。我们很容易得到:

d=rsinϕ,x=dcosθ=rsinϕcosθ,y=dsinθ=rsinϕsinθ,z=rcosϕd=r\sin\phi,\\ x=d\cos\theta=r\sin\phi\cos\theta,\quad y=d\sin\theta=r\sin\phi\sin\theta,\quad z=r\cos\phi

适用于3D游戏场景中的球面坐标则可以表示为:

x=rcospsinh,y=rsinp,z=rcospcosh,y/r=sinpx=r\cos{p}\sin{h},\quad y=-r\sin{p},\quad z=r\cos{p}\cos{h},\\-y/r=\sin{p}

则有笛卡尔坐标转换为球面坐标公式:

r=x2+y2+z2;h=atan2(x,z);p=arcsin(y/r)r=\sqrt{x^2+y^2+z^2};\quad h=atan2(x,z);\quad p=arcsin(-y/r)

7.4 使用极坐标指定向量

极坐标直接描述向量的两个关键属性——方向和长度。


引用:

  1. Dunn, F. and Parberry, I. (2011). 3D math primer for graphics and game development 2nd2^{nd}.