基于点线面的三维空间几何虚拟模型细节层次裁剪方法与流程

文档序号:16985054发布日期:2019-03-02 00:33阅读:392来源:国知局
基于点线面的三维空间几何虚拟模型细节层次裁剪方法与流程

本发明属于三维空间建模技术领域,更具体地,涉及一种基于点线面的三维空间几何虚拟模型细节层次裁剪方法。



背景技术:

三维空间模型渲染,并不是按照实体本身从内到外在机器上进行一模一样的设计,一般来说我们都是设计出物体的同形线框,在其表面进行纹理、材质和贴图的附着,不管是颜色、光照还是花纹图案都是通过这种方式在模型上展现。纹理、材质和贴图其实本质上与图片并无本质区别,但是它们是专门针对三维模型而设计的,其中像素可以投影到屏幕空间中的像素,使得就像把图像贴上去一样具有真实感。

从三维建模技术诞生的那一刻开始,如何更快绘制和渲染的问题便随之而来。从底层硬件的中央处理器(centralprocessingunit,cpu)与图形处理器(graphicsprocessingunit,gpu)的高效计算,到中层图形程序的图形绘制算法,再到顶层应用软件的多样渲染技术,都有极大的性能优化空间,能够适应于不同计算机配置,适应于不同的绘制算法,以及适应于不同的场景渲染。

除了上述计算机图形层面的纵向优化因素外,项目研发时间轴的横向优化也是重要的因素之一。性能优化不能在三维空间几何虚拟模型建模及动画效果完成之后再进行,因为这样会导致大量的工作积压在优化程序上,另一方面就是无法精确定位导致模型资源运行效率低下的位置,这样排查起来就会消耗太多的时间。必须提出跟进项目每一步的小型优化方案,以及能够进行最后场景综合处理的大型优化方案。

目前,常用的三维空间几何虚拟模型裁剪算法有边收缩细节层次算法,二次误差度量算法,cpu+gpu协作裁剪算法等。

边收缩细节层次算法使用顶点权重来表示顶点的重要程度,顶点权重按照对模型外观影响由大到小的程度进行排序,将裁剪控制在一个影响较小的范围内;顶点的权重存储在一个有序数组中,数组顺序既是裁剪顶点顺序,优点在于算法易于实现,执行速度快。边收缩细节层次算法的局限性在于,只考虑了顶点这一个因素,模型整体是由点线面构成,只考虑顶点来进行裁剪只能较好的保留模型的边缘特征,对于模型整体的可观性受到较大影响。

二次误差度量算法是基于边收缩细节层次算法的改进,在顶点合并的过程中考虑了误差评价,该评价主要基于边界约束和面法向量的机制,利用误差矩阵来存储误差值,优点在于考虑的模型属性诸多方面,能达到较好的运行效果。二次误差度量算法的局限性在于,计算误差矩阵消耗的时间非常大,要进行多次高维的矩阵相乘,矩阵取反等高时间复杂度的操作,对于模型渲染的时间较长。

cpu+gpu协作裁剪算法是cpu与gpu共同协作完成的,调整cpu与gpu的数据处理量来达到负载平衡,可以使得两者效用发挥到最大。实现cpu+gpu的异构并行,需要协调两者时钟周期,计算能力,存储能力,线程管理等。优点是拥有集群级并行支持以及统一计算设备架构(cuda,computeunifieddevicearchitecture)提供节点级的并行支持,系统整体计算性能得到极大的提高,同时又能保证运行的效果良好。cpu+gpu协作裁剪算法的局限性在于,需要对cpu和gpu架构进行编写,算法逻辑非常复杂,不易于实现;同时由于该算法涉及底层硬件计算,往往收到平台硬件类型的影响,不具有广泛支持性。



技术实现要素:

上述方法都没能很好的协调三维空间模型渲染中速度、效果、跨平台和易实现的问题。为了克服上述现有技术的不足,本发明提供了基于点线面的三维空间几何虚拟模型细节层次裁剪方法,该方法基于三维空间中几何模型的固有点线面性质来进行裁剪,不需要进行中间的转换,结合改进之后的细节层次裁剪方法,成功应用于三维空间几何虚拟模型的细节层次裁剪问题。

细节层次算法描述了在物体远离摄像机的时候,可以使用分辨率较低的模型,即复杂度比原型要低,但是由于距离较远,差别就显得细微而不可见了。如何在不影响视觉效果情况下降低三维模型复杂度一直是细节层次算法的重点。由于模型得到了简化,在一定程度上会提高模型的渲染速度,降低渲染的顶点数和三角形数。

