一种基于光线追踪的计算全息遮挡处理算法的制作方法

文档序号:14837334发布日期:2018-06-30 12:58阅读:294来源:国知局
一种基于光线追踪的计算全息遮挡处理算法的制作方法

本发明属于全息立体显示、虚拟现实领域,具体是一种基于光线追踪的计算全息遮挡处理算法。



背景技术:

我们生活在三维的立体世界之中,目前人们在三维信息的获取、储存、处理和传递等方面已经取得了很大的成就,然而把这些三维信息真实的显示出来却是面临的一个重大技术难题。能够反映真实世界的三维立体显示技术被认为是二十一世纪最伟大的革命之一,已经涉及到日常生活中的许多领域,如3D电影、娱乐表演、虚拟现实和军事训练等。三维显示目前已经成为一个前沿科技领域,吸引了许多科研工作者从事相关工作,也成为各国大力发展的下一代新型显示技术。全息三维显示由于其原理上的真三维特性,被业内人士普遍认为是终极三维显示技术。

遮挡效果提供了三维空间中物体的深度信息,可以反应出物体之间的空间位置关系,是实现深度视觉最重要的因素,也是影响三维显示效果的重要因素。由于全息图计算过程本身就具有计算量大的特点,大多数全息图计算算法并没有考虑场景中物体之间以及物体自身遮挡效果的处理,这导致全息再现过程中物体的再现像无法还原出物体间正确的空间位置关系,呈现出“透明”的效果。



技术实现要素:

本发明针对全息图计算中的遮挡处理问题,结合光线追踪算法内含的物体遮挡信息,同时考虑全息图具有的移动视差特点,将光线追踪应用于全息图计算,针对点云模型设计实现了具有遮挡效果的全息图计算算法,并通过数值实验和光学实验验证了算法的有效性;具体是一种基于光线追踪的计算全息遮挡处理算法;包括以下几个步骤:

步骤一:针对某三维物体的点云模型,并将点云模型所在的空间包围盒进行剖分,建立 KD-Tree加速结构;

具体步骤如下:

步骤101、计算给定点云模型的轴对称包围盒,该包围盒即为KD树的根节点。

步骤102、计算当前节点在X、Y、Z坐标轴方向上的最大尺寸dmax=max(dx,dy,dz);

当前节点的初始值为根节点;

步骤103、判断最大尺寸dmax是否小于等于给定的阈值δ;如果是,则剖分结束。否则,进入步骤104;

步骤104、沿最大尺寸dmax所在的轴对当前节点进行均匀等剖,新生成的子节点作为当前节点,返回步骤102;

步骤105、剖分完成后,建立模型对应的KD-Tree结构,同时确定模型中各个物点和KD 树叶节点之间的对应关系;

对于模型中的任意一个物点,必定属于KD-Tree的某一个叶节点,同时KD-Tree的每个叶节点包含若干物点。

步骤二、根据建立的KD-Tree结构,通过宽度优先遍历转换成线性存储结构,以便在GPU 上进行存储和访问,实现光线追踪过程;

具体步骤如下:

步骤201、针对每条光线,判断该光线是否与当前节点相交,如果是,进入步骤202;否则,交点设为0并返回该交点值。

当前节点初始值为根节点;

步骤202、查询当前的遍历深度是否大于等于0,如果是,进入步骤203;否则,交点设为0并返回该交点值。

步骤203、判断当前节点是否为叶子节点,如果是,进入步骤209;否则,获取当前节点的剖分轴,进入步骤204;

步骤204、计算光线进入当前节点的交点在剖分轴上的分量in Value;

步骤205、判断剖分轴的位置是否大于分量in Value,如果是,进入步骤206;否则,进入步骤207;

步骤206、光线进入左子节点,光线射向右子节点,则把右子节点入栈;进入步骤208;

步骤207、光线进入右子节点,光线射向左子节点,则把左子节点入栈;

步骤208、遍历深度自增1,将光线进入的子节点作为当前节点,返回步骤203;

步骤209、判断当前叶节点是否为空,如果是,进入步骤210;否则,交点设为0并返回该交点值。

当前叶节点为空即不包含物点。

步骤210、判断当前的遍历深度是否小于等于0,如果是,交点设为0并返回该交点值;否则,进入步骤211;

