Jupyter AI

9 齐次坐标与几何变换

📅 发表日期: 2024年8月11日

分类: 🖼️计算机图形学入门

👁️阅读: --

在计算机图形学中,几何变换是构建和改变图形对象的基本方式。齐次坐标为我们提供了一种有效的方式来表示和计算这些变换,特别是在处理仿射变换与投影变换时。接下来,我们将详细探讨齐次坐标的概念、如何使用齐次坐标进行变换,以及具体的应用示例。

齐次坐标的基本概念

传统的 2D 坐标系中,我们使用一个点的直角坐标表示法:(x,y)(x, y)。而齐次坐标则通过引入额外维度来对这些点进行扩展。对于 2D 空间,一个点 (x,y)(x, y) 的齐次坐标表示为:

(x,y,w)(x, y, w)

其中,ww 是一个非零的缩放因子。当我们将齐次坐标转换回笛卡尔坐标时,可以通过以下公式获得:

(x,y)=(xw,yw)(x', y') = \left( \frac{x}{w}, \frac{y}{w} \right)

注意:齐次坐标允许我们通过设置 w=1w=1 来表示传统坐标(x,y)(x, y),同时也支持 w1w\neq 1 的情况,从而提供了更大的灵活性。

齐次坐标下的变换

在齐次坐标表达中,几何变换可以通过 矩阵乘法 来实现。对于 2D 变换,我们可以将变换用 3×33 \times 3 矩阵表示:

T=[abtxcdty001]T = \begin{bmatrix} a & b & tx \\ c & d & ty \\ 0 & 0 & 1 \end{bmatrix}

这里,aa, bb, cc, dd 是线性变换的参数,而 txtxtyty 是平移变换的参数。

仿射变换的齐次表示

仿射变换是由缩放、旋转、平移和剪切等变换组成的复合变换。在齐次坐标中,这可以用同一个 3×33 \times 3 矩阵表示。例如,对于一个仿射变换,可以用以下矩阵表示:

A=[sxcos(θ)sysin(θ)txsxsin(θ)sycos(θ)ty001]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}

其中,sxs_xsys_y 是在 x 和 y 轴上的缩放因子,θ\theta 是旋转角度,txt_xtyt_y 是平移量。

投影变换的齐次表示

投影变换经常用于从三维空间映射到二维视图,也是齐次坐标非常重要的应用之一。对于透视投影,投影矩阵可以写成:

P=[f0000f000001001d0]P = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & -\frac{1}{d} & 0 \end{bmatrix}

这里,ff 是焦距,dd 是远平面的距离。

应用示例

下面用 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()

输出解释

在这个示例中,初始点 (2,3)(2, 3) 通过平移变换转换为 (4,6)(4, 6)。通过将点和变换矩阵相乘,我们可以直观地看到齐次坐标的强大!这种方法允许我们轻松处理各种变换,而不必手动计算每种变换的影响。

总结

齐次坐标是实现几何变换的重要工具。在本篇文章中,我们探讨了齐次坐标的基本概念、如何通过矩阵运算实现仿射变换与投影变换,以及具体的代码示例。掌握齐次坐标后,我们将能更好地理解后续的光照与着色模型,这对于实现更加真实的三维图形至关重要。期待下一篇的深度解析!