MVP变换(Model-View-Projection Matrices)#
MVP变换用来描述视图变换的任务,即将虚拟世界中的三维物体映射(变换)到二维坐标中。
MVP变换分为三步:
- 模型变换(model tranformation):将模型空间转换到世界空间(找个好的地方,把所有人集合在一起,摆个pose)
- 摄像机变换(view tranformation):将世界空间转换到观察空间(找到一个放相机的位置,往某一个角度去看)
- 投影变换(projection tranformation):将观察空间转换到裁剪空间(茄子!)
视图变换(View)#
视图变换的目的是变换Camera位置到原点,上方为Y,观察方向为-Z
Camera的y轴正方向向上,z轴方向是\(\vec{x} \times \vec{y}\)右手系)
对物体进行运动,摄像机会跟随着一起运动保持相对位置不变
怎么写出数学表示
通过\(V_{\text{view}}\)变换相机,在数学上怎么表示?
- 将e平移到零点
- 旋转g到−Z
- 旋转t到Y
- 旋转
G x T到X

可以将其拆解成两个部分: 平移+旋转
首先将相机从e平移到标准原点的位置
$$ T_{VIEW} = \begin{bmatrix} 1 & 0 & 0 & -x_e \\ 0 & 1 & 0 & -y_e \\ 0 & 0 & 1 & -z_e \\ 0 & 0 & 0 & 1 \end{bmatrix} $$由于旋转矩阵具有正交性,因此它的逆矩阵就等于它的转置矩阵.
$$ \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} x_{\hat{g}\times\hat{t}} & x_t & x_{-g} & 0 \\ y_{\hat{g}\times\hat{t}} & y_t & y_{-g} & 0 \\ z_{\hat{g}\times\hat{t}} & z_t & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} = E \cdot \begin{bmatrix} x_{\hat{g}\times\hat{t}} & x_t & x_{-g} & 0 \\ y_{\hat{g}\times\hat{t}} & y_t & y_{-g} & 0 \\ z_{\hat{g}\times\hat{t}} & z_t & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} $$在通过正交矩阵的性质(正交矩阵的逆等于它的转置矩阵),可以求出:
总结:
- 让物体和相机一起变换。
- 直到相机位于原点,头朝上(Y),看向 −Z
投影变换(Projection)#
投影变换分为两种:
- 正交投影(Orthogonal projection)变换:透视线平行
- 透视投影(Perspective projection)变换:透视线相交,近大远小
简单来讲,透视投影相当于两点透视或三点透视,有透视畸变。正交投影相当于是基于坐标的轴测图

正交投影 (Orthogonal projection)#
一种简单的理解方式
相机位于原点,朝向 -Z 方向,向上为 Y 方向
丢弃 Z 坐标
将得到的矩形平移并缩放到
[-1, 1]²范围内
我们希望将一个长方体区域
[l, r] × [b, t] × [f, n](左右 X 下上 X 远近)映射到立方体
[-1, 1]³

方法:
- 现将标准立方体拉到原点
- 后将x,y,z轴各自**伸缩到
[−1,1]
变换顺序:先移动(中点移动到原点),再缩放(基向量缩放比例为\(\frac{2}{\text{长} / \text{宽} / \text{高}}\)
因为相机朝向-z方向(右手系),此时n > f,这也是 OpenGL 用左手系( f > n )的原因。
正交投影矩阵(Orthographic Projection Matrix)#
$$ M_{\text{ortho}} = \underbrace{ \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} }_{\text{缩放矩阵 } S} \cdot \underbrace{ \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1 \end{bmatrix} }_{\text{平移矩阵 } T} $$合并后形式
$$ M_{\text{ortho}} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f} \\ 0 & 0 & 0 & 1 \end{bmatrix} $$参数说明:
l, r→ 左右边界(left / right)b, t→ 下上边界(bottom / top)f, n→ 远近裁剪面(far / near),注意在右手系中通常n > f(如 n = -0.1, f = -100)