步骤211、判断当前的遍历深度栈是否为空,如果是,则遍历深度减1,回退到当前节点的父节点,返回步骤210;否则,进入步骤212;

步骤212、将当前节点的兄弟节点出栈,作为当前遍历节点;并判断光线是否与当前遍历节点相交,如果是,返回步骤202;否则,遍历深度减1,回退到当前节点的父节点,返回步骤210。

步骤三、若干光线经过对KD-Tree结构的追踪,根据返回值为非0的叶节点,得到每条光线追踪的可见物点;

返回值为0的交点忽略不计。

步骤四、利用若干光线追踪得到的所有可见物点计算全息图;

具体步骤如下:

首先,初始人为设定全息图划分的子全息图个数;

然后,对每个子全息图分别赋予一个独立的视点,根据光线追踪得到的所有可见物点,通过点源法计算每个子全息图中每个像素的值。

计算公式如下:

其中Omn表示第m行n列子全息图的复振幅分布,Nmn表示该子全息图可见的物点个数。

Ap表示第p个点的振幅,j为虚数单位,k表示波数,rp为第p个点到当前全息图像素位置的距离,是第p个点的初始相位。

最后,将不同视点下对应的子全息图按顺序组合得到最终的全息图,同时实现移动视差效果。

步骤五、根据最终的全息图得到给定的该物体的三维立体像图。

本发明的优点在于:

(1)本发明一种基于光线追踪的计算全息遮挡处理算法,设计了一种虚拟栈结构,通过高效的二进制位运算,实现了GPU上栈的功能,解决了GPU对栈结构支持不完善的问题。

(2)本发明一种基于光线追踪的计算全息遮挡处理算法,基于虚拟栈设计了GPU上 KD-Tree的遍历算法,通过优化节点入栈的条件,减少了遍历过程中的冗余计算,提高了光线追踪的效率。

(3)本发明一种基于光线追踪的计算全息遮挡处理算法,通过把全息图划分为子全息图,实现了全息成像的移动视差效果;同时设计了基于KD-Tree叶节点之间遮挡关系判断的光线追踪过程,实现了全息成像中正确的物体遮挡效果。

(4)本发明一种基于光线追踪的计算全息遮挡处理算法,以KD-Tree叶节点包围盒和光线的相交关系作为该包围盒内物点和光线的相交关系,解决了传统把点作为面元处理计算效率低的问题,实现对点云模型进行光线追踪的快速求交计算。

附图说明

图1是本发明针对某点云模型进行空间剖分的二维视图;

图2是本发明一种基于光线追踪的计算全息遮挡处理算法流程图;

图3是本发明建立KD-Tree加速结构的剖分算法流程图;

图4是本发明每个子全息图中的光线分布范围示意图;

图5是本发明基于虚拟栈的KD-Tree遍历算法流程图;

图6是本发明实施例中的节点入栈条件示意图;

图7是本发明实施例中遮挡效果实验三维场景图;

图8是本发明实施例中遮挡处理前后点云对比图;

图9是本发明遮挡处理前后的数值和光学再现像对比图;

图10是本发明移动视差实验场景三视图;

图11是本发明不同视角下点云模型的再现像图。

具体实施方式

下面结合附图对本发明的具体实施方法进行详细说明。

本发明设计了点云模型光线追踪的快速求交算法,通过对物体点云所在的空间包围盒进行剖分构建KD-Tree加速结构,控制KD-Tree叶节点的大小,把位于同一叶节点内的物点作为一个整体考虑,忽略内部各点之间的相互遮挡关系,从而物点之间的遮挡关系转化为 KD-Tree叶节点之间的遮挡关系问题,这样就解决了光线追踪算法在用于点云模型时无法直接进行求交运算的问题,通过约束叶节点的大小实现比较精确的遮挡效果;同时使用KD树结构来进行光线追踪过程中场景遍历算法的加速。

所述的一种基于光线追踪的计算全息遮挡处理算法,如图2所示,包括以下几个步骤:

步骤一:针对某三维物体的点云模型,并将点云模型所在的空间包围盒进行剖分,建立 KD-Tree加速结构;

对于给定的点云模型,首先计算其轴对称包围盒,该包围盒即为KD树的根节点。

