Skip to content

坐标空间

从物体的角度,按照坐标空间在渲染管道中出现的顺序介绍

模型与世界空间

物体首先在物体空间(又称为模型空间、局部空间)中,常见的信息有顶点位置和表面法向量

将坐标从物体空间中转换到世界空间中,这个过程被称为模型变换。通常,光照计算使用的是世界空间,但其实使用什么坐标空间都无所谓,只需要保证光照和物体处于一个空间中即可。

摄像机空间

通过视变换,顶点从世界空间变换到摄像机空间(又称为眼睛空间)

摄像机空间的原点是投影中心,一个轴是平行于投影方向、垂直于投影面,另一个轴是由上、下面相交得到,最后一个轴则是左右面相交得到。

如果我们考虑的是透视空间,那么一个轴可以认为是水平的,另一个轴可以认为是垂直的

img.png

对于左手坐标系,常约定摄像机指向的方向为+z,+x指向右方向,+y指向上方向

裁剪空间

接着由变换到裁剪空间(又称为标准视体空间),变换的矩阵被称为裁剪矩阵

根据使用4x4矩阵进行透视投影章节中的描述,将3D空间中的点投影到z=d投影平面上,对应的投影矩阵为

[100001000011d0000]

我们知道相机中焦距发生改变时会对成像大小造成影响,具体的影响是

  • 焦距变大,图像更大
  • 焦距变小,图像更小

但是对于计算机而言,却不是如此的。当d发生改变时,视锥体的形状、投影平面的大小会发生改变。

那么就会导致在输出屏幕给定的前提下,成像的大小是不变的,那么就意味着d值的大小并不会对成像造成影响,为了方便起见,我们令d=1

那么投影矩阵可以简化为

[1000010000110000]

那么对齐次空间中的向量[x y z 1]进行透视投影,则有

[xyz1]·[1000010000110000]=[xyzz][xzyz1]

假设zoomxzoomy分别为水平、垂直方向上的缩放值,设nf分别是近、远剪切面的距离

OpenGL风格的DIP矩阵如下,这里近裁剪面到远裁剪面的z值在[-w,w]之间

[zoomx0000zoomy0000f+nfn1002nfnf0]

DirectX风格的DIP矩阵如下,这里近裁剪面到远裁剪面的z值在[0,w]之间

[zoomx0000zoomy0000ffn100nfnf0]

屏幕空间

视锥体完成了几何体的裁剪之后,需要将几何体投影到屏幕空间,输出窗口的大小并不一定要等于屏幕大小,只需要保证比例相等即可

参考

【1】裁剪矩阵推导