DongGu
三维空间的观察和投影变换

三维空间的观察和投影变换

前面我们讲了三维空间中物体模型如何通过齐次坐标矩阵进行变换,但模型最终需要呈现在屏幕上——这相当于用一台摄像机拍摄三维空间,输出为二维图像。因此,除了模型变换之外,我们还需要观察变换投影变换,它们共同构成了三维图形渲染管线中的核心环节。

整体来看,三维空间中的一个点要最终显示在屏幕上,需要经历以下变换流程:

其中模型变换已在上一篇文章中详细讨论,本文重点介绍观察变换和投影变换。

观察变换

观察变换的本质是建立一个观察坐标系(View Coordinate System),将场景中所有物体从世界坐标系变换到以摄像机为原点的坐标系中。

观察坐标系的建立

观察坐标系由三个互相垂直的轴定义,通常约定为:

  • 观察方向:摄像机看向 方向(OpenGL 惯例)
  • 上方向:摄像机的 方向
  • 右方向:由观察方向和上方向叉积得到的 方向

给定三个参数即可唯一确定一个观察坐标系:

参数 含义
摄像机在世界空间中的位置
摄像机看向的目标点
世界空间的上方向(通常为

由此可以计算出观察坐标系的三个基向量:

1. 前向向量 (摄像机看向的方向):

2. 右向向量 (由 叉积得到):

3. 上向向量 (重新正交化,确保三个轴两两垂直):

注意这里 是重新计算得到的,而不是直接使用输入的 ——因为用户提供的 不一定与 精确垂直,通过两次叉积可以保证正交性。

Look-At 矩阵的推导

观察矩阵 (也称为 Look-At 矩阵)将世界坐标变换为观察坐标。它由两个步骤复合而成:

  1. 平移:将摄像机位置 移到原点
  2. 旋转:将世界坐标轴对齐到观察坐标轴

写成矩阵形式:

其中平移矩阵很简单:

旋转矩阵 完成基变换:将世界坐标系的点用观察坐标系的基向量重新表示。由于观察坐标系的 方向对应的是 (摄像机看向 ),基变换矩阵为:

将旋转和平移合并,得到完整的 Look-At 矩阵:

直观理解:平移部分的负号来源于 的矩阵乘法。以 分量为例,

观察变换与模型变换的关系

一个重要的洞察是:对摄像机做变换,等价于对场景中所有物体做该变换的逆变换

例如,想让摄像机绕 轴顺时针旋转 来从侧面观察场景,实际做法是对所有物体施加绕 逆时针旋转 的变换矩阵。这正是因为:

其中 是将摄像机从原点变换到目标位置和朝向的矩阵(相当于摄像机的模型矩阵)。理解这一对偶关系有助于把握观察变换的本质。

投影变换

投影变换将三维物体投射到二维投影面上。根据投影中心到投影面的距离,投影变换可分为两大类:平面几何投影观察投影

平面几何投影主要研究投影本身的几何性质(如平行投影、透视投影及其衍生图形);观察投影则是在图形学渲染管线中实际使用的投影方式,它不仅要完成投影,还要将结果映射到标准化的设备坐标中。

平面几何投影分类

平面几何投影

平面几何投影根据投影线是否平行,分为平行投影透视投影两大类。

透视投影与平行投影

如图所示,透视投影的投影中心可以理解成摄像机,投影面可以理解成成像平面,线段 是被投影的物体。当投影中心与物体之间的距离较近时(有限距离),投影线不平行,产生近大远小的透视效果;当距离趋向无穷远时(无限距离),投影线可以看作平行的,此时物体的大小不受距离影响。

直观地想象:几个物体离你很近时,它们与你的距离会显著影响它们在你眼中的大小;但如果这些物体离你非常远,尽管它们之间的距离差异仍然存在,但在你眼中它们都很小,大小几乎一致。

平行投影

平行投影根据投影方向与投影面的夹角关系,分为正投影斜投影

平行投影分类

正投影

正投影的投影方向垂直于投影面。根据投影面与坐标轴的关系,又分为三视图和正轴测图:

正投影分类
  • 三视图:投影面与某一坐标轴垂直时得到的投影
  • 正轴测图:投影面不与任何坐标轴垂直时得到的投影

三视图包括主视图侧视图俯视图,投影面分别与 轴、 轴和 轴垂直:

三视图示意

正轴测图根据投影面与三个坐标轴夹角的相等关系,分为三种:

正轴测图分类
  1. 等轴测图:投影面与三个坐标轴的夹角均相等
  2. 正二测图:投影面与两个坐标轴的夹角相等
  3. 正三测图:投影面与三个坐标轴的夹角均不相等

斜投影

斜投影的投影方向与投影面不垂直。根据投影方向与投影面的夹角关系,分为斜等测图和斜二测图:

斜投影分类
斜等测与斜二测
  • 斜等测图:投影方向与投影面成 角,投影后深度方向不缩短
  • 斜二测图:投影方向与投影面成 角,投影后深度方向缩短为原来的一半

透视投影

透视投影具有透视缩小效应:三维形体投影的大小与形体到投影中心的距离成反比。这种视觉效果与人眼和照相系统的工作原理一致——等长的两直线段,离投影中心近的那段投影更大,离得远的那段投影更小。

透视投影的深度感更强,更具真实感,但不能精确反映物体的尺寸和形状。

灭点(Vanishing Point) 是透视投影中的一个重要概念:不平行于投影面的平行线在透视投影下会汇聚到一个点,这个点称为灭点。沿坐标轴方向的平行线形成的灭点称为主灭点

根据主灭点的数量,透视投影分为三类:

透视投影分类
类型 主灭点数 投影面与坐标轴的关系
一点透视 1 投影面与一个坐标轴正交,与另外两个平行
两点透视 2 投影面与两个坐标轴相交,与另一个平行
三点透视 3 投影面与三个坐标轴都相交

观察投影

观察投影是图形学渲染管线中实际使用的投影方式。与平面几何投影不同,观察投影不仅完成三维到二维的映射,还将结果变换到标准化设备坐标(NDC, Normalized Device Coordinates)中,为后续的视口变换做准备。

观察投影分为透视投影正交投影两种。两者之间存在深刻的联系:透视投影可以先看作一个将视锥体”压扁”为长方体的变换,再用正交投影将该长方体映射到 NDC。

为了让推导逻辑更加顺滑,我们采用由易到难的解构策略:先推导纯线性的正交投影作为基石,再利用“挤压+正交”的顺序进行透视投的推导。

观察投影分类

一、 正交投影

正交投影不会产生透视变形,平行线在投影后仍然平行。它的投影范围是一个轴对齐的长方体(View Volume),我们的目标是直接将这个长方体线性映射到 NDC 立方体 中。

映射流程

1. 视景体的参数化

正交投影的视景体由六个平面直接定义:

参数 含义
视景体在 方向的左、右边界
视景体在 方向的下、上边界
近平面和远平面的距离(均为正值,观察空间中

2. 核心工具:一元线性映射通式

将任意区间 线性映射到 的通用公式为:

推导思路:先将点 减去原区间中点 (将中心平移至原点 ),再乘以两区间长度的缩放因子 ,通分化简即可得到上式。

3. 分方向映射推导

分别对 坐标应用此通式:

  • 分量——将 映射到

  • 分量——将 映射到

  • 分量——在观察空间中,相机看向 方向,近平面为 ,远平面为 。根据定义,我们需要将近端 映射到 ,远端 映射到 。 由此明确对应关系: 映射到 映射到 。直接代入通式:

4. 构造正交投影矩阵

由于正交投影是纯线性映射,没有透视效果(,无需透视除法),这些线性关系可以直接填入齐次矩阵中:

5. 对称视景体

实际使用中最常见的是对称视景体(),此时位移项消失,矩阵可以极大地简化为:


二、 透视投影

透视投影模拟人眼和相机的成像方式,产生近大远小的效果。它的投影范围是一个视锥体(Frustum)——一个截去顶端的四棱锥:

透视投影视锥体

1. 视锥体的参数化

视锥体由以下参数定义:

参数 符号 含义
近平面距离 视锥体近平面的距离(正值,观察空间中
远平面距离 视锥体远平面的距离(正值,观察空间中
垂直视场角 视锥体在 方向的张开角度(FOV)
宽高比 视锥体近平面宽与高的比值,

在近平面 处,根据三角函数几何关系,半高 和半宽 为:

2. 透视投影矩阵推导策略

直接一步到位推导透视矩阵非常困难。我们采用将变换解耦的策略:

  • 第一步(挤压):构建 ,负责把向远处发散的视锥体“压”成一个轴对齐的长方体。
视锥体挤压为长方体
  • 第二步(正交):直接复用上文推导出的标准正交投影矩阵 将长方体规整到 NDC 空间。
长方体映射到NDC立方体
步骤一:相似三角形投影与设置齐次坐标w分量

这一步效果如下图:

为了将棱锥体挤压成长方体,我们需要确定挤压前后的x和y坐标的映射。

对于观察空间中的任意点 ,将其投影到近平面 上。由相似三角形性质:

相似三角形投影

(由于相机看向 方向,坐标 是负值,因此加上负号 转换为正的距离值)

通过三角形相似,我们可以求解投影的x,y坐标在挤压后的新坐标。

因为矩阵乘法只能表达线性的加权组合,无法直接在矩阵内部实现“除以 ”这种非线性除法。然而,图形学硬件管线在顶点着色器执行完毕后,会自动执行透视除法(即坐标全体除以齐次分量

利用这个硬件特性,我们反其道而行之:在矩阵乘法阶段先不执行除法,而是利用矩阵把 强行存进结果的 分量中!

即我们期望变换后的剪裁坐标为:

根据矩阵乘法规则,能够完美碰撞出该结果的“挤压矩阵”必定具备如下结构(第三行先用占位符 替代):

步骤二:利用边缘条件求解

任何点经过该矩阵相乘后,其 轴对应的剪裁坐标为 。当硬件随后自动执行透视除法(除以 )后,最终得到的 NDC 深度公式为:

为了唯一确定未知数 ,我们需要带入两个压倒性的几何边缘条件: 1. 近平面上的点,挤压后相对深度保持不变:即当 时,其 2. 远平面上的点,挤压后相对深度保持不变:即当 时,其

现在得到了一个经典的二元一次方程组:

下式减去上式以消去

代回任意一式,求得

至此,负责把视锥体完美“挤压”成长方体的矩阵被彻底解出:

步骤三:矩阵合成(正交矩阵 ✖ 挤压矩阵)

当视锥体不再是对称的(即 ),我们在第二步必须使用最一般形式的正交投影矩阵。

因为挤压矩阵 已经把 轴完美映射到了 ,所以此时用来复合的正交矩阵只需要处理 的缩放与平移,保持 轴不变。我们写出一般正交矩阵:

现在,我们将 与挤压矩阵 相乘:

矩阵乘法的细节(为什么平移项跑到了第三列?)

当我们计算第一行乘以第三列时,奇妙的事情发生了: 同理,第二行乘以第三列时, 与挤压矩阵第四行的 相乘,负负得正。

最终,我们得到了图形学中最通用的、完全闭环的一般透视投影矩阵


三、 矩阵结构剖析和性质

我们可以将透视矩阵拆解为三大职责功能区:

  • 红区(第一、二行):负责 方向的视场角伸缩与横纵比适配
  • 蓝区(第三行):负责把 轴非线性映射到 。其系数完全由近远平面的硬性边界条件(解方程组)所决定。
  • 绿区(第四行):核心功臣 ,负责把 塞给 ,用来强行启动硬件的齐次透视除法。

透视投影的关键性质

  1. 非线性深度映射:由于深度坐标 成非线性正比关系。这意味着近处的深度精度极高,而远处的深度精度会剧烈稀释,这是深度缓冲(Z-buffer)在远处容易产生精度冲突(Z-fighting)的根本原因。
  2. 直线保持性:透视变换能够完美保证空间中的直线在投影后依然是直线(但不再保持平行的性质)。

四、 透视投影与正交投影的对比

特性 透视投影 正交投影
视觉效果 近大远小,符合人眼真实感 无透视变形,物体大小与远近无关
平行线 不平行于投影面的线将汇聚于灭点 所有平行线在投影后依然保持平行
分量 (必须依赖硬件透视除法) (纯线性映射,无需除法)
深度映射 非线性(精度倾向于近平面) 完美的完全线性映射
典型应用 3D 游戏、VR 渲染、场景可视化 CAD 建模、阴影贴图(Shadow Map)、UI 渲染

本质关联总结:透视投影与正交投影并非孤立。透视投影的本质可以完美等价为:“先用齐次矩阵将视锥体向内挤压成长方体” + “再用标准正交投影矩阵进行视景体归一化”。两者是图形学管线在同一变换框架下的不同参数选择。

总结

本文介绍了三维图形渲染管线中的两个核心环节:观察变换和投影变换。

  • 观察变换通过 Look-At 矩阵将场景从世界空间变换到观察空间,核心是基变换与平移的复合。
  • 投影变换包含透视投影和正交投影两种,分别对应不同的视觉效果和应用场景。透视投影通过齐次坐标的 分量实现透视除法,是图形学中最为精妙的设计之一。

至此,结合上一篇文章中的模型变换,三维空间中从物体局部坐标到屏幕坐标的完整变换链MVP变换(M模型、V观察、P投影)已经全部介绍完毕。


这次的插图来自画师 istomin_denis

图片地址:https://www.pixiv.net/artworks/144774058

本文作者:DongGu
本文链接:https://donggu.xyz/2026/05/25/图形学入门/三维空间的观察和投影变换/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可