接着对此包围盒进行规则剖分,得到模型对应的KD树结构;空间剖分过程的二维视图如图1所示,剖分沿着平行于X、Y、Z坐标轴的方向进行,选择要剖分节点的最长的轴进行规则的中心剖分,每一个节点被分成两个相等的子节点;当节点在X、Y、Z方向的长度均小于给定的阈值时,剖分过程停止。

剖分完成时,建立起了模型对应的KD树结构,同时建立了模型中各个点和KD树叶节点之间的对应关系,剖分算法流程如图3所示,具体步骤如下:

步骤101、计算给定点云模型的轴对称包围盒,该包围盒即为KD树的根节点。

步骤102、计算当前节点在X、Y、Z坐标轴方向上的最大尺寸dmax=max(dx,dy,dz);

当前节点的初始值为根节点;

步骤103、判断最大尺寸dmax是否小于等于给定的阈值δ;如果是,则剖分结束。否则,进入步骤104;

步骤104、沿最大尺寸dmax所在的轴对当前节点进行均匀等剖,新生成的子节点作为当前节点,返回步骤102;

步骤105、剖分完成后,建立模型对应的KD-Tree结构,同时确定模型中各个物点和KD 树叶节点之间的对应关系;

对于模型中的任意一个物点,必定属于KD-Tree的某一个叶节点,同时KD-Tree的每个叶节点包含若干物点。

步骤二、根据建立的KD-Tree结构,通过宽度优先遍历转换成线性存储结构,以便在GPU 上进行存储和访问,实现光线追踪过程;

对于每一条追踪光线来说,都需要对整个场景进行遍历,以求得和场景中物体最近的交点。场景的遍历是光线追踪的核心计算,也是最耗时的计算,遍历的效率直接关系到光线追踪算法的快慢,如何实现遍历过程的加速是一直伴随光线追踪技术发展的热点研究问题。减少光线和物体相交计算的次数是提高遍历速度的关键,一般通过对三维场景所在的空间进行剖分,构建空间加速结构来提高光线追踪的效率。常用的空间加速结构有均匀网格、KD-Tree、包围盒层次结构、八叉树等;KD-Tree是目前在光线追踪中使用最广泛的空间加速结构,其加速效率在CPU实现中是各种结构里最优的。

传统光线追踪过程中,首先要进行光线和KD树节点之间的相交计算,对于与光线相交的KD树节点,再对该节点内的物体单元逐一和光线进行相交计算。在本文算法中,当阈值取的足够小时,忽略该叶节点内各物点之间的遮挡关系,把每个叶节点内的物点作为一个整体来考虑。这样,物体模型各点之间的遮挡关系就转化为KD树的各叶节点之间的遮挡关系。由于不考虑同一节点内物点之间的遮挡关系,因此只需要进行光线和KD树节点包围盒的相交计算,把每个KD树叶节点内的物点作为一个整体,以光线和节点包围盒的相交关系作为光线和该包围盒内部物点的相交关系,可以大大减少光线追踪过程的计算量。

和传统点云模型的光线追踪算法相比,这种处理方法不再需要把每个物点转化为一个圆盘和光线进行相交测试,而是在KD树剖分过程中对KD树叶节点的剖分粒度施加约束。另一方面,这种处理方法由于要求KD树的叶节点更小,会导致KD树的规模变大,占用更多的存储空间,相当于用空间换时间。

通过设计虚拟栈结构,模拟栈的功能,实现了GPU上基于虚拟栈的KD-Tree遍历算法,达到了对光线追踪进行加速的目的。虚拟栈是通过二进制位运算来模拟栈功能的结构,由一个栈状态标识和一个遍历深度计数器组成。其中遍历深度计数器表示当前遍历的节点在 KD-Tree中所处的深度位置,栈状态标识是一个32位无符号整数,每个位上的值表示了对应的遍历深度节点的状态,1对应着节点已经入栈,0对应着节点未入栈或者已出栈。

基于栈结构进行KD-Tree遍历的时候,可以直接在栈中保留下一个要遍历的节点,因此遍历过程非常高效。

