坐标空间的变换
渲染游戏的过程可以理解成是把一个个顶点经过层层处理最终转化到屏幕上的过程。
主要涉及到的坐标空间变换如下图:
坐标空间
模型空间(对象空间或局部空间)
- 模型空间的原点和坐标轴通常是有美术人员在建模软件里确定好的。
- 可以在顶点着色器中访问到模型的顶点信息。
世界空间
世界空间的原点放置在游戏空间的中心。
观察空间(摄像机空间)
观察空间是摄像机的模型空间,是模型空间的一个特例。
裁剪空间
主要是使用投影矩阵对在观察空间的顶点变换到裁剪空间,为后面在屏幕空间进行齐次除法做准备。
- 透视投影
- 正交投影
透视投影示意图:
正交投影示意图:
投影矩阵的目的:
- 为投影做准备(经过投影矩阵的变换后,顶点的w分量将会具有特殊的意义)
- 对分量进行缩放(直接使用视锥体的6个裁剪面进行裁剪比较麻烦)
投影结果:
若变换后得到的顶点满足以下条件:
则原顶点位于裁剪空间内,证明如下:
我们最终的目的是将顶点转换为归一化设备坐标,从而满足如下条件就说明该顶点在视锥体内,
在投影矩阵的推导过程中(见https://mp.csdn.net/postedit/88760626),为了计算出投影矩阵将计算得到的归一化设备坐标各乘以原来的坐标,从而有
即
- (就是裁剪空间下的x坐标)
- (就是裁剪空间下的y坐标)
- (就是裁剪空间下的z坐标)
屏幕空间
真正的投影,把视锥体投影到屏幕空间(二维空间)。
步骤:
- 进行标准齐次出发(透视除法),即用齐次坐标系的除分量,最终得到归一化的设备坐标(NDC);
- 根据变换后的和坐标来映射输出窗口的对对应像素坐标,公式如下:
注:和分别表示屏幕宽高,分量会被用于深度缓冲。
齐次除法示意图:
坐标空间的变换计算过程
已知子坐标空间的3个坐标轴在父坐标空间下的表示,,,以及其原点位置,子坐标空间到父坐标空间的转换矩阵为,则
即把3个坐标轴依次放入矩阵的前3列,把原点矢量放到最后一列,再用1和0填充。
注:
- 只变换方向(如法线方向、光照方向),则可以只取前3行前3列来进行变换。
- 可以求得逆矩阵,即可以通过变换矩阵来得到坐标空间下坐标轴和原点在另一个坐标系下的表示。
- 特别的,如果转换矩阵为正交矩阵,可以提取第一列来得到坐标空间的轴在坐标空间下的表示,可以提取第一行来得到坐标空间的轴在坐标空间下的表示,这是通过正交矩阵的逆矩阵等于转置矩阵得到的。