1. MVP 变换简介
- Model Transformation (placing objects)
世界坐标系下有很多 Object ,用一个变化矩阵把它们的顶点坐标从Local坐标系(相对坐标)转换到世界Global坐标系(绝对坐标),这就是 模型变换 。
- View Transformation (placing camera)
我们看到的画面由 camera 捕捉, camera 参数决定了我们在屏幕上看到的东西,这一步可以将世界坐标系转换到摄像机坐标系,这就是 视图变换 。
- Projection Transformation
模型 / 视图变换之后,做一个投影变换,将三维空间中的物体投影到二维空间中。
定义一个相机
- 位置(Position): e
- 朝向(Look-at/gaze direction): g^
- 上方向(Up direction): t^

关键 :
- 若相机和所有的对象均一起发生移动,投影出来的 Photo 不会发生变化。

因此,我们总将 Camera 固定在一个 标准位置 :
- 原点,Up direction 沿着 y 轴方向,Look-at direction 沿着 −z 轴;
- Camera 固定,让其他的对象跟随一起运动。
2.1 视图/相机变换
将相机从一个任意位置变换到标准位置
- 使用矩阵 Mview
- 将其固定在原点,Up direction 沿着 y 轴方向,Look-at direction 沿着 −z 轴。
- 矩阵 Mview 的数学性质:
- 变换 e 到原点;
- 旋转 g 到 −z 轴;
- 旋转 (g×t) 到 x 轴。

构造矩阵 Mview :
- Mview=RviewTview
- 将 e 变换到原点的位移变换:
Tview=⎣⎢⎢⎡100001000010−xe−ye−ze1⎦⎥⎥⎤
- 旋转矩阵 g↦−Z , t↦Y ,(g×t)↦X
不妨先求逆变换矩阵 X↦(g×t) , Y↦t ,Z↦−g
Rview−1=⎣⎢⎢⎡xg^×t^yg^×t^zg^×t^0xtytzt0x−gy−gz−g00001⎦⎥⎥⎤Rview=⎣⎢⎢⎡xg^×t^xtx−g0yg^×t^yty−g0zg^×t^ztz−g00001⎦⎥⎥⎤
NOTE :
- 视图变换 变换的是 Camera ,其他的 Object 相对于 Camera 在进行移动;
- 若先进行了 模型变换 ,在后面进行 视图变换 时,会在移动 Camera 的同时,需要将 Object 也跟着 Camera 一同移动,以此保持 Photo 不变;
- 可见不管是 视图变换 还是 模型变换 ,最终本质上还是作用在 Object 上面,因此人们往往习惯将二者统称为 模型/视图变换(Model/View Transformation) 。
计算机图形学中的投影:

- 3D 到 2D
- 正交投影(Orthographic projection)
- 透视投影(Perspective projection):会存在 “近大远小” 的现象

- 正交投影(Orthographic projection):Camera 在一个 “点” 进行观察
- 透视投影(Perspective projection):Camera 在 “无限远” 处进行观察
3.1 正交投影(Orthographic projection)
方法一 :
- Camera 放置在原点,朝向 −z 轴,上方向为 y 轴;
- 消除掉 z 轴上的信息;
- 将生成的矩形平移缩放至小矩形 [−1,1]2 上。

方法二 :
- 先通过 6 个参数描述一个立方体(AABB);
- 将其映射到正则立方体(“Canonical” Cube):
[l,r]×[b,t]×[f,n]↦[−1,1]3

NOTE :
- 先将中心平移到原点,之后再将轴缩放到 [−1,1]3
- 因为 Camera 是沿着 −z 轴的方向(右手坐标系),因此远的地方 z 值较小,近的地方 z 值较大
构造矩阵 Mortho :
Tortho=⎣⎢⎢⎢⎢⎢⎡100001000010−2r+l−2t+b−2n+f1⎦⎥⎥⎥⎥⎥⎤
- 将 length/width/height 缩放至 2
Rortho=⎣⎢⎢⎢⎢⎢⎡r−l20000t−b20000n−f200001⎦⎥⎥⎥⎥⎥⎤
Mortho=Rortho⋅Tortho=⎣⎢⎢⎢⎢⎢⎡r−l20000t−b20000n−f200001⎦⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎡100001000010−2r+l−2t+b−2n+f1⎦⎥⎥⎥⎥⎥⎤
3.2 透视投影(Perspective projection)