本发明基于虚拟栈的遍历算法和传统栈的遍历算法有一定的区别,在对节点进行入栈时并不要求节点一定与光线严格相交,只要光线与节点有可能相交就把节点入栈。如果求交失败,且当前遍历深度栈不为空,则把对应节点出栈进行求交,如果为空则回退到当前节点的父节点继续遍历。

由于用KD树节点之间的遮挡关系代替物体点云之间的遮挡关系,而不包含任何物点的空节点是不应该对其他节点形成遮挡的,因此在对光线和KD树节点进行相交测试前,要先判断该节点内是否包含物点。对包含物点的节点进一步判断光线和该节点的相交情况,对空节点则直接跳过。

遍历过程针对KD-Tree的节点包围盒进行。针对每条光线,首先判断是否与根节点包围盒相交,如果不相交则返回背景颜色,遍历过程结束,如果相交则查询当前的遍历深度,如果遍历深度小于零则求交失败,返回背景颜色,如果遍历深度不小于零,就判断当前是否为叶子节点,直到求出与该条光线相交的第一个非空叶子节点,该节点内包含的物点即为当前光线可见的物点。所有光线可见的物点一起构成了物体的可见部分。在后续计算全息图时,只需要计算这些可见的物点即可。

算法流程图如图5所示,具体步骤如下:

步骤201、针对每条光线,判断该光线是否与当前节点相交,如果是,进入步骤202;否则,交点设为0并返回该交点值。

当前节点初始值为根节点;

步骤202、查询当前的遍历深度是否大于等于0,如果是,进入步骤203;否则,交点设为0并返回该交点值。

步骤203、判断当前节点是否为叶子节点,如果是,进入步骤209;否则,获取当前节点的剖分轴,进入步骤204;

步骤204、计算光线进入当前节点的交点在剖分轴上的分量in Value;

步骤205、判断剖分轴的位置是否大于分量in Value,如果是,进入步骤206;否则,进入步骤207;

步骤206、光线进入左子节点,光线射向右子节点,则把右子节点入栈;进入步骤208;

步骤207、光线进入右子节点,光线射向左子节点,则把左子节点入栈;

步骤208、遍历深度自增1,将光线进入的子节点作为当前节点,返回步骤203;

步骤209、判断当前叶节点是否为空,如果是,进入步骤210;否则,交点设为0并返回该交点值。

当前叶节点为空即不包含物点。

步骤210、判断当前的遍历深度是否小于等于0,如果是,交点设为0并返回该交点值;否则,进入步骤211;

步骤211、判断当前的遍历深度栈是否为空,如果是,则遍历深度减1,回退到当前节点的父节点,返回步骤210;否则,进入步骤212;

步骤212、将当前节点的兄弟节点出栈,作为当前遍历节点;并判断光线是否与当前遍历节点相交,如果是,返回步骤202;否则,遍历深度减1,回退到当前节点的父节点,返回步骤210。

步骤三、若干光线经过对KD-Tree结构的追踪,根据返回值为非0的叶节点,得到每条光线追踪的可见物点;

返回值为0的交点忽略不计。

步骤四、利用若干光线追踪得到的所有可见物点计算全息图;

在图形学中,所有光线从唯一的视点出发,经过渲染图像的各个像素点投向场景中,所以整个渲染图像只有一个视点。而在全息图计算中,由于最终要形成三维立体图像,因此要求全息图计算过程中必须考虑移动视差。理想状态下全息图的每个像素都应该是一个独立的视点,但这会造成算法的实现过于复杂以及计算量的急剧增加,为实现全息图的移动视差,一般在实现过程中把整个全息图首先划分为多个子全息图,每个子全息图赋予一个视点,分别进行光线追踪。对每个子全息图而言,其光线追踪的过程和图形学中类似。这样,整个全息图的视点是离散的,全息图视差的连续性就由每个子全息图的尺寸决定。根据人眼的分辨率,一般选择每个子全息图的尺寸为128像素。

对每个子全息图,追踪光线的分布由空间光调制器的像素尺寸决定,空间光调制器像素尺寸d'和最大衍射角θ之间的关系如下式所示:

其中λ表示照明光的波长;每个子全息图对应的追踪光线都分布在2θ的范围内。如图4 所示,对该子全息图来说只有该范围内的物体是可见的。根据人眼的分辨率,相邻光线之间的夹角Δθ一般选取1/60度。

