从深度缓冲里重建位置信息

参考资料

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);

 

计算的结果是非常接近的,考虑到浮点误差,应该就是正确结果。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值