一种基于八叉树的大规模复杂三维场景处理方法

文档序号:6459326阅读:339来源:国知局

专利名称::一种基于八叉树的大规模复杂三维场景处理方法
技术领域
:本发明涉及计算机图形学和虚拟现实技术,主要是一种基于八叉树的大规模复杂三维场景处理方法。技术背景大规模场景的实时渲染在虚拟现实、地理信息系统、飞行模拟、城市规划和三维游戏等领域中具有非常广泛的应用,一直是人们的研究热点。尽管图形处理器的性能相比过去有了飞速的发展,但还是不能满足大规模复杂场景实时渲染的需求。因此,必须设计出高效算法来进一步提高复杂场景的渲染速度。与真实感渲染不同,在不影响视觉效果的前提下,虚拟现实中的图形技术可以适当损失图形的渲染质量以提高渲染的速度。目前用来加速大规模复杂场景渲染速度,提高计算机实时渲染能力的主要技术有场景的组织与优化、渲染状态优化、层次细节技术(LOD)、基于图像的绘制以及可见性剔除等等。其中场景的组织与优化和可见性剔除具有至关重要的作用。场景的组织与优化是大规模场景渲染中非常重要的部分。场景如何组织,对诸如碰撞检测、可见性剔除和实时阴影等的计算具有巨大的影响。大规模场景中存在大量的物体,不能简单的对这些物体进行记录,而必须要采用结构化的场景管理器对这些物体进行组织管理。一般情况下将场景中的物体分为静态物体和动态物体。对动态物体来说,一般采用简单的列表方式进行管理。而对于静态物体,由于它们的空间状态是不变的,因此可以用层次化的技术来加以组织,并将其存储为文件进行保存,以方便下一次的读取。可见性剔除也是大规模场景渲染中非常重要的部分。它包括三部分视域剔除、遮挡剔除和背面剔除。其中视域剔除非常关键,可以剔除视野外的大量物体,极大地减少送入图形渲染通道的图元,从而较大地提高渲染速度。本发明针对当前图形渲染引擎存在的问题,提出了一种高效的渲染算法。该方法主要通过对整个虚拟场景的场景图进行树状组织和优化管理,然后利用三维场景的包围盒和场景剖分技术完成快速的视域剔除,从而达到优化管理整个复杂场景的目的,大大提高了实时渲染的速率。
发明内容本发明的目的在于克服现有图形渲染引擎实时渲染大规模复杂三维场景存在的不足,提供一种基于八叉树的大规模复杂三维场景处理方法,用八叉树对场景进行树状组织和优化管理,在此基础上利用三维场景的包围盒完成快速的视域剔除,从而达到优化管理整个复杂场景的目的,大大提高了渲染的速率,并达到了实时性要求。本发明的技术解决方案基于八叉树的大规模复杂三维场景处理方法,主要采用八叉树结构来组织场景,利用其空间信息和树形组织结构,批量的削减视锥体外的几何节点,快速计算出需要渲染的节点序列,减少送入渲染通道的三角面数量,从而有效地提高了渲染速度。本方法步骤如下(1)载入大规模三维场景,用场景图来组织场景中的所有元素;(2)建立并生成该场景的八叉树结构,记录相关的信息;(3)利用八叉树结构,通过视锥体与包围盒的相交检测算法进行快速的视域剔除;(4)对于处于视锥体内的物体进行渲染。上述的步骤(2)建立并生成场景的八叉树结构的具体步骤是A)设置八叉树参数,如树的层次数限制,每个叶子空间能包含的最大节点数等;B)遍历所有几何节点,计算根节点的包围盒大小;C)递归划分包围盒,记录所有子节点和叶子节点,生成场景的八叉树结构;首先将根节点的AABB盒均匀的划分成八个部分;然后根据相交检测算法,将父节点下的所有几何节点分别归类至这八个空间中;最后进行递归调用,对所有子节点进行划分。上述的步骤(3)利用八叉树结构,通过视锥体与包围盒的相交检测算法进行快速的视域剔除的步骤是A)由根节点开始向下寻找包含整个视锥体的最小八叉树节点,找到后在mPreviousStartNode变量中记录该节点,若没找到则记录根节点,则该节点将作为下一次判断时的起始节点;B)然后遍历该节点下的所有叶子节点,若完全处于视锥体内则标记显示所有几何节点,若叶子节点仅与视锥体相交则进行OBB相交检测,判断是否显示相关几何节点,以后的判断就从记录的节点开始,向下寻找新的起始节点,如果由于移动原因导致该节点已不能包含整个视锥体时,则向上查询最小的一个包含视锥体的节点作为新的起始节点。本发明与现有技术相比,具有如下显而易见的突出实质性特点和显著优点(1)用场景图组织场景,使场景易于组织和扩展,提高场景的渲染速度;(2)用八叉树结构对场景进行空间划分,然后利用八叉树进行快速的视域剔除,大量减少送入图形渲染通道的图元,较大地提高渲染速度;(3)利用八叉树结构可以较大地提高碰撞检测的速度。(4)可以将八叉树与遮挡剔除和光线跟踪等技术结合起来,提高算法的效率。(5)该方法不仅适用于大规模室内场景,也适用于大规模室外场景。图1是AABB包围盒模型示意图。图2是将场景进行空间划分,用八叉树来组织场景的流程图。图3是0BB包围盒模型结构图。图4是利用八叉树进行快速视域剔除的流程图。图5是基于八叉树的大规模复杂三维场景处理算法的框图。具体实施方式本发明的一个优选实施例结合如下本基于八叉树的大规模复杂三维场景处理方法共分四步第一步载入大规模三维场景,用场景图来组织场景中的所有元素。对于图形渲染引擎,如何组织场景中的元素是至关重要的问题。好的场景组织方式不仅利于内存的管理,而且能够加速场景的渲染。本发明采用场景图来组织场景,这种场景组织方式不仅有利于内存的管理,减少内存开销,而且能够加速场景渲染,同时还利于实时交互的实现。第二步建立并生成该场景的八叉树结构,记录相关的信息。1、建立基本的数据结构A)AABB包围盒的实现AABB结构是平行于坐标轴的包围物体的最小长方体,如图1所示。与其他包围体相比,AABB结构比较简单,内存消耗少,更新快,相互之间的求交也快捷。我们用AABB包围盒来描述八叉树的空间节点。AABB包围盒的数据结构如下所示AABBTVector3max;TVector3min;max代表了最大值点,包围盒前右上顶点的世界坐标,min代表了最小值点,包围盒后左下顶点的世界坐标。通过这两个坐标能够计算出所有需要的数学参数。所有面的参数PlaneABCD(法向量(0,-l,0);点(A.x赘A,y,A.z))PlaneFBCG(法向量(0,0,1);点(G.x赁G.y,G.z))PlaneGCDH(法向量(1,0,0);点(G.X,G.y,G.z))PlaneEADH(法向量(0,0,-1);点(A.A.y,A.z))PlaneEABF(法向量(-1,0,0);点(A.x赁A.y,A.z))PlaneEFGH(法向量(0,1,0);点(G.X,G.y,G.z))B)定义八叉树结构八叉树结构主要记录的是整个树结构的信息,比如树的层次深度,节点数目等,通过这些信息我们可以唯一确定一个树结构,主要数据结构如下所示ClassTOctreePaxtitionNodestd::wstringmOctreeFilename;unsignedintmNumObjectsPerCell;unsignedintmNumLevels;unsignedintmNumOctreeNodes;unsignedintmNumOctreeLeafs;TVector3mLookDirection;structTOctreeNodeD印th;T0ctreeNode氺mRootNode;T0ctreeNode氺mPreviousStartNode;boolmDisabled;TNodeListmSceneNodeList:std::list〈TOctreeNodeD印th〉mOctreeNodeDepthList;〃成员函数mOctreeFilename是一个字符数组,记录的是整个八叉树节点的名字,用于程序运行时的识别和区分。mNumObjectsPerCell记录每个八叉树叶子节点中最多能容纳的几何节点的数量,这个参数可以在八叉树构建后由用户进行设置。mNumLevels记录八叉树能够划分的最深层次,当八叉树进行递归划分时,递归次数等于该数时递归运算将不再继续运行。mNumOctreeNodes记录划分后整个八叉树中所有子节点的数量,但不包括叶子节点的数量。mNumOctreeLeafs记录整个八叉树中所有叶子节点的数量。mLookDirection记录了视锥体的可视方向,该向量被用于计算节点深度信息等{曰息。TOctreeNodeD印th为记录节点深度构建的结构体,这里的深度指的是几何节点到视点的远近距离,而不是子节点在树结构上的层次深度。niRootNode是一个八叉树指针,记录整个八叉树的根节点指针。mPreviousStartNode同样是一个八叉树的指针,记录的是其中一个子节点,该子节点是下次视域剔除时的起始节点。mDisabled是一个布尔值变量,它相当于一个开关,控制是否进行八叉树模式的视域剔除,可以由用户设置。mSceneNodeList是一个临时列表,用于存放需要显示的所有几何节点的指针,然后将由一个函数将其作为返回值返回给显示主程序。mOctreeNodeDepthList是一个由深度结构体组成的列表,主要记录每个八叉树节点的深度信息。2、建立场景的八叉树结构。八叉树数据结构的建立,主要工作是把场景图结构按空间位置信息划分成八叉树结构,并计算好所有八叉树空间节点的包围盒信息。如图2所示。A)设置八叉树参数,比如树的层次数限制,每个叶子空间能包含的最大节点数等B)遍历所有几何节点,计算根节点的包围盒大小。C)递归划分包围盒,记录所有子节点和叶子节点,生成场景的八叉树结构。首先将根节点的AABB盒均匀的划分成八个部分;然后根据相交检测算法,将父节点下的所有几何节点分别归类至这八个空间中;最后进行递归调用,对所有子节点进行划分。第三步利用八叉树结构,通过视锥体与包围盒的相交检测算法进行快速的视域剔除。视域剔除的主要工作是通过已经存在的八叉树结构计算出位于视锥体之内的所有几何节点,仅将这部分节点送入渲染管道执行最后的渲染流程,以此来提高整个引擎的渲染速度。1、OBB包围盒的实现OBB是一个最贴近物体的长方体,只不过该长方体可以根据物体的一阶矩任意旋转。OBB比传统的包围球和AABB更加逼近物体,能显著减少包围体的个数。同时,OBB包围盒测试所得的结果更精确,最终要渲染的物体会更少。因此,我们用OBB包围盒来表示几何节点。一个给定对象的OBB被定义为包含该对象且相对于坐标轴方向任意的最小的正六面体。计算OBB的关键是寻找最佳方向,并确定在该方向上包围盒的最小尺寸。在文中OBB包围盒的数据结构如下OBBTVector3mCenter;TVector3mAxes[3];intmExtent[3];OBB包围盒的空间结构如图3所示mCenter代表OBB的中心坐标,mAxes代表三个向量,mExtent代表了三个向量上的长度(正负方向都有)。根据数据结构中的这些数值可以计算出OBB几何结构中的所有数学参数。所有顶点坐标可以通过如下运算获得<formula>formulaseeoriginaldocumentpage9</formula>所有面的参数如下:PlaneABCD(法向量一"1;点A)PlaneFBCG(法向量巧o;点G)PlaneGCDH(法向量点G)PlaneEADH(法向量点A)PlaneEABF(法向量H2;点A)PlaneEFGH(法向量点G)其中,Pc代表中心点坐标,巧分别代表三个方向向量,k代表向量长度。2、利用八叉树结构,实现快速的视域剔除。本发明利用八叉树来进行视域剔除,极大地减少视锥体和OBB包围盒的相交检测,从而加速了视域剔除的速度,提高了算法的性能。其流程如图4所示。具体步骤为A)由根节点开始向下寻找包含整个视锥体的最小八叉树节点,找到后在mPreviousStartNode变量中记录该节点,如没找到则记录根节点,该节点将作为下一次判断时的起始节点。B)然后遍历该节点下的所有叶子节点,如完全处于视锥体内则标记显示所有几何节点,如叶子节点仅与视锥体相交则进行OBB相交检测,判断是否显示相关几何节点,以后的判断就从记录的节点开始,向下寻找新的起始节点,如果由于移动等原因导致该节点已不能包含整个视锥体时,则向上査询最小的一个包含视锥体的节点作为新的起始节点。第四步对于处于视锥体内的物体进行渲染。在经过视域剔除之后,就可以将处于视锥体里的物体送入图形处理器的渲染通道进行渲染。实验结果我们在WindowsXPSP2系统下,对本发明的算法进行了测试。测试平台的配置如表l。表1测试平台<table>tableseeoriginaldocumentpage10</column></row><table>我们分别对不同渲染场景(几何节点数量不同)下的画面帧数进行测试,评估渲染效率的改良情况,测试结果如表2所示。表2不同情况下渲染速度的比较<table>tableseeoriginaldocumentpage10</column></row><table>从表2中可以看出,随着场景中节点数量的增加,帧数提高的效率就越为明显,这是因为,八叉树的生成算法会使原有的节点数量增加(增加了空间节点的数量),所以对于节点数量较少的场景来说,线性检测和八叉树检测的差别并不明显,而场景中节点一旦增加,如第三行所示场景中节点数增加到1000个以上后,帧数有50%以上的提高。这就说明,本文提出的这个场景管理算法对于大规模复杂场景有非常好的优化效果,能够大大提高原有的渲染帧数,从而达到实时渲染的目的。权利要求1.一种基于八叉树的大规模复杂三维场景管理方法,其特征在于其步骤如下a.载入大规模三维场景,用场景图来组织场景中的所有元素;b.建立并生成该场景的八叉树结构,记录相关的信息;c.利用八叉树结构,通过视锥体与包围盒的相交检测算法进行快速的视域剔除;d.对于处于视锥体内的物体进行渲染。2.根据权利要求1所述的基于八叉树的大规模复杂三维场景处理方法,其特征在于所述的步骤(2)建立并生成场景的八叉树结构的具体步骤是A)设置八叉树参数,如树的层次数限制,每个叶子空间能包含的最大节点数等;B)遍历所有几何节点,计算根节点的包围盒大小;C)递归划分包围盒,记录所有子节点和叶子节点,生成场景的八叉树结构;首先将根节点的AABB盒均匀的划分成八个部分;然后根据相交检测算法,将父节点下的所有几何节点分别归类至这八个空间中;最后进行递归调用,对所有子节点进行划分。3.根据权利要求1所述的基于八叉树的大规模复杂三维场景管理方法,其特征在于所述的步骤(3)利用八叉树结构,通过视锥体与包围盒的相交检测算法进行快速的视域剔除的步骤是A)由根节点开始向下寻找包含整个视锥体的最小八叉树节点,找到后在mPreviousStartNode变量中记录该节点,若没找到则记录根节点,则该节点将作为下一次判断时的起始节点;B)然后遍历该节点下的所有叶子节点,若完全处于视锥体内则标记显示所有几何节点,若叶子节点仅与视锥体相交则进行OBB相交检测,判断是否显示相关几何节点,以后的判断就从记录的节点开始,向下寻找新的起始节点,如果由于移动原因导致该节点已不能包含整个视锥体时,则向上查询最小的一个包含视锥体的节点作为新的起始节点。全文摘要本发明涉及一种基于八叉树的大规模复杂三维场景处理方法,属于计算机图形学和虚拟现实领域,其步骤为(1)载入大规模三维场景,用场景图来组织场景中的所有元素;(2)建立并生成该场景的八叉树结构,记录相关的信息;(3)利用八叉树结构,通过视锥体与包围盒的相交检测算法进行快速的视域剔除;(4)对于处于视锥体内的物体进行渲染。本发明考虑了当前图形渲染引擎实时渲染大规模复杂三维场景存在的不足,用八叉树结构来组织场景,利用其空间信息和树形结构,批量的削减视锥体外的几何节点,快速计算出需要渲染的节点序列,减少送入渲染通道的三角面数量,从而有效地提高渲染速度,达到实时性的要求。文档编号G06T9/40GK101281654SQ200810037739公开日2008年10月8日申请日期2008年5月20日优先权日2008年5月20日发明者万旺根,余小清,周俊玮,林继承申请人:上海大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1