本发明基于点线面的三维空间几何虚拟模型细节层次裁剪方法,具体方法如下:

(1)网格属性拆分并建立有序索引列表

通过分离原始网格顶点属性、顶点中法线属性、格面贴图属性、格面颜色属性以及三角形,获取不同材质所对应的三角形数组,将各个三角形数组合并成不同的子网格数组。为了在后面的双顶点查找能够快速有效的进行,需要建立一个有序的索引列表,有序顶点索引列表最终以xyz由小到大顺序进行排列。有序顶点索引列表最终以顶点的三维坐标值,按照x,y,z坐标的优先级顺序,从小到大进行排列;例如a(2,5,7)和b(2,8,4)则a的坐标值小于b,因为a.y<b.y。

(2)查找位置共享属性顶点以及纹理共享属性顶点

该系统简化顶点主要依据就是:去除相似顶点,保留独立顶点或者重要顶点,如果能存在多个子网格中的共同顶点,说明该顶点具有多种材质共享,属于重要顶点,要把它们找出来,通过遍历三角形数组每个顶点,找出子网格共存顶点;通过将需要查找的顶点坐标传入有序索引列表进行遍历,找出相同的顶点索引。这里的子网格共存顶点和有序列表中的共同索引就是位置共享属性顶点和纹理共享属性顶点。

(3)建立关联三角形数组和相邻三角形数组

每个顶点都有许多三角形共享,获取这些三角形对后面的算法起到关键作用,三角形数组值就是顶点的索引,把相同的索引合并即可。

由于每一个三角形的三个角都有许多个相邻三角形,上一方法只是将每个顶点与有关三角形下标对应起来,但并没有根据顶点提取具体的三角形数组,本方法是对上一方法的补充,针对每一顶点,通过比较x,y,z坐标值,当两个三角形的某一顶点坐标值相等时说明两者为相邻三角形;所以可以通过获取该顶点具有所有相同值的三角形数组来得到所有的相邻三角形,在后面计算顶点角度和以及贴图的拉伸时候就需要用到相邻三角形。

拆分当前三角形的三个顶点,获取第一顶点所关联的三角形组,将该组添加进空的相邻三角形数组,然后将该组添加进已遍历三角形组,对该组相邻三角形组设置唯一组号,获取第二和第三顶点所关联的三角形组,如果该三角形数组已经遍历,则丢弃当前获取的三角形,如果没有,则添加进相邻三角形数组,将该组添加进已遍历三角形组,对该组相邻三角形组设置唯一组号。

(4)计算顶点角度和权重

网格中每个顶点其实都被许多相邻三角形共享着,这些共享顶点角度的和决定了该顶点位于网格中独特的位置。如果和为0度,则属于简化顶点;如果和为180度,该顶点处于网格边上;如果和为360度,则该顶点处于网格内部。邻边的创建使用两个顶点的向量差。利用前面相邻三角形,把所有角度求和即可得总度数,可以通过以下公式来计算权重:

vertex_weight=sub_vertex_weight+1

side_weight+=vertex_weight*area

side_weight+=angle*side_length

side_weight+=total_angle*area

side_weight+=(new–old)*total_angle*area

其中vertex_weight表示该坐标值权重,sub_vertex_weight表示子顶点权重,side_weight表示边权重,area表示该边对应三角形面积,angle表示该边上顶点的角度,side_length表示该边长度,total_angle表示该边对应三角形角度和,new和old表示边折叠前后的三角形变化(指三角形三个点坐标值的变化,引起三角形角度和和面积以及其他如贴图的变化)。

(5)计算三角形中心距权重

顶点中心距是指该顶点与网格边界框的中心的距离,通常我们用它来判定网格表面是否产生了偏移,三角形中心距等于三个顶点到中心的距离,为了方便比较边折叠前后的中心距差值,不会由于某一被折叠顶点导致的比较为空的现象,本系统采取以计算顶点相关三角形的平均中心距来代替顶点本身的中心距值,可以通过以下公式来计算权重:

weight1=(new–old)*normal

weight2=(new–old)*total_center_distance

side_weight+=weight1*weight2

其中weight1表示法线权重,normal表示三角形法线值,weight2表示中心距权重,total_center_distance表示中心距值,其他同名参数含义与之前所述相同。

(6)基于贴图与面积变化计算权重

