9 齐次坐标与几何变换
在计算机图形学中,几何变换是构建和改变图形对象的基本方式。齐次坐标为我们提供了一种有效的方式来表示和计算这些变换,特别是在处理仿射变换与投影变换时。接下来,我们将详细探讨齐次坐标的概念、如何使用齐次坐标进行变换,以及具体的应用示例。
齐次坐标的基本概念
传统的 2D 坐标系中,我们使用一个点的直角坐标表示法:$(x, y)$。而齐次坐标则通过引入额外维度来对这些点进行扩展。对于 2D 空间,一个点 $(x, y)$ 的齐次坐标表示为:
$$
(x, y, w)
$$
其中,$w$ 是一个非零的缩放因子。当我们将齐次坐标转换回笛卡尔坐标时,可以通过以下公式获得:
$$
(x’, y’) = \left( \frac{x}{w}, \frac{y}{w} \right)
$$
注意:齐次坐标允许我们通过设置 $w=1$ 来表示传统坐标$(x, y)$,同时也支持 $w\neq 1$ 的情况,从而提供了更大的灵活性。
齐次坐标下的变换
在齐次坐标表达中,几何变换可以通过 矩阵乘法 来实现。对于 2D 变换,我们可以将变换用 $3 \times 3$ 矩阵表示:
$$
T = \begin{bmatrix}
a & b & tx \
c & d & ty \
0 & 0 & 1
\end{bmatrix}
$$
这里,$a$, $b$, $c$, $d$ 是线性变换的参数,而 $tx$ 和 $ty$ 是平移变换的参数。
仿射变换的齐次表示
仿射变换是由缩放、旋转、平移和剪切等变换组成的复合变换。在齐次坐标中,这可以用同一个 $3 \times 3$ 矩阵表示。例如,对于一个仿射变换,可以用以下矩阵表示:
$$
A = \begin{bmatrix}
s_x \cos(\theta) & -s_y \sin(\theta) & t_x \
s_x \sin(\theta) & s_y \cos(\theta) & t_y \
0 & 0 & 1
\end{bmatrix}
$$
其中,$s_x$ 和 $s_y$ 是在 x 和 y 轴上的缩放因子,$\theta$ 是旋转角度,$t_x$ 和 $t_y$ 是平移量。
投影变换的齐次表示
投影变换经常用于从三维空间映射到二维视图,也是齐次坐标非常重要的应用之一。对于透视投影,投影矩阵可以写成:
$$
P = \begin{bmatrix}
f & 0 & 0 & 0 \
0 & f & 0 & 0 \
0 & 0 & 0 & 1 \
0 & 0 & -\frac{1}{d} & 0
\end{bmatrix}
$$
这里,$f$ 是焦距,$d$ 是远平面的距离。
应用示例
下面用 Python 和 NumPy 来演示如何使用齐次坐标进行简单的2D变换。
1 | import numpy as np |
输出解释
在这个示例中,初始点 $(2, 3)$ 通过平移变换转换为 $(4, 6)$。通过将点和变换矩阵相乘,我们可以直观地看到齐次坐标的强大!这种方法允许我们轻松处理各种变换,而不必手动计算每种变换的影响。
总结
齐次坐标是实现几何变换的重要工具。在本篇文章中,我们探讨了齐次坐标的基本概念、如何通过矩阵运算实现仿射变换与投影变换,以及具体的代码示例。掌握齐次坐标后,我们将能更好地理解后续的光照与着色模型,这对于实现更加真实的三维图形至关重要。期待下一篇的深度解析!
9 齐次坐标与几何变换