跳转至

齐次坐标

引言:两个平行线可以相交?

在欧几里得空间中,同一平面上的两条平行线永不相交。然而,在射影空间(projective space)中并不是这样。如下图所示,两条平行的铁轨在地平线上相遇,交点是一个无穷远的点。

欧几里得空间(或者笛卡尔空间)能够很好地描述2D/3D几何,但它不足以处理射影空间。事实上,欧几里得几何(Euclidean geometry)是射影几何(projective geometry)的子集。

  • 二维点的笛卡尔坐标可以表示为\((x,y)\)
  • 如果是无穷大的点,笛卡尔坐标用\((\infty, \infty)\)表示。但它在欧几里得空间中变得毫无意义,因为我们无法用\((\infty, \infty)\)做数学计算

因此,平行线在射影空间中应该在无穷远处相交,但在欧几里得空间中不能相交。August Ferdinand Möbius引入齐次坐标解决这个问题。


齐次坐标是用\(N+1\)个数字表示N维坐标的一种方法。例如,二维笛卡尔坐标为\((x,y)\),而二维齐次坐标即是\((x,y,w)\)

例如

  • 笛卡尔坐标\((1,2)\),在齐次坐标中是\((1,2,1)\)
  • 如果点\((1,2)\)移动到无穷远,那么移动之后的齐次坐标是\((1,2,0)\)。这是因为\((1/0, 2/0)≈(\infty, \infty)\)

齐次坐标

齐次坐标(Homogeneous coordinates)是用\(N+1\)个数字表示\(N\)维坐标的一种方法。

例如,二维齐次坐标与二维笛卡尔坐标

  • 两者转换只需除以\(w\)\(w=1\)时,即是笛卡尔坐标)

用齐次坐标,如何表示点和矢量。以二维齐次坐标为例

  1. \(Point_{2d} = (x,y,w), w≠0\)
  2. \(Vector_{2d} = (x,y,0),即w=0\)

齐次坐标的运算

  1. \(vector + vector = vector\)
  2. \(point - point = vector\)
  3. \(point +vector = point\)
  4. \(point + point = 两个点的中点\)

扩展

为什么叫“齐次“

将二维齐次坐标转成二维笛卡尔坐标,我们可以发现一个重要事实

不难发现,以上例子的二维齐次坐标都等同于\((1/3, 2/3)\)的笛卡尔坐标。
因此,这些点是“齐次的”,因为它们在欧几里得空间(笛卡尔空间)中表示的是同一个点。换句话说,齐次坐标是尺度不变的(scale invariant)。

为什么向量w分量为0

向量体现的是方向性,即具有平移不变性的特征。即,若向量的齐次坐标在参与平移矩阵变换之后,所得的结果不变。

举个例子,三维向量(1,0,0)、三维点(0,0,0),做一个(0,2,0)的平移变换

按照我们的直观感受

  1. \((0,0,0) + (0,2,0)\),因此顶点坐标就变成\((0,2,0)\)
  2. 而法向量,\((1,0,0)+(0,2,0)\),变成\((1,2,0)\)。这当然是错的,平移之后,向量应该还是为\((1,0,0)\),因为向量没有位置,只有方向

那为什么会错呢?本质上,还是将向量齐次坐标中的w当成了1,因此结果错了

\[ n_{new} = M * n_{old} = \begin{pmatrix} 1 && 0 && 0 && 0 \\ 0 && 1 && 0 && 2 \\ 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \end{pmatrix} * \begin{pmatrix} 1 \\ 0 \\ 0 \\ 1 \end{pmatrix} = \begin{pmatrix} 1 \\ 2 \\ 0 \\ 1 \end{pmatrix} \]

实际上,向量齐次坐标中的w其实是0,如下所示,计算结果还是\((1,0,0,0)\)

\[ n_{new} = M * n_{old} = \begin{pmatrix} 1 && 0 && 0 && 0 \\ 0 && 1 && 0 && 2 \\ 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \end{pmatrix} * \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix} = \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix} \]

作用

证明:两个平行线可以相交

考虑欧几里得空间中的两条平行线

  1. \(C≠D\),上述方程无解,即没有两条平行线没有交点
  2. \(C =D\),则两条平行线重叠

若我们将笛卡尔坐标改为齐次坐标,即获得射影空间中两条平行线的方程

  • 即,将\(x\)\(y\)分别替换为\(x/w\)\(y/w\)(引入了新的自变量\(w\)

  • 联立方程组,可获得\((C-D)w = 0\),解除\(w=0\)
  • 因此,在射影空间中,两条平行线将相交于\((x, y, 0)\)

统一所有变换

平移变换不能写成矩阵乘法的形式

下图展示的是二维笛卡尔空间下的平移变换。如此看来,二维平移变换很简单,只需对坐标值加上一个平移量即可。

下图展示的是二维笛卡尔空间中线性变换的矩阵,它可以涵盖缩放变换、镜像变换、切变变换和旋转变换,只需要一个2x2的矩阵与点坐标相乘。


值得考虑的是,能否把平移\((tx, ty)\)也容纳到上图中的\(M\)当中呢?如果可以的话,平移变换就可以和线性变换做统一了,如此计算也很方便。

根据矩阵乘法,我们发现不可以。我们只能写成如下形式,不能写成\(x' = M * x\)的形式。即,平移变换只能写成矩阵加法的形式,不能写成矩阵乘法的形式。

因此,也可以看出,平移变换不属于线性变换。

解决方案

引入齐次坐标,即可“统一所有变换”。具体做法是:给向量和矩阵升一个维度

  • 给二维点增加一个维度,第三维度为1。即把笛卡尔二维点表示成\((x,y,1)\)
  • 给二维向量增加一个维度,第三维度为0。即把笛卡尔二维向量表示成\((x,y,0)\)

如此,平移变换就可以写成矩阵乘法的形式了

如上,我们用齐次坐标就可以把各式各样的变换都统一表示成矩阵的形式。
它的代价就是向量和矩阵都升了维,带来的便是存储和计算多了。
但这个代价还算蛮小的。这正是人们在做取舍(trade off),宁愿多点计算和存储,也要统一所有变换。

参考文章

  1. Homogeneous Coordinates (songho.ca)
  2. 《GAMES101》