投影矩阵将空间任意一点Q投射到近平面上P,并 Px = [-1,1],Py = [-1,1],Pz = [-1,1],相机为空间原点
其中:n 近平面,f 远平面,l左平面,r右平面,t顶平面,b底平面,fovy纵向视野角度 aspect视口宽度/高度
1:根据三角几何学 Qx/n = Px/Pz
所以矩阵可以为
MatA
1 0 0 0
0 1 0 0
0 0 1 0
0 0 1/n 0
2:将x,y转换到[-1,1]
MatB:
1 0 0 -(l+r)/2
0 1 0 -(t+b)/2
0 0 1 -(f+n)/2
0 0 0 1
MatC:
2/(r-l) 0 0 0
0 2/(t-b) 0 0
0 0 2/(f-n) 0
0 0 0 1
/
ProjectionMat4:
MatC * MatB * MatA
2/(r - l) 0 -(r+l)/(n*(r-l) 0
0 2/(t-b) -(t+b)/(n*(t-b)) 0
0 0 j k
0 0 1/n 1
令z[-1,1]
当Qz = n时 Pz = -1
(jn + k)/n = -1
(jf + k)/n = 1
k=2fn/(n-f)
j=-(n+f)/(n-f)
令 l = -r,t = -b , l = -r;
ProjectionMat4:
n/r 0 0 0
0 n/t 0 0
0 0 -(n+f)/(n-f) 2fn/(n-f)
0 0 1 0
令 t = n * tan(fovy/2),r = aspect * t =aspect * n * tan(fovy/2)
最终ProjectionMat4:
1/aspect/tan(fovy/2) 0 0 0
0 1/tan(fovy/2) 0 0
0 0 -(n+f)/(n-f) 2f*n/(n-f)
0 0 1 0
实现代码