最近在研究透视投影,Twinsen大神的神贴有非常详细的推导过程(传送门),这里做一下学习笔记。
首先是两点基础的原理:
1.P经过矩阵M变换后得到P’点,如果知道P(x,y,z)和变换后的P’(x’,y’,z’),只要P’点的各个分量x’,y’,z’可以表示成原分量x,y,z的线性表示,那么就可以反推出变换矩阵M。如P(x,y,z),变换后的P’(2x+3y,7z,x+2y+3z),则可以推导出变换矩阵为:
2.为了方便裁剪,顶点最终会被变换到一个叫做规则观察体(CVV)中,它是一个x,y,z均为[-1,1]的立方体,由于透视投影的视景体是锥形,所以要将视景体与CVV进行映射,就需要一个线性插值的过程,将[left,right]变换到[-1,1],将[bottom,top]变换到[-1,1],将[near,far]变换到[-1,1],如图:
下面简单的写下推导的主要步骤。
图中P(x,y,z),投影平面为近平面,投影点P’(x’,y’,z’),那么根据相似三角形有x/z=x’/z’,其中z’=-N,所以可以求得x’=-Nx/z,同理得y’=-Ny/z,所以P’(-Nx/z,-Ny/z,-N)。
这里得到的P’点的z坐标为常量,它不是x,y,z的线性组合,无法构建变换矩阵。通过观察-Nx/z,-Ny/z,都与1/z成线性相关,所以如果z’也与1/z线性相关,则可以得到P’(-Nx/z,-Ny/z,-(az+b)/z),然后转换成齐次坐标P’(Nx,Ny,az+b,-z),这样就可以构建出变换矩阵了。
所以在我们作为矩阵的变换后,记得将齐次坐标转换成普通坐标才是最终结果,也就是透视除法。
当然上面得到的矩阵并不是最终的矩阵,还需要构建CVV。
Z方向上:
X和Y方向上:
所以最终的投影点为
同理P’各个分量乘以-z,得到
使得各个分量均为x,y,z的线性表达式,这样就可以推导出变换矩阵
=>
同样要记得:顶点通过该矩阵变换后,还要经过透视除法才能得到最终投影的点。之前看书时说投影矩阵变换得到的顶点坐标各个分量的值域是[-w,w],原来是从这里反推的,也就明了。