透视投影变换理论推导
xs = xp*kx + x0
ys = -yp*ky + y0
矩阵Tps为:
|kx 0 0 0 |
|0 -ky 0 0 |
|0 0 1 0 |
|x0 y0 0 1 |
(验证:Tps右乘点p(xp,yp,zp,1)得点p'(xp*kx + x0, -yp*ky + y0, zp, 1),转换为3D坐标为(xp*kx + x0, -yp*ky + y0, zp),正确。)
其中,kx,ky(kx>0,ky>0)为x,y轴向的缩放因子(kx=(width_s)/(width_p), ky = (height_s)/(height_p),和视距相同,kx,ky的值必须一样,否则图像的x,y比例又会发生变形。这里-yp*ky是因为一般屏幕的y轴是向下的,跟相机空间和视平面坐标系中的y轴方向相反。
------------------------------------------------------------------------------------------------
结论3: 一般令k=kx=ky,即x,y向的缩放因子相同。否则,图像失真。
于是有,width_s/width_p = height_s/height_p,变化等式得,rp = width_p/height_p = width_s/height_s = rs
所以,在x,y轴视距一样的情况下,要想最后变换到屏幕上的图像x,y比例不失真,必须rp=rs,即视平面的宽高比和屏幕的宽高比一样。
-----------------------------------------------------------------------------------------------
********************************************************************
注:若屏幕宽高为W,H,当W != H,即屏幕不为方形的时候,要确保投影到屏幕上的图像x,y比例不失真,则x,y轴视角(或视野FOV)肯定不能相等。
原因: 由结论2,3知,rp=width_p/height_p = tan(theta_x/2)/tan(theta_y/2)=width_s/height_s=rs=W/H。 故由W/H != 1 => theta_x != theta_Y.
********************************************************************
3.综合:
相机空间点p转换到屏幕空间点p',变换公式为:
xs = xc*(dx/zc)*kx + x0 = xc*(d/zc)*k + x0
ys = -yc*(dy/zc)*ky + y0 = -yc*(d/zc)*k + y0
综合变换矩阵(相机空间到屏幕空间)Tcs为:
Tcs = Tcp*Tps =
|d*k 0 0 0 |
|0 -d*k 0 0 |
|x0 y0 1 1 |
|0 0 0 0|
其中,d为视距,k为屏幕和视平面之间的宽度比或高度比,x0,y0为屏幕中心,注:最后需转换为3D坐标。
(验证:Tcs右乘点p(xc,yc,zc,1)得点p'(xc*d*k + x0*zc, -yc*d*k + y0*zc, zc, zc),转换为3D坐标为(xc*(d/zc)*k + x0, -yc*(d/zc)*k + y0, 1),正确。)
4.一般情形:
************************************
视距为1,x轴视角为90度,屏幕宽高为W,H.
************************************
代入d=1,theta_x = PI/2,x0= W/2,y0=H/2,则视平面宽高为width_p = 2。
要确保屏幕上的图像x,y比例不失真,即rs=rp,有
height_p = 2/rp=2/rs=2H/W,
k=kx=ky=width_s/width_p = W/2.
于是,矩阵为:
Tcs1 =
|W/2 0 0 0 |
|0 -W/2 0 0 |
|W/2 H/2 1 1 |
|0&nb