在网格中拆分出的贴图数组下标就是顶点的索引,当我们简化网格的时候,会不可避免的造成贴图的变形,但是要把变形降到最低,获取三角形的三个顶点,读取uv数组获取三个顶点的贴图坐标,求三角形面积以及贴图面积,循环检测三个顶点两两合并时,三角形面积的变化和贴图面积的变化,记录下前后的各个面积值,可以通过以下公式来计算权重:

side_weight+=weight+(new–old)*area

side_weight+=weight+(new–old)*uv_area

其中weight表示折叠边原有权重,uv_area表示贴图面积,其他同名参数含义与之前所述相同。

(7)裁剪重要性选取

首先是边折叠处理,边折叠是在一个三角形中选取重要程度最低的边进行折叠,会造成两个顶点的合并,为了简化计算,最终会合并到其中的一个顶点,而不是重新计算新的顶点的坐标。按照三角形三条边以及正向反向来定义,一共有六种折叠方法,也就是∠1→∠2(第一个角折叠向第二个角)、∠2→∠1、∠1→∠3、∠3→∠1、∠2→∠3、∠3→∠2。

完成边折叠之后,要重新创建新的网格,同时创建新网格所有属性数据,创建新的顶点数组以及顶点属性中法线、贴图和颜色等数据,并将新顶点记录下来,如果循环遍历判断每个顶点是否被折叠,将折叠完成后的顶点数组添加到新网格的顶点数组,将折叠完成后的贴图坐标添加到新网格的贴图坐标,将折叠完成后的顶点颜色数组添加到新网格的顶点颜色数组,记录下添加进新网格的顶点。

按照旧网格中三角形与顶点关系,将其对应到新网格中,三维空间几何模型网格三角形承载着顶点与顶点之间的联系,如果不创建三角形,则模型贴图纹理等元素就无法正常的附加在顶点之上,会造成网格的混乱,将旧三角形数组的每个三角形提取出来,并更改其对应的子网格下标,判断三个顶点是否都已经添加进新的网格(边折叠),如果为真,则将该三角形添加进新三角形数组,同时设置新组号并将该组号添加进新三角形组号列表,将子网格最后部分进行填充,形成一个完整的子网格数组。

将折叠后面积为0的三角形进行移除,简化网格复杂度,同时将其对应的网格下标也进行移除,记录下移除的三角形,将其对应的顶点、贴图坐标、顶点颜色数据一并移除,更新新三角形数组所对应的顶点索引。

在裁剪较高的层次时,摄像机离模型本身已经非常远了,对网格细微之处的变化无法察觉,但是在网格中面积较小部分往往占有很大的比例,移除对渲染三角形数量将会降低许多。移除过多往往会影响视觉效果,所以没有和移除空三角形方法进行合并,在简化之前需要单独设置该值的参数,根据传入值,计算出高层次权重,对新三角形数组进行遍历,对取出的每个三角形求面积,三角形组总面积,三角形数量,根据传入值,确定移除的最大面积,对新三角形数组进行遍历,移除小于最大面积的所有三角形,移除该三角形所对应的子网格下标。

创建新网格:将前面所生成的新数据统一进行网格绘制,新顶点数组覆盖模型顶点数组,新法线数组覆盖模型法线数组,新顶点颜色数组覆盖模型顶点颜色数组新子网格下标数组覆盖模型子网格下标数组。

本发明针对三维空间几何虚拟模型渲染特点,基于点线面三个不同层次解决了三维空间几何虚拟模型渲染问题。与传统的几何模型渲染优化方法相比,该发明所提出的方法达到了易实现性和高效性的统一,所有计算仅仅是对模型本身的距离、面积以及长度的基本属性进行简单计算,便能达到逼真的效果,所裁剪出来的简化几何模型更逼近原始模型的外观。本发明方法基于三维空间几何最基本的点线面属性进行权重计算,计算简单,易于实现且执行效率高,同时与原始模型外观相似程度接近,裁剪比例大且不损失造型,同时该方法不涉及底层硬件计算,可以进行跨平台使用而无需修改。

附图说明

图1为本发明基于点线面的三维空间几何虚拟模型细节层次裁剪方法流程图;

图2为本发明的三维空间几何虚拟模型原型;

图3为本发明的三维空间几何虚拟模型网格原型;

图4为本发明的三维空间几何虚拟模型纹理共享标记示例;

图5为本发明的三维空间几何虚拟模型位置共享标记示例;

