理解齐次坐标的意义
图形学中中对于矩阵常涉及的操作有以下几种:
- 缩放
- 旋转
- 平移
在介绍为什么要引入齐次坐标之前先介绍这三个操作的线性代数的表达形式。为了说明方便以二维进行举例说明。
缩放
假设有一个向量为\([x1,y1]\),那么如果要使得沿着x轴和y轴方向分别伸缩\(k_x,k_y\)倍,写成矩阵的形式如下:
\[\begin{equation}
{
\left[ \begin{array}{ccc}
x2\\
y2\\
\end{array}
\right ]}={
\left[ \begin{array}{ccc}
k_x & 0\\
0 & k_y\\
\end{array}
\right ]}{
\left[ \begin{array}{ccc}
x1\\
y1\\
\end{array}
\right ]}
\end{equation}
\]
旋转
\[\begin{equation}
{
\left[ \begin{array}{ccc}
x2\\
y2\\
\end{array}
\right ]}={
\left[ \begin{array}{ccc}
cos\theta & -sin\theta\\
sin\theta & cos\theta\\
\end{array}
\right ]}{
\left[ \begin{array}{ccc}
x1\\
y1\\
\end{array}
\right ]}
\end{equation}
\]
平移
平移很好理解,即
\[\begin{equation}
{
\left[ \begin{array}{ccc}
x2\\
y2\\
\end{array}
\right ]}={
\left[ \begin{array}{ccc}
x1\\
y1\\
\end{array}
\right ]}+{
\left[ \begin{array}{ccc}
tx\\
ty\\
\end{array}
\right ]}
\end{equation}
\]
但是我们可以看到只有平移的运算是加法,而旋转和缩放都是矩阵乘法,如果平移也能用乘法表示的话,我们就可以通过矩阵连乘的方式很方便的对矩阵做旋转、平移和缩放操作了,所以也就引入了齐次坐标的概念。
齐次坐标
引入齐次坐标其实就是升维,将图像从平面2D坐标变成3D坐标。我们看看平移变换在三维中的矩阵形式:
\[\begin{equation}
{
\left[ \begin{array}{ccc}
x2\\
y2\\
1\\
\end{array}
\right ]}={
\left[ \begin{array}{ccc}
1 & 0 & tx\\
0 & 1 & ty\\
0 & 0 & 1\\
\end{array}
\right ]}{
\left[ \begin{array}{ccc}
x1\\
y1\\
1\\
\end{array}
\right ]}
\end{equation}
\]
可以看到公式4和公式3的结果是一样的,所以我们成功地将平移的加法运算变成了乘法运算,那旋转和缩放放到三维后的矩阵乘法还成立吗?
缩放:
\[\begin{equation}
{
\left[ \begin{array}{ccc}
x2\\
y2\\
1\\
\end{array}
\right ]}={
\left[ \begin{array}{ccc}
k_x & 0 & 0\\
0 & k_y & 0\\
0 & 0 & 1\\
\end{array}
\right ]}{
\left[ \begin{array}{ccc}
x1\\
y1\\
1\\
\end{array}
\right ]}
\end{equation}
\]
旋转:
\[\begin{equation}
{
\left[ \begin{array}{ccc}
x2\\
y2\\
1\\
\end{array}
\right ]}={
\left[ \begin{array}{ccc}
cos\theta & -sin\theta & 0\\
sin\theta & cos\theta & 0\\
0 & 0 & 1\\
\end{array}
\right ]}{
\left[ \begin{array}{ccc}
x1\\
y1\\
1\\
\end{array}
\right ]}
\end{equation}
\]
上面两个式子的结果和二维矩阵乘法结果保持一致,所以通过引入齐次坐标我们将三个基本操作统一起来了,以后所有的变换,不管怎样变换,变换多少次,都可以表示成一连串的矩阵相乘了,这是多么的方便。这就是引入齐次坐标的作用,把各种变换都统一了起来。
参考: 为什么要引入齐次坐标