- 齐次坐标表示的点 (x,y,z,1) 和 (kx,ky,kz,k) 均表示三维空间中的点 (x,y,z) ,其中 k=0 ;
- 显然当 k=z 时,可以用 (xz,yz,z2,z) 表示点 (x,y,z) ,其中 z=0 ;
- eg. : (1,0,0,1) 和 (2,0,0,2) 都表示点 (1,0,0)
3.2.1 透视投影的过程

- 先将 Frustum 挤压成一个 Cuboid :( n→n , f→f , Mpersp→ortho ):
- 挤压过程中 “近平面(near plane)”( z=n ) 不会发生变化;
- 挤压过程中 “远平面(far plane)”( z=f ) 仅在 xOy 平面上变化,z 轴上的值不发生变化,特别地,中心点不会发生变化。
- 再做正交投影(使用 Mortho )
3.2.2 构造变换矩阵
STEP - 01:先找到在 xoy 平面上的变换关系

- 找起始点 (x,y,z) 和变换后的点 (x′,y′,z′) 。
- 可以找到各个分量的对应关系:x′=znx ,y′=zny
- 暂时可以获得以下关系:
⎝⎜⎜⎛xyz1⎠⎟⎟⎞Mpersp→ortho(4×4)⎝⎜⎜⎛nx/zny/zunknown1⎠⎟⎟⎞mult. by z⎝⎜⎜⎛nxnyunknownz⎠⎟⎟⎞
- 可以先构造 Mpersp→ortho 的一部分:
Mpersp→ortho=⎝⎜⎜⎜⎜⎜⎛n0?00n?000?100?0⎠⎟⎟⎟⎟⎟⎞
STEP - 02:再找在 z 轴方向上的变换关系
矩阵 Mpersp→ortho 中的第三排控制 z↦z′ :
- “近平面(near plane)”( z=n )上的任意点不会发生变化:
⎝⎜⎜⎛xyn1⎠⎟⎟⎞Mpersp→ortho(4×4)⎝⎜⎜⎛xyn1⎠⎟⎟⎞mult. by n⎝⎜⎜⎜⎜⎛nxnyn2n⎠⎟⎟⎟⎟⎞
设矩阵的第三行为 (00AB) ,则有:
(00AB)⎝⎜⎜⎛xyn1⎠⎟⎟⎞=n2
可得表达式:An+B=n2
- “远平面(far plane)”( z=f )上的点的 z 分量不会发生变化,不过这里我们只观察中心点 (0,0,f) ,在经过挤压变换之后没有发生任何变化:
⎝⎜⎜⎛00f1⎠⎟⎟⎞Mpersp→ortho(4×4)⎝⎜⎜⎛00f1⎠⎟⎟⎞mult. by n⎝⎜⎜⎛00f2f⎠⎟⎟⎞
可得表达式:Af+B=f2
- 可以解得矩阵第三行中待定的系数 A 和 B :
{An+B=n2Af+B=f2⇒{A=n+fB=−nf
SETP - 03 :构造透视投影矩阵
此时已经得到了 挤压矩阵 Mpersp→ortho :
Mpersp→ortho=⎝⎜⎜⎜⎜⎜⎛n0000n0000n+f100−nf0⎠⎟⎟⎟⎟⎟⎞
因此可得 透视投影矩阵 为:
Mpersp=Mortho⋅Mpersp→ortho=⎣⎢⎢⎢⎢⎢⎡r−l20000t−b20000n−f200001⎦⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎡100001000010−2r+l−2t+b−2n+f1⎦⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎡n0000n0000n+f100−nf0⎦⎥⎥⎥⎥⎥⎤