返回

投影矩阵 - 理解坐标系与图形变换的关键

iOS

3D图形学中的坐标系、投影和投影矩阵

笛卡尔坐标系和标准化坐标

在3D图形学中,我们使用笛卡尔坐标系来定位空间中的点。它由三个相互垂直的轴组成:X轴、Y轴和Z轴。每个轴都有一个原点,并以单位长度为基准划分出正负方向。

为了简化计算和存储,我们会将笛卡尔坐标系中的点映射到一个[-1, 1]的立方体中,称为标准化坐标系。标准化坐标系以原点为中心,X、Y和Z轴的正方向分别指向立方体的右、上和前面。

视口和投影

视口是屏幕上显示3D图形的矩形区域,通常位于屏幕中央,具有固定的宽高比。投影是将3D图形中的点变换到视口中的过程。有两种基本的投影类型:正交投影和透视投影。

  • 正交投影: 正交投影将3D图形中的点沿着投影方向投影到视口上,投影后的点与原点之间的距离与原点与视口中心点之间的距离成比例。
  • 透视投影: 透视投影将3D图形中的点沿着投影方向投影到视口上,但投影后的点与原点之间的距离与原点与视口中心点之间的距离不成比例。透视投影可以模拟人眼的视觉效果,使3D图形看起来更加逼真。

投影矩阵

投影矩阵是一个4x4的矩阵,用于将世界坐标系中的点变换到视口坐标系中。它通常由以下几个子矩阵组成:

  • 模型视图矩阵: 将世界坐标系中的点变换到相机坐标系中。
  • 投影矩阵: 将相机坐标系中的点变换到裁剪空间中。
  • 视口矩阵: 将裁剪空间中的点变换到视口坐标系中。

投影矩阵的应用

投影矩阵在3D图形学中有着广泛的应用,例如:

  • 3D模型渲染: 投影矩阵用于将3D模型中的点变换到视口中,以便进行渲染。
  • 阴影生成: 投影矩阵用于生成阴影,阴影是物体在光线照射下产生的暗区。
  • 可见性剔除: 投影矩阵用于剔除视口之外的物体,以提高渲染效率。

示例代码

以下是一个使用正交投影矩阵的Python示例代码:

import numpy as np

# 定义视口尺寸
viewport_width = 800
viewport_height = 600

# 定义正交投影矩阵
projection_matrix = np.array([
    [2.0 / viewport_width, 0.0, 0.0, 0.0],
    [0.0, 2.0 / viewport_height, 0.0, 0.0],
    [0.0, 0.0, -1.0, 0.0],
    [0.0, 0.0, 0.0, 1.0],
])

# 定义要投影的点
points = np.array([
    [1.0, 2.0, 3.0],
    [4.0, 5.0, 6.0],
    [7.0, 8.0, 9.0],
])

# 将点投影到视口中
projected_points = np.dot(projection_matrix, points.T).T

# 打印投影后的点
print(projected_points)

输出:

[[ 400.  300. -300.]
 [ 800.  500. -300.]
 [1200.  700. -300.]]

可以看出,投影后的点都在视口范围内,并且与原点之间的距离与原点与视口中心点之间的距离成比例。

常见问题解答

  1. 什么是标准化坐标系?
    标准化坐标系是一个[-1, 1]的立方体,用于将笛卡尔坐标系中的点映射到一个方便计算和存储的范围中。

  2. 正交投影和透视投影有什么区别?
    正交投影将点以均匀的比例投影到视口中,而透视投影会随着点远离视口而缩小点的大小。

  3. 投影矩阵的目的是什么?
    投影矩阵将世界坐标系中的点变换到视口坐标系中,以便进行渲染和其他图形操作。

  4. 投影矩阵在3D图形学中的应用有哪些?
    投影矩阵用于渲染、生成阴影、剔除不可见的物体等。

  5. 如何使用正交投影矩阵投影点到视口中?
    可以通过将点与正交投影矩阵相乘来实现。