9 齐次坐标与几何变换
在计算机图形学中,几何变换是构建和改变图形对象的基本方式。齐次坐标为我们提供了一种有效的方式来表示和计算这些变换,特别是在处理仿射变换与投影变换时。接下来,我们将详细探讨齐次坐标的概念、如何使用齐次坐标进行变换,以及具体的应用示例。
齐次坐标的基本概念
传统的 2D 坐标系中,我们使用一个点的直角坐标表示法:。而齐次坐标则通过引入额外维度来对这些点进行扩展。对于 2D 空间,一个点 的齐次坐标表示为:
其中, 是一个非零的缩放因子。当我们将齐次坐标转换回笛卡尔坐标时,可以通过以下公式获得:
注意:齐次坐标允许我们通过设置 来表示传统坐标,同时也支持 的情况,从而提供了更大的灵活性。
齐次坐标下的变换
在齐次坐标表达中,几何变换可以通过 矩阵乘法 来实现。对于 2D 变换,我们可以将变换用 矩阵表示:
这里,, , , 是线性变换的参数,而 和 是平移变换的参数。
仿射变换的齐次表示
仿射变换是由缩放、旋转、平移和剪切等变换组成的复合变换。在齐次坐标中,这可以用同一个 矩阵表示。例如,对于一个仿射变换,可以用以下矩阵表示:
其中, 和 是在 x 和 y 轴上的缩放因子, 是旋转角度, 和 是平移量。
投影变换的齐次表示
投影变换经常用于从三维空间映射到二维视图,也是齐次坐标非常重要的应用之一。对于透视投影,投影矩阵可以写成:
这里, 是焦距, 是远平面的距离。
应用示例
下面用 Python 和 NumPy 来演示如何使用齐次坐标进行简单的2D变换。
import numpy as np
import matplotlib.pyplot as plt
# 定义初始点
point = np.array([2, 3, 1]) # (x, y, w)
# 定义仿射变换矩阵
transformation_matrix = np.array([
[1, 0, 2], # 向右平移
[0, 1, 3], # 向上平移
[0, 0, 1]
])
# 应用仿射变换
new_point = transformation_matrix @ point
print(f"变换前的点:{point[:2]}")
print(f"变换后的点:{new_point[:2]}") # 输出将是 (4, 6)
# 绘制原点与变换后的点
plt.figure()
plt.scatter(point[0], point[1], color='blue', label='原始点 (2, 3)')
plt.scatter(new_point[0], new_point[1], color='red', label='变换后点 (4, 6)')
plt.xlim(0, 10)
plt.ylim(0, 10)
plt.legend()
plt.title("齐次坐标变换示例")
plt.grid()
plt.show()
输出解释
在这个示例中,初始点 通过平移变换转换为 。通过将点和变换矩阵相乘,我们可以直观地看到齐次坐标的强大!这种方法允许我们轻松处理各种变换,而不必手动计算每种变换的影响。
总结
齐次坐标是实现几何变换的重要工具。在本篇文章中,我们探讨了齐次坐标的基本概念、如何通过矩阵运算实现仿射变换与投影变换,以及具体的代码示例。掌握齐次坐标后,我们将能更好地理解后续的光照与着色模型,这对于实现更加真实的三维图形至关重要。期待下一篇的深度解析!