Homogenous Coordinates(图形学入门笔记 #1)

在坐标系中可以利用矩阵乘法来表示各种不同的线性变换,例如:缩放,旋转等。但是想要表示平移变换,只利用矩阵乘法会遇到困难。

假设想要把一个位于(x,y)的点平移到(x+t_x,y+t_y),应该进行的操作为

    \[\begin{pmatrix}x' \\ y'\end{pmatrix}= \begin{pmatrix}1\ 0 \\ 0\ 1\end{pmatrix}\begin{pmatrix}x \\ y\end{pmatrix} +\begin{pmatrix}t_x \\ t_y\end{pmatrix}\]

齐次坐标(Homogenous Coordinates)的引入使我们可以更加方便地表示平移操作,对于一个在笛卡尔二维坐标系中的点(x,y),在齐次坐标系中表示为(x,y,1)。同样地,对于笛卡尔坐标系中的向量(x,y),在齐次坐标系中表示为(x,y,0)

我们尝试在齐次坐标系中表示平移操作,考虑上文中的例子,可以得到

    \[\begin{pmatrix}x+t_x \\ y+t_y \\ 1\end{pmatrix}= \begin{pmatrix}1\ 0\ t_x \\ 0\ 1\ t_y \\ 0\ 0\ 1\end{pmatrix}\begin{pmatrix}x \\ y \\ 1\end{pmatrix}\]

    \[\begin{pmatrix}x \\ y \\ 0\end{pmatrix}= \begin{pmatrix}1\ 0\ t_x \\ 0\ 1\ t_y \\ 0\ 0\ 1\end{pmatrix}\begin{pmatrix}x \\ y \\ 0\end{pmatrix}\]

从上面的式子可以看出,在齐次坐标中,实现了只通过矩阵乘法变换完成平移操作,同时在对于向量进行平行时保证了向量的平移不变性。

继续探究点与向量之间的运算,我们可以发现在齐次坐标系中,这些运算都是符合数学规律的,例如在齐次坐标下计算两个向量的减法,结果仍然是一个向量;计算两个点的减法,结果同样是一个向量;计算一个点加上一个向量,结果还是一个点。

而如果计算两个点的加法,我们会发现第三维得到了2。为了使运算有意义,我们对齐次坐标进行一个补充,即

    \[\begin{pmatrix}x \\ y \\ w\end{pmatrix}= \begin{pmatrix}x/w \\ y/w \\ 1\end{pmatrix}(w \neq 0)\]

那么两个点的加法得到的结果为一个点,且这个点是两个点连线的中点。

接下来我们将笛卡尔坐标下的操作在齐次坐标下表示:

缩放:

    \[S(s_x,s_y)= \begin{pmatrix}s_x\ 0\ 0 \\ 0\ s_y\ 0 \\ 0\ 0\ 1\end{pmatrix}\]

旋转:

    \[R(\alpha)= \begin{pmatrix}cos\alpha\ -sin\alpha\ 0 \\ sin\alpha\ \ \ cos\alpha\ \ 0 \\ 0\ \ \ \ \ \ 0\ \ \ \ \ \ 1\end{pmatrix}\]

平移:

    \[T(t_x,t_y)= \begin{pmatrix}1\ 0\ t_x \\ 0\ 1\ t_y \\ 0\ 0\ 1\end{pmatrix}\]

另外,齐次坐标下的逆变换同样对应矩阵的逆,同样不满足交换律。

三维笛卡尔坐标系下的点和向量也可以表示成齐次坐标:

3D Point : (x,y,z,1)^T

3D Vector : (x,y,z,0)^T

(x,y,z,w)^T=(x/w,y/w,z/w,1)^T

三维坐标下的一个任意变换可以表示为齐次坐标下的一个矩阵乘法,即:

    \[\begin{pmatrix}x' \\y' \\z' \\1\end{pmatrix}=\begin{pmatrix}a &b &c &t_x \\d &e &f &t_y \\g &h &i &t_z \\0 &0 &0 &1 \\\end{pmatrix}\begin{pmatrix}x \\y \\z \\1\end{pmatrix}\]

其中左上角的3\times 3表示线性变换,右上的1\times 3表示平移变换,最下面一行永远是0 0 0 1

对于这样的一个矩阵,永远是先进行线性变换,再进行平移操作。

(未完待续~)