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

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

时间: 2024-10-03 11:09:20

将深度缓冲z值变换到相机坐标系的相关文章

现代OpenGL教程 03 - 矩阵,深度缓冲,动画

http://huangwei.pro/2015-08/modern-opengl3/ 本文中,我会将不会动的2D三角形替换为旋转的3D立方体.你会看到这样的效果: 现在我们终于能在屏幕上搞点有趣的东西了,我放了更多的动图在这里:http://imgur.com/a/x8q7R 为了生成旋转立方体,我们需要学些关于矩阵的数学,用于创建透视投影,旋转,平移和"相机"概念.我们还有必要学习些深度缓冲,和典型的随时间改变的3D应用,比如动画. 获取代码 所有例子代码的zip打包可以从这里获取

深度缓冲

本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 在计算机图形学中,深度缓冲(Depth Buffer)又称Z缓冲区,是一个与渲染目标有相同大小的缓冲,这个缓冲记录每个像素的深度.深度缓冲的目的在于正确地生成通常的深度感知效果:较近的物体遮挡较远的物体. 中文名 深度缓冲 外文名 Depth Buffer 分    类 计算机图形学 别    名 Z缓冲区(Z-buffer) 通常认为深度缓冲概念的发明主要归功于 艾德文·卡特姆,虽然 Wolfgang Straßer 也

白话空间统计之四:P值和Z值(上):零如果

本来今天想要讲讲软件操作的,后来发现好像还有好几个重要的指标没有说,干脆等所有说完在讲操作吧.否则操作出来的结果会发现大量的"不明觉厉". 首先是空间统计里面非常神奇的两个值:P值和Z值. 要说这两个值之前.还是要复习一下统计学的概念.毕竟空间统计的理论基础还是建立在经典统计学上面的. 首先,统计学里面.有一个叫做"零如果"的概念很厉害,一定要说说. 零如果(null hypothesis),有时候又称原如果,官方的解释是:指进行统计检验时预先建立的如果.也就是说,

ArcGIS高程Z值的去除方法

在ArcGIS中,我们常用的几何类型有点.线.面.体(体,在涉及三维的情况下使用),但在这之外,可能会遇到带ZM的类型,如图所示,面ZM,它与面类似,但比面多两个字段. 在编辑中查看草图属性可看到Z值和M值.Z值是用来存储高程属性信息的,M值是用来存储其他属性信息的,如温度.浓度等.这里的数据是CAD文件转过来的,所有有高程值,但没有M值. 从下面的WKT格式中可以看出几何点可能的类型有Point.PointZ.PointM.PointZM四种格式,Polyline.Polygon也是类似的.

ASP中轻松实现变量名-值变换

用过PHP的朋友都知道,PHP中变量的使用灵活方便,特别是能在字符串中方便实现变量名-值变换,使得整个PHP代码更显简洁优美.比如一条更新数据库的SQL语句只需写成:"update users set password='$password', group=$group, name='$username' where account='$account'",其中的$password.$group.$username.$account便会被实际的变量值替换,而在ASP中要实现相同的功能必

Lua自己实现深度克隆一个值

深度克隆一个值 ~~~ lua -- 下面的代码,t2 是 t1 的引用,修改 t2 的属性时,t1 的内容也会发生变化 local t1 = {a = 1, b = 2} local t2 = t1 t2.b = 3    -- t1 = {a = 1, b = 3} <-- t1.b 发生变化 -- clone() 返回 t1 的副本,修改 t2 不会影响 t1 local t1 = {a = 1, b = 2} local t2 = clone(t1) t2.b = 3    -- t1

白话空间统计之四:P值和Z值(上):零假设

本来今天想要讲讲软件操作的,后来发现好像还有好几个重要的指标没有说,干脆等全部说完在讲操作吧,否则操作出来的结果会发现大量的"不明觉厉". 首先是空间统计里面很神秘的两个值:P值和Z值. 要说这两个值之前,还是要复习一下统计学的概念,毕竟空间统计的理论基础还是建立在经典统计学上面的. 首先,统计学里面,有一个叫做"零假设"的概念非常厉害,一定要说说. 零假设(null hypothesis),有时候又称原假设,官方的解释是:指进行统计检验时预先建立的假设.也就是说,

webgl 深度缓冲

深度缓冲很强大,用起来很简单 开启深度缓冲 gl.enable(gl.DEPTH_TEST); 清除深度缓存 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 为什么要用它呢? 因为画一些三维图形时,很难困难层级,深度缓冲就是帮你干这事的. 原文地址:https://www.cnblogs.com/honghong87/p/9760174.html

arcgis 数据和服务中的z值,以及地下三维展示(附代码)

最近在进行地图符号的三维配置,在尝试三维符号时,发现无论如何都无法出现地下的效果,很郁闷,终于在好闺蜜的帮助下了解到了关于数据和服务的z值 一.什么是z值 z 值通常表示可用于以三维形式显示要素的高程或高度.要素的各折点可将 z 值与 x,y 位置信息一同存储.虽然 ArcMap 及其编辑环境是二维的,但仍可以输入.编辑和维护 z 值. 在 ArcMap 中执行编辑操作时,z 值的分配由编辑工具或命令所执行的常规功能决定:是创建新要素还是编辑现有要素.所创建的.用于生成新要素的大多数操作都会为所