图6为本发明的三维空间几何虚拟模型第一层裁剪效果图;

图7为本发明的三维空间几何虚拟模型第二层裁剪效果图;

图8为本发明的三维空间几何虚拟模型第三层裁剪效果图;

图9为本发明的三维空间几何虚拟模型第四层裁剪效果图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

本发明基于点线面的三维空间几何虚拟模型细节层次裁剪方法,该方法流程图如图1所示,其具体实现步骤如下:

第一步:将几何模型的原始网格顶点属性、顶点中法线属性、格面贴图属性、格面颜色属性和原始三角形集合分离出来;对提取出来的顶点集合建立一个排序数组,同时建立有序索引列表;

第二步:通过第一步中的三角形集合,查找模型原始网格中的具有纹理共享属性顶点,并进行标记;通过第二步中的有序索引列表,查找模型原始网格中的具有位置共享属性顶点,并进行标记;

第三步:通过第二步中的含有标记的三角形集合,根据原始顶点坐标,建立模型网格关联三角形数组;通过前面的关联三角形数组,根据共享顶点或边,建立模型网格相邻三角形数组;

第四步:通过第三步中相邻三角形数组,根据(4)中计算公式,计算每个顶点的角度和并且计算权重;

第五步:通过第三步中相邻三角形数组,根据(5)中计算公式,计算每个三角形的中心距并且计算权重;

第六步:通过判断折叠前后的贴图及三角形面积变化,根据(6)中计算公式,计算相关边权重;

第七步:将以上所有权重以向量形式进行相加,若完成整个模型计算则循环结束,否则跳转到第四步;结束循环后,通过权值高低进行区域重要性比较,对重要性高的区域进行保留,非重要或者不重要的区域进行裁剪,完成对整个复杂模型的简化操作。

下面结合附图和实施例对本发明做进一步说明。

为了使裁剪方法效果具有代表性,选取的三维空间几何虚拟模型顶点数在万级以上,同时具有多个子网格,原始模型如图2所示。

第一步:通过原始模型的网格化操作,如图3所示,可以将几何模型的原始网格顶点属性,顶点中法线属性、格面贴图属性、格面颜色属性和原始三角形集合提取并分离出来;

第二步:通过第一步中的三角形集合,查找模型原始网格中的具有纹理共享属性顶点,如图4所示,并进行标记;通过第二步中的有序索引列表,查找模型原始网格中的具有位置共享属性顶点,如图5所示,并进行标记;

第三步:通过第二步中的含有标记的三角形集合,根据原始顶点坐标,建立模型网格关联三角形数组;通过前面的关联三角形数组,根据共享顶点或边,建立模型网格相邻三角形数组;

第四步:通过第三步中相邻三角形数组,计算每个顶点的角度和并且计算权重。由于该模型具有24222个顶点,19712个三角形,6个子网格,vertex_weight,angle和total_angle为具有24222长度的数列;sub_vertex_weight具有6个长度的数列;side_weight和area为与之相匹配的三角形个数长度的数列:

vertex_weight[24222]=sub_vertex_weight[6]+1

side_weight[19712*3]+=vertex_weight[24222]*area[19712]

side_weight[19712*3]+=angle[24222]*side_length[19712*3]

side_weight[19712*3]+=total_angle[24222]*area[19712]

side_weight[19712*3]+=(new–old)*total_angle[24222]*area[19712]

第五步:通过第三步中相邻三角形数组,计算每个三角形的中心距并且计算权重,normal和total_center_distance都是与三角形总数相关:

weight1=(new–old)*normal[19712]

weight2=(new–old)*total_center_distance[19712]

side_weight[19712*3]+=weight1*weight2

第六步:判断折叠前后的贴图及三角形面积变化,计算相关边权重,uv_area也是与三角形总数相关:

side_weight[19712*3]+=weight+(new–old)*area[19712]

side_weight[19712*3]+=weight+(new–old)*uv_area[19712]

第七步:将以上所有权重以向量形式进行相加,若完成整个模型计算则循环结束,否则跳转到第四步;结束循环后,通过权值高低进行区域重要性比较,对重要性高的区域进行保留,非重要或者不重要的区域进行裁剪。

通过观察模型的距离,可以把模型简化程度划分为4个层次,即存在4个观测模型的距离,随着距离越来越远,渲染模型的复杂度相应的降低,一般来说4个层次是一个比较合适的值,最后得到效果如图6~9所示,完成对整个复杂模型的简化操作。

本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

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