具体步骤如下:

首先,初始人为设定全息图划分的子全息图个数;

然后,对每个子全息图分别赋予一个独立的视点,根据光线追踪得到的所有可见物点,通过点源法计算每个子全息图中每个像素的值。

计算公式如下:

其中Omn表示第m行n列子全息图的复振幅分布,Nmn表示该子全息图可见的物点个数。

Ap表示第p个点的振幅,j为虚数单位,k表示波数,rp为第p个点到当前全息图像素位置的距离,是第p个点的初始相位。

最后,将不同视点下对应的子全息图按顺序组合得到最终的全息图,同时实现移动视差效果。

步骤五、根据最终的全息图得到给定的该物体的三维立体像图。

本发明的遍历算法中,节点入栈时并不会和光线进行严格的相交测试,而是只要节点有可能和光线相交就将其入栈,如图6所示。N0和N1为两个相邻子节点,A是光线和节点包围盒的交点,该交点位于节点剖分轴的左侧,此时只要光线的方向是射向N1,也就是位于图中虚线箭头所表示的角度范围之内,就将N1入栈,需要注意的是此时N1并不一定与光线相交。

上述节点的入栈是宽松的入栈条件,为了避免在入栈时进行光线和节点的相交计算,把这种相交测试放在回退遍历的过程中进行。这种方式一方面可以排除掉和光线明显不相交的节点,另一方面如果在遍历过程中已经求得了交点,就不需要再对栈内的节点进行遍历,自然也就不需要再对这些节点进行相交计算;这样就可以减少遍历过程中的不必要计算。

本发明通过光学再现和数值再现实验进行了结果验证,实验所采用的三维场景由棋盘格和bunny模型组成,如图7所示。全息面置于z轴零点,棋盘格位于z轴-600mm处,bunny 模型位于棋盘格前30mm处。当KD树剖分阈值取值为0.2mm时,遮挡处理前后的点云对比如图8所示。从图中可以看出,该算法不仅可以有效处理场景中物体之间的互相遮挡,同时可以有效处理物体自身的遮挡。

不进行遮挡处理和进行遮挡处理计算得到的全息图的数值和光学再现像,如图9所示,从图中可以看出,遮挡处理前,由于没有表现出物体之间正确的空间位置关系,bunny模型呈现出透明的效果;遮挡处理后,bunny模型和棋盘之间能够实现正确的场景透视关系。这证明了本发明所提算法能正确处理场景的遮挡关系,得到具有正确透视关系的全息图。

移动视差实验所使用的场景由一个棋盘格和一个三角面组成,如图10所示,给出了场景的斜视图、XY视图和YZ视图。全息面同样位于z轴零点,棋盘格位于z轴-600mm处,三角面位于棋盘格前100mm处。

从左、右两个视角分别观察再现像时看到的图像,如图11所示,从图中三角面和棋盘格之间的相对位置关系可以看出,在不同视角下能够观察到物体间不同的遮挡关系,这证明了本发明提出的算法可以实现正确的移动视差效果。

bunny+棋盘模型点云总共由62516个点组成,在不进行遮挡处理直接计算全息图时,消耗的时间为121.8s。使用本发明提出方法进行遮挡处理后,模型剩余的点的个数为22810个,遮挡处理消耗的时间为52.5s。对遮挡处理后的点进行全息图计算需要的时间为42s,遮挡处理加上全息图计算总时间为94.5s。对比无遮挡处理和有遮挡处理生成全息图所需要的总时间可以发现,虽然遮挡处理过程会消耗一定的时间,但由于处理后参与全息图计算的点的个数减少,全息图计算的时间会大大降低,因此生成全息图的总时间相较于不进行遮挡处理反而有比较大的减少。

遮挡处理过程涉及到KD树的构建和存储,因此需要消耗一定的存储空间。本实施例最终构建的KD树有524287个节点,每个节点占用16byte空间,总共需要的空间约为32Mbytes,这对于如今的硬件来说是可以接受的。

本发明将光线追踪技术应用于全息图计算过程中的遮挡判断,实现具有遮挡效果的全息三维显示,同时设计了光线追踪的加速算法,实现计算过程的加速。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1