首页 > 其他 > 详细

将深度缓冲z值变换到相机坐标系

时间:2016-08-07 20:10:18      阅读:249      评论:0      收藏:0      [点我收藏+]

将Depth Buffer中的Z值转换到Camera坐标系下需要使用投影矩阵

OpenGL:

OpenGL的投影矩阵为

技术分享

设Camera坐标系下点为(Vx,Vy,Vz,1.0)

通过上述投影矩阵变换后的点为(Px,Py,Pz,-Vz)

Px与Py我们不关心,Pz=Az+B,A=-(f+n)/(f-n),B=-2fn/(f-n),

然后各项除以w,Pz=-A-B/Vz

现在Pz在[-1,1]之间,OpenGL会将其变换到[0,1]内得到Dz

以上就是Camera坐标系到投影坐标系的过程

 

当得到Depth Buffer中的Dz,按照以下流程得到Camera坐标系Vz

1.  将Dz从[0,1]变换到[-1,1]得到Dz’,即Dz’=2*Dz-1

2.  由前述可知Dz’=-A-B/Vz,Vz=-B/(A+Dz’)

  在已知f和n的情况下,Vz=2fn/(Dz’(f-n)-(f+n))

  由于OpenGL是右手坐标系,Camera朝向的是-z方向,所以上述Vz要乘以-1.0

  即Vz=-1.0*Vz

  Vz=B/(A+Dz’)

  Vz=2fn/((f+n)-Dz’(f-n))

 

以上是OpenGL的变换过程

 

D3D的变换过程

D3D的投影矩阵为

技术分享

设Camera坐标系下点为(Vx,Vy,Vz,1.0)

通过上述投影矩阵变换后的点为(Px,Py,Pz,Vz)

Px与Py我们不关心,Pz=Az+B,A=f/(f-n),B=-fn/(f-n),

然后各项除以w,Pz=A+B/Vz

由此得到的Pz在[0,1]之间,Pz即为Depth Buffer中的Dz

 

已知Dz我们使用以下流程得到Vz

Dz=A+B/Vz

Vz=B/(Dz-A)

Vz=fn/(f-Dz(f-n))

将深度缓冲z值变换到相机坐标系

原文:http://www.cnblogs.com/sunny-wang/p/5746949.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!