1、正交投影
上图就是unity中的摄像机,把摄像机设置为正交投影,我们可以在inspector界面调整clipplane的大小,可以发现无论怎么调整,far和near都不会相等,下面会对在推导的过程中对这一现象做出解释。
在做投影的时候,x和y的值会被缩放到[-1,1],而z的值在dx里面是[0,1],在opengl是[-1,1]。
现在设六面体的宽是w,高是h,近裁剪平面距摄像机距离是n,远裁剪平面距摄像机的距离是f。
那么x的取值范围就是-w/2<x<w/2,要把x映射到-1<x<1,首先式子两边乘以2得到-w<2x<w,再给两边同时除以w得到-1<2x/w<1
就把x映射到了-1到1之间。那么映射之后的x'=2x/w。
同理,y也需要映射到-1到1之间,那么映射之后的y'=2y/h
z有点不一样,xy因为默认在中心所以不需要平移,只需要缩放就行了。z的取值范围在[n,f]之间。写成不等式的形式,
n<z<f,首先两边同时减去n得到0<z-n<f-n,在同时除以f-n(这就是f和n不能相等的原因)0<(z-n)/(f-n)<1,这就把z映射到了[0,1],如果要映射到[-1,1],就再给不等式两边乘以2,然后减去1就行了。
有了上面的关系式,我们很轻松能把这个过程用4x4矩阵来表示: