三维空间的观察和投影变换
前面我们讲了三维空间中物体模型如何通过齐次坐标矩阵进行变换,但模型最终需要呈现在屏幕上——这相当于用一台摄像机拍摄三维空间,输出为二维图像。因此,除了模型变换之外,我们还需要观察变换和投影变换,它们共同构成了三维图形渲染管线中的核心环节。
整体来看,三维空间中的一个点要最终显示在屏幕上,需要经历以下变换流程:
其中模型变换已在上一篇文章中详细讨论,本文重点介绍观察变换和投影变换。
观察变换
观察变换的本质是建立一个观察坐标系(View Coordinate System),将场景中所有物体从世界坐标系变换到以摄像机为原点的坐标系中。
观察坐标系的建立
观察坐标系由三个互相垂直的轴定义,通常约定为:
- 观察方向:摄像机看向
方向(OpenGL 惯例) - 上方向:摄像机的
方向 - 右方向:由观察方向和上方向叉积得到的
方向
给定三个参数即可唯一确定一个观察坐标系:
| 参数 | 含义 |
|---|---|
| 摄像机在世界空间中的位置 | |
| 摄像机看向的目标点 | |
| 世界空间的上方向(通常为 |
由此可以计算出观察坐标系的三个基向量:
1. 前向向量
2. 右向向量
3. 上向向量
注意这里
Look-At 矩阵的推导
观察矩阵
- 平移:将摄像机位置
移到原点 - 旋转:将世界坐标轴对齐到观察坐标轴
写成矩阵形式:
其中平移矩阵很简单:
旋转矩阵
将旋转和平移合并,得到完整的 Look-At 矩阵:
直观理解:平移部分的负号来源于
的矩阵乘法。以 分量为例, 。
观察变换与模型变换的关系
一个重要的洞察是:对摄像机做变换,等价于对场景中所有物体做该变换的逆变换。
例如,想让摄像机绕
其中
投影变换
投影变换将三维物体投射到二维投影面上。根据投影中心到投影面的距离,投影变换可分为两大类:平面几何投影和观察投影。
平面几何投影主要研究投影本身的几何性质(如平行投影、透视投影及其衍生图形);观察投影则是在图形学渲染管线中实际使用的投影方式,它不仅要完成投影,还要将结果映射到标准化的设备坐标中。
平面几何投影
平面几何投影根据投影线是否平行,分为平行投影和透视投影两大类。
如图所示,透视投影的投影中心可以理解成摄像机,投影面可以理解成成像平面,线段
直观地想象:几个物体离你很近时,它们与你的距离会显著影响它们在你眼中的大小;但如果这些物体离你非常远,尽管它们之间的距离差异仍然存在,但在你眼中它们都很小,大小几乎一致。
平行投影
平行投影根据投影方向与投影面的夹角关系,分为正投影和斜投影:
正投影
正投影的投影方向垂直于投影面。根据投影面与坐标轴的关系,又分为三视图和正轴测图:
- 三视图:投影面与某一坐标轴垂直时得到的投影
- 正轴测图:投影面不与任何坐标轴垂直时得到的投影
三视图包括主视图、侧视图和俯视图,投影面分别与
正轴测图根据投影面与三个坐标轴夹角的相等关系,分为三种:
- 等轴测图:投影面与三个坐标轴的夹角均相等
- 正二测图:投影面与两个坐标轴的夹角相等
- 正三测图:投影面与三个坐标轴的夹角均不相等
斜投影
斜投影的投影方向与投影面不垂直。根据投影方向与投影面的夹角关系,分为斜等测图和斜二测图:
- 斜等测图:投影方向与投影面成
角,投影后深度方向不缩短 - 斜二测图:投影方向与投影面成
角,投影后深度方向缩短为原来的一半
透视投影
透视投影具有透视缩小效应:三维形体投影的大小与形体到投影中心的距离成反比。这种视觉效果与人眼和照相系统的工作原理一致——等长的两直线段,离投影中心近的那段投影更大,离得远的那段投影更小。
透视投影的深度感更强,更具真实感,但不能精确反映物体的尺寸和形状。
灭点(Vanishing Point) 是透视投影中的一个重要概念:不平行于投影面的平行线在透视投影下会汇聚到一个点,这个点称为灭点。沿坐标轴方向的平行线形成的灭点称为主灭点。
根据主灭点的数量,透视投影分为三类:
| 类型 | 主灭点数 | 投影面与坐标轴的关系 |
|---|---|---|
| 一点透视 | 1 | 投影面与一个坐标轴正交,与另外两个平行 |
| 两点透视 | 2 | 投影面与两个坐标轴相交,与另一个平行 |
| 三点透视 | 3 | 投影面与三个坐标轴都相交 |
观察投影
观察投影是图形学渲染管线中实际使用的投影方式。与平面几何投影不同,观察投影不仅完成三维到二维的映射,还将结果变换到标准化设备坐标(NDC, Normalized Device Coordinates)中,为后续的视口变换做准备。
观察投影分为透视投影和正交投影两种。两者之间存在深刻的联系:透视投影可以先看作一个将视锥体”压扁”为长方体的变换,再用正交投影将该长方体映射到 NDC。
为了让推导逻辑更加顺滑,我们采用由易到难的解构策略:先推导纯线性的正交投影作为基石,再利用“挤压+正交”的顺序进行透视投的推导。
一、 正交投影
正交投影不会产生透视变形,平行线在投影后仍然平行。它的投影范围是一个轴对齐的长方体(View
Volume),我们的目标是直接将这个长方体线性映射到 NDC 立方体
1. 视景体的参数化
正交投影的视景体由六个平面直接定义:
| 参数 | 含义 |
|---|---|
| 视景体在 |
|
| 视景体在 |
|
| 近平面和远平面的距离(均为正值,观察空间中 |
2. 核心工具:一元线性映射通式
将任意区间
推导思路:先将点
减去原区间中点 (将中心平移至原点 ),再乘以两区间长度的缩放因子 ,通分化简即可得到上式。
3. 分方向映射推导
分别对
分量——将 映射到 : 分量——将 映射到 : 分量——在观察空间中,相机看向 方向,近平面为 ,远平面为 。根据定义,我们需要将近端 映射到 ,远端 映射到 。 由此明确对应关系: 映射到 , 映射到 。直接代入通式:
4. 构造正交投影矩阵
由于正交投影是纯线性映射,没有透视效果(
5. 对称视景体
实际使用中最常见的是对称视景体(
二、 透视投影
透视投影模拟人眼和相机的成像方式,产生近大远小的效果。它的投影范围是一个视锥体(Frustum)——一个截去顶端的四棱锥:
1. 视锥体的参数化
视锥体由以下参数定义:
| 参数 | 符号 | 含义 |
|---|---|---|
| 近平面距离 | 视锥体近平面的距离(正值,观察空间中 |
|
| 远平面距离 | 视锥体远平面的距离(正值,观察空间中 |
|
| 垂直视场角 | 视锥体在 |
|
| 宽高比 | 视锥体近平面宽与高的比值, |
在近平面
2. 透视投影矩阵推导策略
直接一步到位推导透视矩阵非常困难。我们采用将变换解耦的策略:
- 第一步(挤压):构建
,负责把向远处发散的视锥体“压”成一个轴对齐的长方体。
- 第二步(正交):直接复用上文推导出的标准正交投影矩阵
将长方体规整到 NDC 空间。
步骤一:相似三角形投影与设置齐次坐标w分量
这一步效果如下图:
为了将棱锥体挤压成长方体,我们需要确定挤压前后的x和y坐标的映射。
对于观察空间中的任意点
(由于相机看向
通过三角形相似,我们可以求解投影的x,y坐标在挤压后的新坐标。
因为矩阵乘法只能表达线性的加权组合,无法直接在矩阵内部实现“除以
利用这个硬件特性,我们反其道而行之:在矩阵乘法阶段先不执行除法,而是利用矩阵把
即我们期望变换后的剪裁坐标为:
根据矩阵乘法规则,能够完美碰撞出该结果的“挤压矩阵”必定具备如下结构(第三行先用占位符
步骤二:利用边缘条件求解
任何点经过该矩阵相乘后,其
为了唯一确定未知数
现在得到了一个经典的二元一次方程组:
下式减去上式以消去
将
至此,负责把视锥体完美“挤压”成长方体的矩阵被彻底解出:
步骤三:矩阵合成(正交矩阵 ✖ 挤压矩阵)
当视锥体不再是对称的(即
因为挤压矩阵
现在,我们将
矩阵乘法的细节(为什么平移项跑到了第三列?)
当我们计算第一行乘以第三列时,奇妙的事情发生了:
最终,我们得到了图形学中最通用的、完全闭环的一般透视投影矩阵:
三、 矩阵结构剖析和性质
我们可以将透视矩阵拆解为三大职责功能区:
红区(第一、二行) :负责 方向的视场角伸缩与横纵比适配。蓝区(第三行) :负责把 轴非线性映射到 。其系数完全由近远平面的硬性边界条件(解方程组)所决定。绿区(第四行) :核心功臣 ,负责把 塞给 ,用来强行启动硬件的齐次透视除法。
透视投影的关键性质
- 非线性深度映射:由于深度坐标
与 成非线性正比关系。这意味着近处的深度精度极高,而远处的深度精度会剧烈稀释,这是深度缓冲(Z-buffer)在远处容易产生精度冲突(Z-fighting)的根本原因。 - 直线保持性:透视变换能够完美保证空间中的直线在投影后依然是直线(但不再保持平行的性质)。
四、 透视投影与正交投影的对比
| 特性 | 透视投影 | 正交投影 |
|---|---|---|
| 视觉效果 | 近大远小,符合人眼真实感 | 无透视变形,物体大小与远近无关 |
| 平行线 | 不平行于投影面的线将汇聚于灭点 | 所有平行线在投影后依然保持平行 |
| 深度映射 | 非线性(精度倾向于近平面) | 完美的完全线性映射 |
| 典型应用 | 3D 游戏、VR 渲染、场景可视化 | CAD 建模、阴影贴图(Shadow Map)、UI 渲染 |
本质关联总结:透视投影与正交投影并非孤立。透视投影的本质可以完美等价为:“先用齐次矩阵将视锥体向内挤压成长方体” + “再用标准正交投影矩阵进行视景体归一化”。两者是图形学管线在同一变换框架下的不同参数选择。
总结
本文介绍了三维图形渲染管线中的两个核心环节:观察变换和投影变换。
- 观察变换通过 Look-At 矩阵将场景从世界空间变换到观察空间,核心是基变换与平移的复合。
- 投影变换包含透视投影和正交投影两种,分别对应不同的视觉效果和应用场景。透视投影通过齐次坐标的
分量实现透视除法,是图形学中最为精妙的设计之一。
至此,结合上一篇文章中的模型变换,三维空间中从物体局部坐标到屏幕坐标的完整变换链MVP变换(M模型、V观察、P投影)已经全部介绍完毕。
这次的插图来自画师 istomin_denis
图片地址:https://www.pixiv.net/artworks/144774058