基于图形学的大场景快速求交方法与流程

文档序号:18401025发布日期:2019-08-09 23:53阅读:336来源:国知局
基于图形学的大场景快速求交方法与流程

本发明属于三维求交技术领域,具体涉及一种基于图形学的大场景快速求交方法。



背景技术:

现有的求交技术多为基于空间分割树求交技术,主要分为计算包围盒、按照包围盒求交、对于与包围盒相交的节点与节点内的模型求交三个步骤。

首先计算场景中各级节点的包围盒,包围盒是一个能够恰好容纳所属节点中的全部模型的方盒。接下来根据各级节点的包围盒与射线进行求交。由于包围盒能够完全容纳节点中的所有模型,所以如果射线与包围盒不相交,则射线一定不会和包围盒中的模型的任意部分相交。此步骤主要是为了提高求交速度。经过上面两步将得到所有与射线相交的叶节点。这些节点不再有子节点,故如果场景中的某个模型与射线相交,则它一定在这些叶节点中。依次对每个与包围盒相交节点中的模型中的所有三角面进行求交,将会得到与射线相交的所有三角面列表。通过空间几何的方法计算射线与这些面的交点即为射线与场景的交点。

最后,如果最终没有得到任何交点,则说明射线与场景不相交。如果最终只得到一个交点,则射线与场景交于该点。如果得到一组交点,则可以通过比较每个交点与相机的位置关系找出距离相机沿相机观察方向最近的一点,该点即为射线与场景的交点。

由上述内容可知,已有的场景求交大多数基于空间分割树,且要求几何数据必须有完整的结构、极大地占用内存,尤其是浏览器自身有内存使用限制的情况、算法效率和场景数据量紧密相关、随着场景数据量不断加大、渲染速度和场景加载效率大幅度下降等问题。



技术实现要素:

有鉴于此,本发明的目的在于克服现有技术的不足,提供一种基于图形学的大场景快速求交方法,以解决现有技术中的求交方法极大地占用内存、渲染速度以及场景加载效率低的问题。

为实现以上目的,本发明采用如下技术方案:一种基于图形学的大场景快速求交方法,包括:

对场景进行预渲染,获取场景深度;

将所述场景深度输出至片段着色器,获取第一深度值;

将所述第一深度值无损打包为像素值并将所述像素值输出至帧缓冲区;

通过webgl读取所述帧缓冲区的颜色值;

解包所述颜色值获取第二深度值;

根据第二深度值和屏幕空间向量计算屏幕坐标对应的场景三维坐标。

进一步的,所述对场景进行预渲染,获取场景深度,包括:

计算顶点着色器的视坐标及投影坐标获取所述视坐标z值。

进一步的,所述将所述第一深度值打包为像素值并将所述像素值输出至帧缓冲区,包括:

通过所述片段着色器将所述z值打包为颜色向量;

计算所述颜色向量的rgb分量;

将所述rgb分量保存至帧缓冲区。

进一步的,所述通过webgl读取所述帧缓冲区的颜色值,包括:

通过html5canvaswebglrenderingcontext对象的readpixels方法获取所述帧缓冲区的颜色值。

进一步的,所述解包所述颜色值获取第二深度值,包括:

解包所述颜色值通过所述rgb分量获取第二深度值,

进一步的,所述根据第二深度值和屏幕空间向量计算屏幕坐标对应的场景三维坐标,包括:

获取视口矩阵、投影矩阵、视矩阵以及屏幕坐标;

根据视口矩阵、投影矩阵、视矩阵以及屏幕坐标计算所述屏幕坐标到空间向量的变换矩阵;

根据所述述屏幕坐标到空间向量的变换矩阵计算所述屏幕坐标对应场景中的方向向量;

根据所述第二深度值和所述方向向量计算所述屏幕坐标对应的场景三维坐标。

进一步的,在对所述对场景进行预渲染,获取场景深度,之前还包括:

对帧缓冲区进行清理。

进一步的,还包括:

对所述顶点着色器的视坐标z值进行视矩阵变换;

对视矩阵变换后的所述顶点着色器的视坐标z值取相反数,以使得z坐标为正数。

进一步的,所述对帧缓冲区进行清理,包括:

判断所述帧缓冲区是否写入像素;

如果有像素被写入帧缓冲区,那么其对应的深度纹理值大于0.0;

如果深度纹理值为0.0,则判定未有像素被写入帧缓冲区。

进一步的,打包后的第一深度值的精度范围为0.01~65536.0。

本发明采用以上技术方案,能够达到的有益效果包括:

(1)本发明基于web场景渲染来实现的深度计算,使得求交的速度与渲染速度相当。在算法测试场景中,原始的渲染帧值在80fps左右,利用空间分割树求交后帧值在4~5fps左右,而利用本算法进行实时求交帧值可达70fps;

(2)本发明基于场景预渲染实现,而且利用的还是原始的帧缓冲区,因此几乎不需要消耗额外的内存;

(3)本发明与场景复杂度无关,渲染速度快,效率提高至少10倍以上;

(4)本发明渲染精度高、显示效果好。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明基于图形学的大场景快速求交方法的方法步骤示意图;

图2为本发明基于图形学的大场景快速求交方法的另一个步骤示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将对本发明的技术方案进行详细的描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所得到的所有其它实施方式,都属于本发明所保护的范围。

下面结合附图介绍本申请实施例中提供的一个具体的基于图形学的大场景快速求交方法。

本发明提供一种基于图形学的大场景快速求交方法,包括:

s101、对场景进行预渲染,获取场景深度;

s102、将所述场景深度输出至片段着色器,获取第一深度值;

s103、将所述第一深度值打包为像素值并将所述像素值输出至帧缓冲区;

s104、通过webgl读取所述帧缓冲区的颜色值;

s105、解包所述颜色值获取第二深度值;

s106、根据第二深度值和屏幕空间向量计算屏幕坐标对应的场景三维坐标。

本申请提供的基于图形学的大场景快速求交方法的工作原理是,先预渲染整个场景,获取场景深度,将场景深度输出至片段着色器,以获取第一深度值,将输出的第一深度值高精度打包为像素值并将像素值输出至帧缓冲区,通过webgl读取所述帧缓冲区的颜色值,解包所述颜色值获取第二深度值,根据第二深度值和屏幕空间向量计算屏幕坐标对应的场景三维坐标,其中场景三维坐标即为交点。

优选的,所述对场景进行预渲染,获取场景深度,包括:

计算顶点着色器的视坐标及投影坐标获取所述视坐标z值。

具体的,在webgl经典的顶点着色器中会先计算出顶点的视坐标,再计算出顶点的投影坐标并输出,计算所得的视坐标z值进行保存并输出至片段着色器以供后续的步骤使用。

优选的,所述将所述第一深度值无损打包为像素值并将所述像素值输出至帧缓冲区,包括:

通过所述片段着色器将所述z值打包为颜色向量;

计算所述颜色向量的rgb分量;

将所述rgb分量保存至帧缓冲区。

具体的,得到顶点着色器传来的顶点视坐标z值后,在片段着色器将z值进行高精度高准确度打包为颜色向量,将打包后的颜色向量输出,计算颜色向量rgb分量,将所述rgb分量保存至帧缓冲区中。

将最终输出的颜色向量记为vdepth,顶点着色器传来的视矩阵深度值为fdepth,假设vdepth的rgb分量分别保存深度值除以256.0的商、深度值除以256.0的余数和深度值的小数部分。得到:

vdepth.b=fract(-fdepth)(1)

通过上述公式得到rgb分量。

需要说明的是,由于webgl只支持帧缓冲区的读取,因此将深度输出为颜色必须写入帧缓冲区而不能是自定义渲染目标,因此,直接写入像素值至屏幕。又因为屏幕不应该展示深度纹理,因此将此渲染过程放至预渲染阶段,在预渲染结束后可以清理渲染目标以进行正常场景的渲染,这样就不会在最终的屏幕上输出深度图像。

其中,本申请中打包后的第一深度值的精度范围为0.01~65536.0。

传统的浮点打包为按位进行直接保存压缩,这种做法对硬件的依赖较大,这主要是因为要求显卡储存浮点数据和cpu储存浮点数据的格式完全一致,尽管现在的设备中很少出现问题,但是一旦某个设备使用了不同的浮点数据格式将产生不可预料的错误。而本申请中采用了对深度值直接拆分方法,将第一深度值拆分为rgb分量,此方式虽然缩小了浮点保存的范围,只能保存精度为大约0.01~65536.0的深度值,但却使程序具有良好的可移植性,且保存的浮点范围在绝大多数三维渲染程序中已足够使用,因为深度值是基于相机的,而远、近裁切面通常均不会超过这个范围。

需要说明的是,此渲染过程只渲染主场景,而天空盒、特殊对象,例如标注、皮筋则不应参与该渲染过程,因为它们的深度值是不可预料的。

优选的,所述通过webgl读取所述帧缓冲区的颜色值,包括:

通过html5canvaswebglrenderingcontext对象的readpixels方法获取所述帧缓冲区的颜色值。其中,颜色值即为片段着色器里打包的深度值。

优选的,所述解包所述颜色值获取第二深度值,包括:

解包所述颜色值通过所述rgb分量计算第二深度值。

具体的,令第一深度值为vpixel,第二深度值为fdepth,此时vpixel=[r,g,b,a]。于是第二深度值的计算公式为

一些实施例中,所述根据第二深度值和屏幕空间向量计算屏幕坐标对应的场景三维坐标,包括:

s201、获取视口矩阵、投影矩阵、视矩阵以及屏幕坐标;

s202、根据视口矩阵、投影矩阵、视矩阵以及屏幕坐标计算所述屏幕坐标到空间向量的变换矩阵;

s203、根据所述述屏幕坐标到空间向量的变换矩阵计算所述屏幕坐标对应场景中的方向向量;

s204、根据所述第二深度值和所述方向向量计算所述屏幕坐标对应的场景三维坐标。

具体的,令mviewport为视口矩阵,mproj为投影矩阵,mview为视矩阵,屏幕坐标为[x,y],屏幕坐标到空间向量变换矩阵为mat,变换后的向量为vec,则:

mat=mat4.invert(mviewport×mproj×mview)(5)

计算出屏幕坐标对应场景中的向量

vec=[x,y,1.0]×mat-[x,y,0.0]×mat(6)

有了深度值和方向向量后就很容易计算出屏幕坐标对应的场景三维坐标

vpos=veye+fdepth×vec(7)

其中veye为相机在场景中的位置。

优选的,在对所述对场景进行预渲染,获取场景深度,之前还包括:

对帧缓冲区进行清理。

所述对帧缓冲区进行清理,包括:

判断所述帧缓冲区是否写入像素;

如果有像素被写入帧缓冲区,那么其对应的深度纹理值大于0.0;

如果深度纹理值为0.0,则判定未有像素被写入帧缓冲区。

具体的,在渲染过程之前则必须进行一次帧缓冲区清理,清理的值取0x00000000。由于相机近裁切面通常大于0.0,也就意味着如果一个像素被写入了帧缓冲区,那么它对应的深度纹理值必定大于0.0。这样,如果在之后的读取深度纹理结果为0.0,则可判定此像素未对应场景中的任何一个点。

优选的,本申请提供的基于图形学的大场景快速求交方法,还包括:

对所述顶点着色器进行视矩阵变换后得到视坐标;

对视矩阵变换后的所述顶点着色器的视坐标z值取相反数,以使得z坐标为正数。这是因为webgl中摄像机前面的顶点经过视矩阵变换后z坐标为负数,故对其进行取相反数处理。

本申请提供的基于图形学的大场景快速求交方法获取到的场景坐标可应用于于webgl拾取、高程计算、碰撞检测等三维仿真领域。

举例说明,本申请可应用于皮筋工具;

皮筋工具是本技术最直接的应用;在三维城市规划行业软件中,通常需要距离测量、面积计算等辅助工具,即皮筋工具。用户建立皮筋是一个实时交互的过程,从创建操作开始后用户通过鼠标或触摸在屏幕上移动,此时皮筋应随之实时移动,且应实时地计算皮筋的长度等并将计算结果反馈至用户界面。

使用本申请提供的技术方案后,用户的鼠标或触摸位置会快速计算为场景坐标,交互式输出皮筋参数就变得处理简单、结果准确、精度高。

本申请可应用于高程计算工具,例如:高成计算工具的算法调整、算法优化;

三维仿真领域,以第一人称漫游浏览整个城市场景时,相机应贴地面行走,随着地形的起伏而起伏,要求实时地计算相机当前所在竖直直线对应场景的高度,本申请提供的基于图形学的大场景快速求交方法快速求交算法即可满足高程实时计算,用户身临其境,漫步整个城市各个角落,体验更加真实。

本申请技术方案应用于高程计算工具的算法调整时;

在场景快速求交方法中,预渲染所使用的相机位置、方向信息与场景主相机完全相同,而在使用高程计算工具,预渲染的相机位置保持不变,方向竖直向下,并使用正交投影,得到正对着地形的一张深度纹理,换算后即为相机附近的高程。具体应用如下:

本申请技术方案应用于高程计算工具的算法优化时;

在渲染一张高程纹理时,相机处于纹理的正中央位置,并在之后的很多帧都可能不会走出所渲染的高程范围,故不必要重复渲染。一旦发现相机走出上次渲染的高程范围,只需要再渲染一张深度纹理即可,这样使高程计算几乎不影响主场景的渲染效率,从而获得更高的交互速度。

本申请还可应用于碰撞检测工具,例如:碰撞检测工具的算法调整、算法优化。

当前,随着3s等新一代技术发展,三维仿真城市规划领域,模拟用户漫游整个城市、某栋建筑内部、地下停车场、城市地下管网、管廊等,用户对体验真实度要求越来越高,因此漫游浏览过程中需实时计算行走轨迹,必须时刻进行碰撞检测,避免脱离现实、出现穿墙而过等一系列虚假现象带来的不真实感。本发明很好的用于碰撞检测工具,具体应用如下:

本申请技术方案应用于碰撞检测工具的算法调整时;

类比高程计算工具,将预渲染相机从主相机出发向四周渲染,得到相机周围的“深度”纹理,即:水平方向的距离。一旦相机与某个方向的距离小于边距参数,则推断出相机已不能继续沿该方向移动,即:检测出相机与场景发生碰撞。

本申请技术方案应用于碰撞检测工具的算法优化时;

碰撞工具不需要实时渲染,将渲染一次的深度结果予以保存。若相机移动到深度纹理的盲区,再重新渲染一次深度纹理即可,且不需要在一帧内将四个方向全部渲染,事实上,相机在一帧只有一个移动方向,沿着移动方向的优先渲染,其它方向的在接下来的几帧内完成渲染即可,这样几乎不会出现大幅度降低主场景渲染效率的情况。

综上所述,本发明提供一种基于图形学的大场景快速求交方法,达到的有益效果包括:

(1)本发明基于web场景渲染来实现的深度计算,使得求交的速度与渲染速度相当。在算法测试场景中,原始的渲染帧值在80fps左右,利用空间分割树求交后帧值在4~5fps左右,而利用本算法进行实时求交帧值可达70fps;

(2)本发明基于场景预渲染实现,而且利用的还是原始的帧缓冲区,因此几乎不需要消耗额外的内存;

(3)本发明与场景复杂度无关,渲染速度快,效率提高至少10倍以上;

(4)本发明渲染精度高、显示效果好。

可以理解的是,上述提供的方法实施例与上述的基于图形学的大场景快速求交方法实施例对应,相应的具体内容可以相互参考,在此不再赘述。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的方法。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令基于图形学的大场景快速求交方法的制造品,该指令基于图形学的大场景快速求交方法实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

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