參考資料
http://blog.csdn.net/shadow_gz/article/details/6394827
http://www.klayge.org/wiki/index.php?title=%E5%BB%B6%E8%BF%9F%E6%B8%B2%E6%9F%93
從project space轉換到view space下
需要的東西,
1 . linear z=viewz/z_far;
2. 螢幕座標.
3.一個預計算的view dir.
klayge裡面說法view dir似乎是需要靠自動插值來的(4個點),我的實現方法只需unproject1個點計算,不知道是否正確。 但是我畫圖感覺應該是正確的,
ab為遠裁面。
cam為攝像機座標,就是view space的原點。
由圖可見,對於垂直於視線的任意投影螢幕,x/z和y/z是確定的
所以只需unproject一個點即可用linearz求出 dx,dy
測試代碼:
D3DXMATRIX mprj;
D3DXMatrixPerspectiveFovLH( &mprj,60,4.0f/3.0f,1.0f,10000.0f);
D3DXMATRIX iprj;
D3DXMatrixInverse(&iprj,NULL,&mprj);
D3DXVECTOR3 p(-1,-1,1.0f);
D3DXVECTOR3 r;
D3DXVec3TransformCoord(&r,&p,&iprj);
sys_msg("0 -> %f %f %f\n",r.x,r.y,r.z);
//view dir
r.x/=r.z;
r.y/=r.z;
r.z=1;
//測試decode pos
D3DXVECTOR3 t(-0.5,0.5,3000);
r.x=-t.x*t.z*r.x;
r.y=-t.y*t.z*r.y;
r.z=t.z;
sys_msg("1 -> %f %f %f\n",r.x,r.y,r.z);
//再project
D3DXVec3TransformCoord(&t,&r,&mprj);
sys_msg("2 -> %f %f %f\n",t.x,t.y,t.z);
//然後unproject
D3DXVec3TransformCoord(&r,&t,&iprj);
sys_msg("3 -> %f %f %f\n",r.x,r.y,r.z);
計算的結果是非常接近的,考慮到浮點誤差,應該就是正確結果。