码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-07 20:10:58      阅读:205      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!