掌桥专利:专业的专利平台
掌桥专利
首页

一种场景分割方法及装置

文献发布时间:2023-06-19 19:28:50


一种场景分割方法及装置

技术领域

本发明涉及三维数据可视化技术领域,尤其涉及一种场景分割方法及装置。

背景技术

大规模场景的渲染在虚拟实现以及游戏等领域中具有广泛的应用。在分割三维场景时,并不需要对场景中所有的物件进行渲染,只需要针对场景中可视的物件进行渲染或物理检测,此时便需要对空间进行分割并检测,以过滤掉不可见的分割区域。为了过滤掉不可见的分割区域,通常所采用的做法是先创建一个完整的数据结构,再将物件添加至数据结构中。然而这种方法往往计算量较大,占用资源多,且渲染速率较低。因此,如何提高场景的渲染效率成为当前所需解决的技术问题。

发明内容

鉴于上述问题,本申请的目的在于提供一种场景分割方法、装置及计算机可读存储介质,以降低八叉树的遍历次数,优化渲染效率,具体方案如下:

第一方面,本申请实施例提供了一种场景分割方法,所述场景分割方法包括:

创建八叉树的根节点;

在所述根节点下创建单链表;

当物件添加至场景中时,将所述物件添加至单链表尾节点;

判断所述尾节点上的物件数是否大于所述尾节点所能达到的最大物件数;

若所述尾节点上的物件数大于所述尾节点所能达到的最大物件数,则计算所述尾节点下所有物件的边界空间;

根据所述尾节点下所有物件的边界空间,对所述八叉树的结构进行重构。

可选的,所述重新计算所述节点下所有物件的边界空间包括:

计算在所述尾节点所对应的空间中,所述所有物件在各个方向上所能达到的最远位置;

根据所述最远位置,确定所述尾节点下所有物件的边界空间。

可选的,所述根据所述尾节点下所有物件的边界空间,对所述八叉树的结构进行重构包括:

对与所述尾节点对应的空间进行分割,得到分割后的空间信息和中心点坐标;

将所述分割后的空间信息和所述中心点坐标节点存入所述八叉树扩展的子节点中;

根据所述尾节点中物件的边界空间,将所述尾节点中的物件重新添加至所述八叉树扩展的子节点中。

可选的,所述对与所述尾节点对应的空间进行分割包括:

当所述物件的边界空间的高度小于当前空间高度的一半时,对空间进行四叉树分割;

当所述物件的边界空间的高度不小于当前空间高度的一半时,则对空间进行八叉树分割。

可选的,所述根据所述尾节点中物件的边界空间,将所述尾节点中的物件重新添加至所述八叉树扩展的子节点中,包括:

若所述尾节点中物件的边界空间包含在所述子节点的空间范围内,则将所述物件添加至所述子节点中。

可选的,所述场景分割方法还包括:

若所述物件的坐标位置不包含在所述八叉树的总空间中,则修改所述八叉树的空间信息,并对子节点的空间信息进行重新计算。

可选的,所述修改空间信息,包括:

当所述物件的坐标位置超出总空间的右半部分坐标位置时,对所述总空间的右半部分进行扩充,直至所述总空间的右半部分范围包含所述物件;

当所述物件的坐标位置超出总空间的左半部分坐标位置时,对所述总空间的左半部分进行扩充,直至所述总空间的左半部分范围包含所述物件。

可选的,所述场景分割方法还包括:

判断所述八叉树的层数是否大于6;

若所述八叉树的层数大于6,则不再新增子节点。

第二方面,本申请实施例提供了一种场景分割装置,所述场景分割装置包括:

创建单元,用于创建八叉树的根节点;在所述根节点下创建单链表;

添加单元,用于当物件添加至场景中时,将所述物件添加至单链表尾节点;

判断单元,用于判断所述尾节点上的物件数是否大于所述尾节点所能达到的最大物件数;若所述尾节点上的物件数大于所述尾节点所能达到的最大物件数,则重新计算所述尾节点下所有物件的边界空间;

重构单元,用于根据所述尾节点下所有物件的边界空间,对所述八叉树的结构进行重构。

第三方面,本申请实施例提供了一种计算机可读存储介质,包括计算机操作指令,当所述计算机操作指令在计算机上运行时,使得所述计算机执行上述任意一种场景分割方法。

相对于现有技术,本申请具有以下有益效果:

通过在进入场景时只创建八叉树的根节点,在有物件添加至场景中时,将物件添加至尾节点中,若尾节点中的物件数量到达最大物件数量,则重新计算尾节点下各个物件的边界空间,并根据各个物件的边界空间对八叉树进行重构,从而根据场景中存在的物件实时对八叉树进行更新,降低八叉树的创建开销,减少八叉树的遍历次数,提高渲染效率。

附图说明

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

图1为本申请实施例提供的一种场景分割方法的流程示意图;

图2为一种被八叉树分割后的立方体空间示意图;

图3为另一种被八叉树分割后的立方体空间示意图;

图4为八叉树结构示意图;

图5本申请实施例提供的一种场景分割装置的结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

如图1所示,本申请实施例提供了一种场景分割方法,该方法包括:

S101:创建八叉树的根节点。

在进入3D场景后,在3D场景中创建八叉树的根节点。

S102:在所述根节点下创建单链表。

在八叉树的根节点下创建objlist函数单链表。

S103:当物件添加至场景中时,将所述物件添加至单链表尾节点。

当有物件添加至3D场景中时,将该物件添加至单链表的尾节点上,并确定物件在当前空间中各个方向的最远位置。确定物件在各个方向的最远位置,具体可以为:如图2所示,将立方体的中心作为原点建立x-y-z坐标轴,将由方块4指向方块0的方向作为x轴的正半轴方向,将由方块4指向方块5的方向作为z轴的正半轴方向,将由方块2指向方块0的方向作为y轴的正半轴方向,根据物件在坐标轴上的坐标点确定物件在当前空间中各个方向的最远位置。

需要说明的是尾节点为单链表中的最后一个节点。

S104:判断所述尾节点上的物件数是否大于所述尾节点所能达到的最大物件数。

确定当前尾节点中的物件数量是否大于该尾节点所能包括的最大物件数量。

在一种可选的实施例中,当前尾节点所能包括的最大物件数量可以通过level*ObjMaxNum进行计算。其中,level为八叉树的当前层数,ObjMaxNum为该分割空间所能达到的最大物件数目。

在另一种可选的实施例中,当前尾节点所能包括的最大物件数量可以通过(8^level)*ObjMaxNum进行计算。其中,level为八叉树的当前层数,ObjMaxNum为该分割空间所能达到的最大物件数目。

需要说明的是,ObjMaxNum可以根据实际需求进行设定。

S105:若所述尾节点上的物件数大于所述尾节点所能达到的最大物件数,则计算所述尾节点下所有物件的边界空间。

在尾节点上的物件数大于尾节点所能达到的最大物件数时,计算当前尾节点中各个物件的边界空间。

当尾节点上的物件数超过当前所允许的最大物件数时,需要对八叉树进行扩展,以使八叉树能够继续添加物件。通过在物件数量超过当前尾节点所允许的最大物件数时,才对八叉树进行扩展,从而降低八叉树在进行渲染时所需遍历的次数,提高渲染效率。

S1051:所述计算所述节点下所有物件的边界空间包括:

计算在所述尾节点所对应的空间中,所述所有物件在各个方向上所能达到的最远位置;

根据所述最远位置,确定所述尾节点下所有物件的边界空间。

计算物件在上述x-y-z坐标轴中各个方向的最远位置,根据物件在各个方向的最远位置确定该物件的边界空间。

S106:根据所述尾节点下所有物件的边界空间,对所述八叉树的结构进行重构。

根据尾节点中各个物件的边界空间,对八叉树进行扩展,并将尾节点更新为当前单链表中的最后一个节点。

S1061:所述根据所述尾节点下所有物件的边界空间,对所述八叉树的结构进行重构包括:

对与所述尾节点对应的空间进行分割,得到分割后的空间信息和中心点坐标;

将所述分割后的空间信息和所述中心点坐标节点存入所述八叉树扩展的子节点中;

根据所述尾节点中物件的边界空间,将所述尾节点中的物件重新添加至所述八叉树扩展的子节点中。

对当前尾节点所对应的空间进行分割,确定分割后的空间信息和空间的中心点坐标,并将与子节点对应的空间信息和中心点坐标存入至子节点中,根据尾节点中物件的边界空间,将物件添加至尾节点中。其中,中心点坐标可以通过AABB(max,min)*0.5获得,AABB为立体空间,max为立体空间中x的最大值,y的最大值,z的最大值,min为立体空间中x的最小值,y的最小值,z的最小值。

S1062:所述对与所述尾节点对应的空间进行分割包括:

当所述物件的边界空间的高度小于当前空间高度的一半时,对空间进行四叉树分割;

当所述物件的边界空间的高度不小于当前空间高度的一半时,则对空间进行八叉树分割。

将物件的边界空间高度与尾节点所对应的空间高度进行比较,当物件在y轴上的最低点与最高点之间的差值小于当前空间高度的一半时,对当前空间进行四叉树分割,四叉树分割具体为对xoz平面进行分割。若物件在y轴上的最低点与最高点之间的差值不小于当前空间高度的一半,则进行八叉树分割,八叉树分割具体为对x、y、z三个空间方向进行分割。可参考图3所显示的内容对如何进行空间的分割进行理解。

S1063:所述根据所述尾节点中物件的边界空间,将所述尾节点中的物件重新添加至所述八叉树扩展的子节点中,包括:

若所述尾节点中物件的边界空间包含在所述子节点的空间范围内,则将所述物件添加至所述子节点中。

在对尾节点所对应的空间进行分割后,会得到多个子节点,根据物件的位置坐标,确定与该物件对应的子节点,并将该物件添加至该子节点中。其中,本申请实施例通过判断子节点所对应的空间区域是否包含物件的位置坐标,从而确定物件与该子节点是否对应。

需要说明的是,判断子节点所对应的空间区域是否包含物件的位置坐标具体为:判断position.x是否min.x,position.y是否>min.y,position.z是否>min.z,若上述条件同时满足,则子节点所对应的空间区域包含物件的位置坐标。其中,position.x、position.y、position.z分别为物件在x,y,z轴上的坐标,max.x、max.y、max.z分别为子节点所对应的空间区域在x,y,z轴上的最大坐标值,min.x、min.y、min.z分别为子节点所对应的空间区域在x,y,z轴上的最小坐标值。

在一种可选的实施例中,所述场景分割方法还包括:

若所述物件的坐标位置不包含在所述八叉树的总空间中,则修改所述八叉树的空间信息,并对子节点的空间信息进行重新计算。

当新加入场景中的物件的坐标位置大于八叉树的总空间坐标位置时,对根节点所对应的空间进行扩展,并对所有子节点中的空间信息进行重新计算,从而根据场景中添加的物件动态扩大八叉树所包含的空间范围大小。

在一种可选的实施例中,所述修改空间信息,包括:

当所述物件的坐标位置超出总空间的右半部分坐标位置时,对所述总空间的右半部分进行扩充,直至所述总空间的右半部分范围包含所述物件;

当所述物件的坐标位置超出总空间的左半部分坐标位置时,对所述总空间的左半部分进行扩充,直至所述总空间的左半部分范围包含所述物件。

在新添加物件的位置坐标超出八叉树的总空间的右半部分时,由于总空间的右半部分位于坐标系的正半轴,所以对总空间的右半部分进行扩充为,将总空间右半部分的坐标与需要扩充的数值进行相加,使新添加物件的位置坐标包含在总空间中,此时八叉树为长方体的八叉树空间结构。

在新添加物件的位置坐标超出八叉树的总空间的左半部分时,由于总空间的左半部分位于坐标系的负半轴,所以对总空间的左半部分进行扩充为,将总空间左半部分的坐标与需要扩充的数值进行相减,使新添加物件的位置坐标包含在总空间中,此时八叉树为长方体的八叉树空间结构。

需要说明的是,当新添加物件的位置坐标同时超过八叉树的总空间的左半部分和右半部分时,可以分别对八叉树总空间的右半部分和左半部分进行扩充。

在一种可选的实施例中,所述场景分割方法还包括:

判断所述八叉树的层数是否大于6;

若所述八叉树的层数大于6,则不再新增子节点。

在当前八叉树的层数小于等于6时,判断尾节点上的物件数是否大于尾节点所能达到的最大物件数,在尾节点上的物件数大于最大物件数时,对八叉树进行重构,新增子节点。在当前八叉树的层数大于6时,不再扩展新的子节点。

需要说明的是,在需要删除物件时,可以通过子节点向上反向寻找对应的父节点,并修改父节点的空间信息。

在一种可选的实施例中,八叉树可通过线性表的形式进行存储。

如图4所示,图4所对应的线性表为R^AB”0123...7CDEFGH。

通过在进入场景时只创建八叉树的根节点,在有物件添加至场景中时,将物件添加至尾节点中,若尾节点中的物件数量到达最大物件数量,则重新计算尾节点下各个物件的边界空间,并根据各个物件的边界空间对八叉树进行重构,从而根据场景中存在的物件实时对八叉树进行更新,降低八叉树所需遍历的次数,提高渲染效率。

如图5所示,在另一种实施例中,本申请提供了一种场景分割装置,所述场景分割装置包括:

创建单元,用于创建八叉树的根节点;在所述根节点下创建单链表;

添加单元,用于当物件添加至场景中时,将所述物件添加至单链表尾节点;

判断单元,用于判断所述尾节点上的物件数是否大于所述尾节点所能达到的最大物件数;若所述尾节点上的物件数大于所述尾节点所能达到的最大物件数,则重新计算所述尾节点下所有物件的边界空间;

重构单元,用于根据所述尾节点下所有物件的边界空间,对所述八叉树的结构进行重构。

在一种可选的实施例中,判断单元具体用于,计算在所述尾节点所对应的空间中,所述所有物件在各个方向上所能达到的最远位置;

根据所述最远位置,确定所述尾节点下所有物件的边界空间。

在一种可选的实施例中,重构单元具体用于,对与所述尾节点对应的空间进行分割,得到分割后的空间信息和中心点坐标;

将所述分割后的空间信息和所述中心点坐标节点存入所述八叉树扩展的子节点中;

根据所述尾节点中物件的边界空间,将所述尾节点中的物件重新添加至所述八叉树扩展的子节点中。

在一种可选的实施例中,重构单元具体用于,当所述物件的边界空间的高度小于当前空间高度的一半时,对空间进行四叉树分割;

当所述物件的边界空间的高度不小于当前空间高度的一半时,则对空间进行八叉树分割。

在一种可选的实施例中,重构单元具体用于,若所述尾节点中物件的边界空间包含在所述子节点的空间范围内,则将所述物件添加至所述子节点中。

在一种可选的实施例中,场景分割装置还包括:修改单元,用于若所述物件的坐标位置不包含在所述八叉树的总空间中,则修改所述八叉树的空间信息,并对子节点的空间信息进行重新计算。

在一种可选的实施例中,修改单元具体用于,当所述物件的坐标位置超出总空间的右半部分坐标位置时,对所述总空间的右半部分进行扩充,直至所述总空间的右半部分范围包含所述物件;

当所述物件的坐标位置超出总空间的左半部分坐标位置时,对所述总空间的左半部分进行扩充,直至所述总空间的左半部分范围包含所述物件。

在一种可选的实施例中,判断单元还用于判断所述八叉树的层数是否大于6;

若所述八叉树的层数大于6,则不再新增子节点。

通过在进入场景时只创建八叉树的根节点,在有物件添加至场景中时,将物件添加至尾节点中,若尾节点中的物件数量到达最大物件数量,则重新计算尾节点下各个物件的边界空间,并根据各个物件的边界空间对八叉树进行重构,从而根据场景中存在的物件实时对八叉树进行更新,降低八叉树遍历的次数,提高渲染效率。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在另一种实施例中,本申请提供了一种计算机可读存储介质,包括计算机操作指令,当所述计算机操作指令在计算机上运行时,使得所述计算机执行上述任意一种所述的场景分割方法。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

以上对本发明所提供的技术内容进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

相关技术
  • 一种需求场景化方法及需求场景化装置
  • 一种基于卷积神经网络的道路场景语义分割方法
  • 一种场景运动目标分割方法、系统、存储介质及设备
  • 一种面向道路场景的目标实例分割方法和装置
  • 一种基于语义分割的非结构化田间道路场景识别方法及装置
技术分类

06120115924335