我曾经在Shader山下(十六)坐标空间与转换矩阵中介绍过,一个物体要显示在平面上,需要经过四步空间变换(实际上是五步):
物体空间->世界空间->观察空间->裁剪空间(->归一化设备空间)->屏幕空间
(差不多就是这个意思)
实际上,在可编程渲染管线中,我们往往只需要操作从物体空间到裁剪空间的转换,可以用一个矩阵链乘M(odel)V(iew)P(rojection)表示。本文就介绍一下这三个矩阵。
索性全介绍了吧。
先简单介绍一下变换矩阵。
常用的变换矩阵有三种:平移矩阵、旋转矩阵和缩放矩阵。
平移矩阵:
如果一个物体在世界坐标系中的位置为 (px,py,pz) ,那么它的平移矩阵为:
旋转矩阵:
绕x轴旋转 θx ,旋转矩阵为:
绕y轴旋转 θy ,旋转矩阵为:
绕z轴旋转 θz ,旋转矩阵为:
缩放矩阵:
一个向量沿x、y、z轴分别缩放 (qx,qy,qz) ,那么缩放矩阵为:
组合成变换矩阵
只需要将这些矩阵链乘即可。但是需要注意顺序。这里按照T(ranslate)R(otate)S(cale)和H(eading)P(itch)B(ank)的顺序进行链乘。
Q=T(p)Ry(θy)Rx(θx)Rz(θz)S(q)
等等!为什么是4*4的矩阵?参见百度百科齐次坐标
简单来讲,3*3的矩阵只能表示旋转和缩放矩阵,为了表示平移,便扩充为4*4的矩阵。
当然点或向量要与矩阵运算时也要扩充为4维(x,y,z,w)。其中w=1表示点,w=0表示向量。因为向量只有方向没有位置,所以w=0便不会与矩阵第4行进行运算。
模型变换矩阵
这个本身没什么,其实就是相对位置(模型空间)到绝对位置(世界坐标)的一个变换。
已知模型的位置、旋转角度和缩放值,带入之前的公式,便可以得到相应的模型变换矩阵。
当要计算模型内部某个点的世界坐标时,只需要将这个点与变换矩阵相乘即可。
观察矩阵
摄像机的方位可以由四个向量表示, p 表示位置,
在空间变换时,我们希望将摄像机移动到世界坐标原点,并且观察方向与z轴重合,上方向与y轴重合,右方向与x轴重合。当然世界中的物体也要随之变换。
2D平面演示:
设V为观察矩阵,那么就有:
Vp=(0,0,0)
Vr=(1,0,0)
Vu=(0,1,0)
Vd=(0,0,1)
因为摄像机没有大小,只有位置和方位,那么就表示,我们通过平移和旋转来完成这个变换。
首先是平移矩阵
没什么好说的: