一种基于三角面片个数划分的三维金字塔构建方法与流程

文档序号:26913077发布日期:2021-10-09 15:32阅读:269来源:国知局
一种基于三角面片个数划分的三维金字塔构建方法与流程

1.本发明涉及三维模型索引创建技术领域,具体涉及一种基于三角面片个数划分的三维金字塔构建方法。


背景技术:

2.三维gis已经成为当今乃至未来gis技术的主要标志性内容之一,它突破了空间信息在二维地图平面中单调表现的束缚,为各行各业以及人们的日常生活提供了更有效的辅助决策支持。随着“数字孪生”概念深入人心,在智慧城市、智慧园区、智慧工厂等行业应用中,对城市级大场景三维模型展示的需求越来越强烈。
3.海量二维 gis 数据以及瓦片式地形景观数据的高效组织管理技术已经相对成熟,而高效、一体化地组织与管理复杂的海量的大场景的三维空间模型数据一直是研究的前沿难点问题,也是三维gis从局部范围示范应用到城市级综合应用面临的主要技术挑战。由于模型数据量大、三维空间对象几何形状各异、空间分布稀疏不均,构建高效的三维空间索引成为难题。一方面,由于城市级大场景三维模型数据量巨大,很难通过化简算法,在不影响客户端展示效果的前提下,将数据量减少至可控范围;另一方面,由于三维空间对象空间分布稀疏不均,采用基于空间范围划分的方式构建的空间索引,在空间分布密集的区域会产生相对大的模型切片,影响网络传输和前端渲染效率。基于三角面片个数划分的三维金字塔构建方法,在构建模型层次树的过程中,依据模型三角面片个数以构件为单位进行划分,使得模型构件在树的各个节点中均匀分布,不会出现基于空间范围划分方式中的局部大切片现象;通过设置单瓦片最大三角面片个数,采用边距和距离加权相结合的边折叠算法对构件三角面片进行简化,限制单节点三角面片数量,满足客户端大场景三维模型展示的需求。
4.近年来,国内外学者在海量三维空间数据高效组织和管理领域做了大量研究,如中国专利文献cn200910063373.2发明提出顾及多细节层次的三维r树空间索引方法,采用可扩展多层次功能的三维r树索引结构,在节点分裂过程中,通过k

medoids算法,选择插入目标后,对从已选叶节点上溯根节点路径上各层节点的影响最小,如重叠体积,覆盖体积增长最小的节点作为插入节点,解决了r树索引空间重叠的问题,此方法本质上是基于空间范围的三维空间索引方法,不能解决模型构件空间分布不均匀对索引效率影响的问题;cn200910063371.3发明提出基于数据内容的三维空间数据自适应多级缓存系统,该系统的三维空间数据多级缓存采用缓存池的设计思想,通过基于数据内容的三维空间数据分类方法,将三维空间数据在缓存进行分类组织、分池管理;其中包括位于客户端的三维空间数据绘制缓存(一级缓存)、三维空间数据内存缓存(二级缓存)、三维空间数据文件缓存(三级缓存)、以及位于数据库服务器端的三维空间数据引擎服务缓存(四级缓存)。四级缓存分别由各自的缓存管理模块来控制,并通过多级缓存自适应管理模块统一管理客户端和数据库服务器端的多级缓存,自适应对各级缓存进行调整,提高了大规模三维空间数据动态调度的效率,此方法是对模型文件进行缓存,没有利用空间索引。
5.因此,有必要开发一种三维金字塔构建方法,能够保证空间索引效率不会受模型构件空间分布的影响,又能很好的生成层次细节模型,利用客户端渲染调度机制,满足大场景三维模型展示的需求。


技术实现要素:

6.本发明主要解决的问题是提供一种基于三角面片个数划分的三维金字塔构建方法,利用模型三角面片个数信息,以构件为单位,对模型层次树的节点进行分裂,可以保证相同层级的节点大小基本相等,不会出现局部大切片现象。
7.为了解决上述技术问题,本发明采用的技术方案是:该基于三角面片个数划分的三维金字塔构建方法,具体包括以下步骤:s1:分别设置单节点最大三角面片个数facecount参数和单构件最大三角面片个数meshfacecount参数;s2:读取三维模型的数据,解析三维模型的几何、纹理和属性信息;s3:设置二叉树的最大深度depth,并将步骤s2中读取的三维模型设置为二叉树的根节点;s4:确定节点分裂的坐标轴方向,对二叉树进行分裂,直至二叉树深度大于等于depth或者所有叶子节点的三角面片个数都小于facecount参数;s5:遍历二叉树,重新计算二叉树每个节点外包围盒boundingbox;对三维模型中相同纹理的构件进行合并,并构建构件集合;s6:遍历二叉树节点,计算当前节点三角面片化简参数,采用边折叠算法对节点进行三角面化简;s7:根据三角面片化简前后的数据,对化简后的三角面片纹理坐标进行重新计算;s8:输出模型金字塔数据。
8.采用上述技术方案,借助基于三角面片个数划分的三维金字塔构建方法构建模型三维空间索引,可以避免出现局部大瓦片现象,通过设置节点最大三角面片个数,动态调节节点三角面数量,减小网络数据传输延迟和客户端渲染的计算量。在海量三维模型展示场景下,由于计算机gpu性能有限,无法做到全域模型的精细化展示,可以根据采用场景计算机的gpu算力,动态调整节点三角面片个数,采用边折叠算法对模型进行三角面片化简,达到既充分利用gpu算力,又满足全域模型展示的需求的效果;通过设置二叉树的最大深度,结合单节点三角面片个数,达到自动调节树的深度的效果,如设置二叉树的最大深度为5,在二叉树深度达到5之前所有叶子节点满足节点三角面片个数小于设置的单节点最大三角面片个数,则在树深度达到5之前就会停止分裂,最终树的深度也不等于5;通过模型三角面片个数对二叉树进行分裂,不再依赖于空间范围,在模型空间密集度比较高的区域不会出现非常大的切片,保证模型构件在各个节点中均匀分布。
9.作为本发明的优选技术方案,所述步骤s1中设置单节点最大三角面片个数facecount参数作为二叉树单节点三角面片个数上限值;设置单个构件最大三角面片个数meshfacecount参数作为单个构件三角面片个数上限值;所述步骤s2中解析三维模型的纹理结构并保存纹理信息到构件的material字段,计算根节点的外包盒子boundingbox。
10.作为本发明的优选技术方案,所述步骤s4具体为:
s41:动态计算二叉树分裂方向,比较模型在在x轴、y轴、z轴方向的坐标范围,根据构件中心点坐标,取坐标范围差最大的坐标轴作为节点分裂的坐标轴方向;s42:将三维模型的构件根据构件中心点坐标沿步骤s41确定的坐标轴方向由小到大进行排序,遍历排序后三维模型构件,先将三维模型构件加入当前节点的left子树,当节点左子树构件三角面片个数之和大于当前节点总三角面片个数的一半时停止,将剩余的构件加入当到前节点的right子树;s43:根据步骤s1中设置的参数,以步骤s41中确定的节点分裂的坐标轴方向,对二叉树进行分裂,迭代执行步骤s41~42,直至二叉树深度大于等于depth或者所有叶子节点的三角面片个数都小于facecount参数。
11.作为本发明的优选技术方案,所述步骤s5具体为:遍历二叉树,重新计算二叉树每个节点外包围盒boundingbox,再根据纹理对构件进行合并,遍历二叉树节点,构建构件集合map<material,meshinfo>,其中material为纹理材质,meshinfo为构件集合,遍历集合map<material,meshinfo>,对相同的material对应的构件进行合并,若当前构件三角面片个数大于设定值meshfacecount参数,则停止当前合并,新建空的构件,进入下一轮合并。
12.作为本发明的优选技术方案,所述步骤s41中动态计算二叉树分裂方向的方法,获取当前二叉树节点在各个方向上的坐标范围差dim,具体计算方法为dim=max

min,其中max为坐标轴方向对应坐标的最大值,min为坐标轴方向对应坐标的最小值;若x轴方向对应的dim值最大,则当前节点按x轴方向进行分裂;若y轴方向对应的dim值最大,则当前节点按y轴方向进行分裂;若z轴方向对应的dim值最大,则当前节点按照z轴方向进行分裂。按照此种方法,在节点分裂的过程中动态调整分裂方向,保证节点在空间范围上相对均匀的分布。
13.作为本发明的优选技术方案,所述步骤s43二叉树节点的分裂方法具体为:获取当前节点的构件集合vector<mesh>,确定节点坐标轴分裂方向之后,将模型构件集合vector<mesh>根据mesh的中心点在分裂坐标轴方向的值由小到大进行排序;若分裂坐标轴方向为x轴,则根据构件中心点的x坐标进行排序,若分裂坐标轴方向为y轴,则根据构件中心点的y坐标进行排序,若分裂坐标轴为z轴,则根据构件中心点的z坐标进行排序;获取当前节点的三角面片个数totalfacecount,构建两颗空子树left和right分别对应当前节点的左右子树;遍历构件集合vector<mesh>,将构件加入left子树,若left子树三角面片个数大于totalfacecount / 2则停止,将剩余构件加入到right子树,迭代执行上述步骤,若二叉树深度大于等于设置的最大深度depth或者所有叶子节点的三角面片个数都小于facecount,则停止分裂。
14.作为本发明的优选技术方案,所述步骤s6具体为:s61:遍历二叉树节点,计算当前节点三角面片化简参数,计算公式为:;其中facecount为步骤s1中设置的二叉树单节点最大三角面片个数, totalfacecount为当前节点实际三角面片总个数;若decimationratio大于1,则跳过三角面片化简步骤;若decimationratio小于1,则根据参数decimationratio的值,采用二次误差边折叠算法对当前节点进行三角面片化简;s62:计算构件edge的塌陷权限priority,边距为length,edge塌陷点point到edge关联的三角面片的距离平均值为distance;更新构件所有edge的塌陷权限priority,根据
priority由小到大对edge进行排序,遍历edge集合,执行化简操作,直至化简前后三角面片个数比小于decimationratio。
15.作为本发明的优选技术方案,所述步骤s61中采用边距结合距离加权的边折叠算法对当前节点进行三角面片化简的具体步骤如下:s611: 统计所有参与折叠的边,此处为当前构件所有三角面片边的集合;s612:计算所有顶点v的度量误差priority(v)的,假设边e的顶点分别为、,则;s613:找到最小的边;s614:折叠该边,取边的中心点作为新的顶点,删除顶点、,删除边e,顶点、相关联的三角面片顶点更新至,更新顶点以及与相关联的边priority值;s615:重复步骤s613~s614,直至decimationratio大于1。
16.作为本发明的优选技术方案,所述步骤s612中的priority的计算方法为:priority=distance* length;其中edge的端点坐标为:p1,p2,则length的算法如下:dx=p1.x()

p2.x();dy=p1.y()

p2.y();dz=p1.z()

p2.z();length=sqrt(dx*dx+dy*dy+dz*dz);其中p1.x()和p2.x()分别表示点p1和p2的x坐标,p1.y()和p2.y()分别表示点p1和p2的y坐标,p1.z()和p2.z()分别表示点p1和p2的z坐标,sqrt为开方函数;triangles为edge关联的三角面片集合,则distance算法如下:;其中为折叠点 point 到 edge 关联的三角面片 i 的欧氏距离;n 为 triangles 集合的大小。
17.与现有技术相比,该基于三角面片个数划分的三维金字塔构建方法具有以下有点:不严格按照空间范围来分裂节点,通过计算模型坐标在各个坐标轴的最大差值动态确定节点分裂方向,既避免了在模型空间密集度高的区域出现难以处理的大切片,保证模型构件在各个节点中均匀分布,又保证了模型各个子节点在空间上相对均匀的分布;对相同纹理的模型构件进行合并,三角面片化简之后能更好的保留原始构件的特征;依据显卡性能,设置单节点最大三角面片个数参数,使用边塌陷算法对节点进行三角面片化简,可以做到精确控制单切片的三角面片数量,满足大场景三维模型展示的需求。
附图说明
18.图1为本发明基于三角面片个数划分的三维金字塔构建方法的流程图;图2为本发明基于三角面片个数划分的三维金字塔构建方法的原始模型;图3为本发明基于三角面片个数划分的三维金字塔构建方法的第1级金字塔模型;图4a和图4b为本发明基于三角面片个数划分的三维金字塔构建方法的第2级金字
塔模型;图5a、图5b、图5c和图5d为本发明基于三角面片个数划分的三维金字塔构建方法的第3级金字塔模型;图6a、图6b、图6c、图6d、图6e、图6f、图6g和图6h为本发明基于三角面片个数划分的三维金字塔构建方法的第4级金字塔模型;图7a、图7b、图7c、图7d、图7e、图7f、图7g、图7h、图7i、图7j、图7k、图7l、图7m、图7n、图7o和图7p为本发明基于三角面片个数划分的三维金字塔构建方法的第5级金字塔模型。
具体实施方式
19.下面将结合本发明的实施例图中的附图,对本发明实施例中的技术方案进行清楚、完整的描述。
20.实施例:如图1

2所示,该基于三角面片个数划分的三维金字塔构建方法,具体包括以下步骤:s1:分别设置单节点最大三角面片个数facecount参数和单构件最大三角面片个数meshfacecount参数;所述步骤s1中设置单节点最大三角面片个数facecount参数为256000,作为二叉树单节点三角面片个数上限值;在三角面片化简合并的过程中,会根据facecount参数调整化简后节点三角面的个数;设置单个构件最大三角面片个数meshfacecount参数为65536,作为单个构件三角面片个数上限值;构件合并时,meshfacecount保证合并之后的构件不会存在过多的三角面片;s2:使用tinygltf开源库读取三维模型的数据,解析三维模型的几何、纹理和属性信息;所述步骤s2中解析三维模型的纹理结构并保存纹理信息到构件的material字段,计算根节点的外包盒子boundingbox;解析后的模型信息通过vcglib库保存;s3:设置二叉树的最大深度depth为5,并将步骤s2中读取的三维模型设置为二叉树的根节点;s4:确定节点分裂的坐标轴方向,对二叉树进行分裂,直至二叉树深度大于等于depth或者所有叶子节点的三角面片个数都小于facecount参数;所述步骤s4具体为:s41:动态计算二叉树分裂方向,比较模型在在x轴、y轴、z轴方向的坐标范围,根据构件中心点坐标,取坐标范围差最大的坐标轴作为节点分裂的坐标轴方向;所述步骤s41中动态计算二叉树分裂方向的方法,获取当前二叉树节点在各个方向上的坐标范围差dim,具体计算方法为dim=max

min,其中max为坐标轴方向对应坐标的最大值,min为坐标轴方向对应坐标的最小值;若x轴方向对应的dim值最大,则当前节点按x轴方向进行分裂;若y轴方向对应的dim值最大,则当前节点按y轴方向进行分裂;若z轴方向对应的dim值最大,则当前节点按照z轴方向进行分裂;按照此种方法,在节点分裂的过程中动态调整分裂方向,保证节点在空间范围上相对均匀的分布;s42:将三维模型的构件根据构件中心点坐标沿步骤s41确定的坐标轴方向由小到大进行排序,遍历排序后三维模型构件,先将三维模型构件加入当前节点的left子树,当节
点左子树构件三角面片个数之和大于当前节点总三角面片个数的一半时停止,将剩余的构件加入当到前节点的right子树;s43:根据步骤s1中设置的参数,以步骤s41中确定的节点分裂的坐标轴方向,对二叉树进行分裂,迭代执行步骤s41~42,直至二叉树深度大于等于depth或者所有叶子节点的三角面片个数都小于facecount参数;所述步骤s43二叉树节点的分裂方法具体为:获取当前节点的构件集合vector<mesh>,确定节点坐标轴分裂方向之后,将模型构件集合vector<mesh>根据mesh的中心点在分裂坐标轴方向的值由小到大进行排序;若分裂坐标轴方向为x轴,则根据构件中心点的x坐标进行排序,若分裂坐标轴方向为y轴,则根据构件中心点的y坐标进行排序,若分裂坐标轴为z轴,则根据构件中心点的z坐标进行排序;获取当前节点的三角面片个数totalfacecount,构建两颗空子树left和right分别对应当前节点的左右子树;遍历构件集合vector<mesh>,将构件加入left子树,若left子树三角面片个数大于totalfacecount / 2则停止,将剩余构件加入到right子树,迭代执行上述步骤,若二叉树深度大于等于设置的最大深度depth或者所有叶子节点的三角面片个数都小于facecount,则停止分裂;s5:遍历二叉树,重新计算二叉树每个节点外包围盒boundingbox;对三维模型中相同纹理的构件进行合并,并构建构件集合;所述步骤s5具体为:遍历二叉树,重新计算二叉树每个节点外包围盒boundingbox,再根据纹理对构件进行合并,遍历二叉树节点,构建构件集合map<material,meshinfo>,其中material为纹理材质,meshinfo为构件集合,遍历集合map<material,meshinfo>,对相同的material对应的构件进行合并,若当前构件三角面片个数大于设定值meshfacecount参数,则停止当前合并,新建空的构件,进入下一轮合并;s6:遍历二叉树节点,计算当前节点三角面片化简参数,采用二次误差边折叠算法对节点进行三角面化简;此处使用vcglib开源库集成的三角面片化简算法对模型构件进行化简;所述步骤s6具体为:s61:遍历二叉树节点,计算当前节点三角面片化简参数,计算公式为:;其中facecount为步骤s1中设置的二叉树单节点最大三角面片个数, totalfacecount为当前节点实际三角面片总个数;若decimationratio大于1,则跳过三角面片化简步骤;若decimationratio小于1,则根据参数decimationratio的值,采用二次误差边折叠算法对当前节点进行三角面片化简;所述步骤s61中采用边距结合距离加权的边折叠算法对当前节点进行三角面片化简的具体步骤如下:s611: 统计所有参与折叠的边,此处为当前构件所有三角面片边的集合;s612:计算所有顶点v的度量误差priority(v)的,假设边e的顶点分别为、,则;其中priority的计算方法为:priority=distance* length;
其中edge的端点坐标为:p1,p2,则length的算法如下:dx=p1.x()

p2.x();dy=p1.y()

p2.y();dz=p1.z()

p2.z();length=sqrt(dx*dx+dy*dy+dz*dz);其中p1.x()和p2.x()分别表示点p1和p2的x坐标,p1.y()和p2.y()分别表示点p1和p2的y坐标,p1.z()和p2.z()分别表示点p1和p2的z坐标,sqrt为开方函数;triangles为edge关联的三角面片集合,则distance算法如下:;其中为折叠点 point 到 edge 关联的三角面片 i 的欧氏距离;n 为 triangles 集合的大小;s613:找到最小的边;s614:折叠该边,取边的中心点作为新的顶点,删除顶点、,删除边e,顶点、相关联的三角面片顶点更新至,更新顶点以及与相关联的边priority值;s615:重复步骤s613~s614,直至decimationratio大于1;s62:计算构件edge的塌陷权限priority,边距为length,edge塌陷点point到edge关联的三角面片的距离平均值为distance;更新构件所有edge的塌陷权限priority,根据priority由小到大对edge进行排序,遍历edge集合,执行化简操作,直至化简前后三角面片个数比小于decimationratio。
21.s7:根据三角面片化简前后的数据,对化简后的三角面片纹理坐标进行重新计算;s8:输出模型金字塔数据,即输出tileset.json和b3dm格式的金字塔数据,用于客户端渲染,化简后生成的第1级~第5级三维模型金字塔分别如图3(第1级)、图4a

图4b(第2级)、图5a

图5d(第3级)、图6a

图6h(第4级)到图7a

图7p(第5级)所示。
22.采用上述技术方案,借助基于三角面片个数划分的三维金字塔构建方法构建模型三维空间索引,可以避免出现局部大瓦片现象,通过设置节点最大三角面片个数,动态调节节点三角面数量,减小网络数据传输延迟和客户端渲染的计算量。在海量三维模型展示场景下,由于计算机gpu性能有限,无法做到全域模型的精细化展示,可以根据采用场景计算机的gpu算力,动态调整节点三角面片个数,采用边折叠算法对模型进行三角面片化简,达到既充分利用gpu算力,又满足全域模型展示的需求的效果;通过设置二叉树的最大深度,结合单节点三角面片个数,达到自动调节树的深度的效果,如设置二叉树的最大深度为5,在二叉树深度达到5之前所有叶子节点满足节点三角面片个数小于设置的单节点最大三角面片个数,则在树深度达到5之前就会停止分裂,最终树的深度也不等于5;通过模型三角面片个数对二叉树进行分裂,不再依赖于空间范围,在模型空间密集度比较高的区域不会出现非常大的切片,保证模型构件在各个节点中均匀分布。
23.以上所述仅为本发明的较佳实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1