一种对复杂叶片的快速简化和绘制方法

文档序号:6471617阅读:410来源:国知局

专利名称::一种对复杂叶片的快速简化和绘制方法
技术领域
:本发明属于计算机图形学与数字农林学相结合的交叉学科领域,涉及一种高效的复杂叶片简化和绘制算法。
背景技术
:植物场景的绘制是计算机图形学中一个重要的课题。许多涉及到户外场景的应用,如城市规划,园林设计等,都需要在已有场景中增加植物模型,并对它们进行渲染,以增强绘制结果的真实感。但植物通常具有繁多的几何细节,它们的加入将导致绘制速度下降而达不到实时的要求。因此在保证真实感的前提下如何提高绘制速度是一个关键问题。为了提高植物场景的绘制速度,人们陆续提出了各种算法。大部分算法采用纹理图像代替原复杂几何模型来加速绘制。典型代表为Rohlf和Helman1994年采用的广告牌方法(Billboard)。该方法通常在预处理中确定一系列采样视点,在每一个视点方向,对植物体进行绘制,并把绘制结果作为纹理图像保存下来。而在实时绘制时,根据当前视点信息,找到与其最邻近的采样视点,然后对这些采样视点相对应的纹理图像进行插值,插值得到的图像即作为当前视点的渲染结果图像。在所有植物绘制的加速算法中,基于图像的算法绘制速度最快,且绘制时间与植物场景的几何复杂度无关。但是这种方法需要消耗很大的内存来存储纹理图像,并且因为缺少植物的几何信息,绘制近距离植物时真实感和视差效果都较差。图2(a)和图2(b)显示了用此方法绘制森林时的结果图,其中图2(a)为绘制近距离树木的结果,图2(b)为绘制远处树木的结果。另外有人采用点代替三角形来描述在图像空间的投影面积小于一个像素的树叶。这种方法具有很高的绘制效率。但它只适用于远距离植物的绘制;并且它会平滑掉植物的一些尖锐特征,降低绘制结果的真实度;此外离散的点还会破坏植物的拓扑结构。图3(a)和图3(b)分别为Deussen在2002年采用的基于点的方法绘制草地和森林时结果图。最近几年,针对植物,提出了基于多边形的方法。多边形,特别是三角形模型一直是计算机图形学的主流模型,因此人们在面片简化方面研究很深入,提出了很多成熟的层次细节算法,如vertexdecimation,edgecollapse,vertexclustering等。但由于树木特殊的属性,这些算法通常可以用于树干的简化,对于树叶部分,则会产生错误的结果。为弥补这一缺陷,针对树叶,从2002年起,Remolar等人陆续提出了几种简化算法。其关键步骤称之为叶片合并(leafcoll即se),即用一个新的叶子代替原来的两片叶子(见图4)。通过迭代地进行叶片合并操作,就能不断减少用于表示树叶的多边形的数目,同时保持树冠外形,如图5所示,其中图5(a)为原始模型,图5(b)为使用leafcollapse简化后的模型。但现有的简化算法还存在很多缺陷。主要有三点(l)只能简化四边形或三角形形状的叶片,简化复杂叶片时会产生错误的结果,缺乏通用性;(2)简化效率很低,简化一棵普通成年树的树叶,往往需要几小时,甚至超过一天;(3)大部分算法因缺乏高效的细节层次模型提取方法,并且不支持硬件加速,导致树冠部分的绘制效率很低。
发明内容本发明欲解决的技术问题是如何快速简化具有各种形状的植物冠层器官,如叶、花、果实,建立植物冠层的多分辨率表示,以及绘制时如何高效地选择合适的分辨率表示代替冠层的原始模型,最终达到实时的目的,并保证绘制结果的真实感,为此本发明提供一种复杂叶片的快速简化和绘制方法。为达成所述目的,本发明以树叶为例,提供一种复杂叶片的快速简化和绘制方法,该方法可推广到花和果实的处理,它由预处理和实时绘制两个阶段组成,包括以下9个步骤,其中步骤Sl-S7在预处理阶段完成,步骤S8-S9在实时绘制阶段完成,具体包括如下步骤Sl:首先输入树模型,提取树叶信息;步骤S2:对叶簇内的每一片叶片进行判断,判断叶片是否为,如果是,则把叶片复杂的网格模型简化成四边形,完成叶片的第一个层次简化;如果不是复杂叶片,则执行步骤S3;步骤S3:通过迭代的叶片合并操作把叶簇内的四边形叶片逐渐简化成为一个四边形,该四边形称之为叶簇代表四边形,完成叶片的第二个层次简化;步骤S4:迭代地对树冠中的代表四边形叶片执行叶片合并操作,直到整个树冠用一个四边形表示,完成叶片的第三个层次简化,第三个层次采用距离限制法对简化过程进行加速;步骤S5:计算所有叶片的密度,并根据叶片密度调节处于树冠中不同位置的叶片的简化误差;步骤S6:采用数组结构把叶片的几何信息和简化信息分别保存到两个数组中;步骤S7:把保存了几何信息和简化信息的两个数组作为不同文件保存到硬盘中;步骤S8:把保存了叶片的几何信息和简化信息的文件从硬盘分别读入CPU和GPU内存,并设定相机信息和像素误差;步骤S9:根据当前视点信息和像素误差,通过对保存了简化信息的数组进行两次二次搜索,确定冠层合适的细节层次模型;对相应细节层次模型进行绘制,得到绘制图像。所述简化成四边形是采用改进的点对收縮算法把叶片复杂的网格模型简化成四边形。对每片叶片指定两个顶点为角点,角点在简化过程中几何位置保持不变,其中第一角点定义为距离其承接茎最远的顶点,第一角点是叶尖所对应的点;第二角点是与叶柄相连的点,通过第一角点根据叶片的对称性得到第二角点。所述采用距离限制法对简化进行加速时,首先由用户设定一个距离阈值Q,然后求取距离小于或等于阈值的叶对,为有效叶对,并把最优叶对的筛选限定在有效叶对中进行。在求取有效叶对时,采用叶片的中心点代替叶片,并对中心点采用改进的八叉树结构进行细分;该八叉树结构首先计算中心点的包围盒,然后对它不断地细分;每一次把盒子细分成八份,每次划分都在盒子最长的那条边进行,并且每次划分后,因划分而得到的两个盒子在对应边上增大Q/2;这样的细分不断进行,直到盒子里的中心点的数目小于或等于用户设定的阈值L,或者盒子有一条边的长度不再大于阈值Q。所述叶片A的密度A=A(A,p)定义为叶片A临域内叶片的数目,其中A代表一片叶片的编号,叶片A的临域定义为球心位于叶片A的中心,半径为P的球体;按照此定义求出原始模型中的原始叶片的密度后,再进行归一化操作,使得原始叶片的密度值属于[i,n],其中参数n由用户定义;而叶片合并操作中新生成的叶片的密度定义为参与合并的两片叶片的加权平均值,5其中权重由叶片的合并次数决定,叶片的合并次数记录着被它合并的原始叶片的数目。所述用数组结构存储叶片的简化信息,该数组结构支持GPU加速,它满足以下两个条件(1).组成树冠的任意的一个细节层次模型的各节点都是连续地存储在数组中,即不同的细节层次模型都构成数组中完整的一段;(2).—旦用户给定像素误差,只需对数组执行两次二次搜索就能确定冠层合适的细节层次模型。数组中每个节点被赋予三个值emin,e^和SN,其中e^是该节点的简化误差,emax是其父节点的简化误差,SN是该节点表示的叶片的序号;该数组由传统二叉树结构变换而来,在把二叉树转换成数组的过程中,以emax的降序排列为主要规则,以emin的降序排列为辅助规则;当新加入的节点不满足emin排序时,对不满足条件的节点进行分裂,使其一分为二,最终使数组同时满足emax和e^降序排序。两次二次搜索的条件分别是e^〈e和e^〉"其中e是当前允许的空间误差,并利用相邻帧之间的关联性来縮小搜索范围。本发明的有益效果本发明的方法有四处体现了特色和创新。一是采用两步简化法简化叶片,具有通用性,克服了传统方法只能简化四边形和三角形形状叶片的缺陷;二是通过距离限制縮小了最优叶对的搜索范围,提高了简化效率;三是采用适合CPU,GPU操作的线性数组结构代替传统的二叉树结构存储叶片简化信息,并在数组的基础上实现高效地提取当前视点对应的冠层部分的细节层次模型;四是通过密度因素调节位于不同位置的冠层器官的细节层次,构建树冠的多分辨率共存模型。从而能在保持简化结果的图像质量的前提下获得更大的几何数据压縮比率。通过测试,本方法确实能够有效简化常见的各种形状的叶片,具有较高的简化效率和绘制效率。即使是枝叶繁茂的大树,预处理也能在几秒内完成。而绘制时间通常为几十微秒。同时,它能极大地压縮几何数据,同时保持树冠的视觉效果不变,并能有效地克服走样现象。即使压縮率很高时,仍能保持这一性质。当视点连续变化时,树冠的各层次细节模型之间的过渡也是连续的,不存在突变现象。本发明适用于各类常见植物的冠层的快速绘制。可用于城市可视化,园林设计,飞行模拟,虚拟现实和电脑游戏等应用中,以及辅助农林学家可视化其研究对象。图1是本发明算法流程图图2(a)是传统的基于图像的算法绘制近距离树木的结果图;图2(b)是传统的基于图像的算法绘制远处树木的结果图;图3(a)是传统的基于点的算法绘制草地时的结果图;图3(b)是传统的基于点的算法绘制森林时的结果图;图4是传统的叶片合并操作(leafcollapse)示意图;图5(a)是原始树模型;图5(b)是采用传统的基于多边形的方法简化后的结果;图6是本发明采用的改进的八叉树结构;图7(a)是传统的二叉树结构;图7(b)是传统的由二叉树转换而来的数组;图7(C)是传统方法求细节层次模型的过程和结果;树转变为同时满足e^和emax排序的数组的分解步骤;图9是本发明简化复杂叶片的结果图;图10是本发明简化黑杨树的四个结果;图11(a)是本发明用于绘制时间比较实验的白杨树模型;图11(b)是本发明把冠层细节层次模型量化成内的实数的结果;图11(c)是本发明采用四种绘制方式绘制白杨树树冠的时间比较结果;图12(a)是本发明用于密度影响实验的枫树模型;图12(b)是本发明不使用密度调节时枫树的简化模型;图12(c)是本发明使用密度调节时枫树的简化模型,它与图12(b)采用相同的空间允许误差;图12(d)是本发明不使用密度调节时枫树的简化模型;图12(e)是本发明使用密度调节时枫树的简化模型,它与图12(d)的叶片数目相当;图13是采用本发明绘制处于不同位置的四棵山楂树的结果图;图14是本发明以步行方式漫游森林时的结果;图15是本发明以鸟瞰方式漫游森林时的结果。具体实施例方式下面结合附图详细说明本发明技术方案中所涉及的各个细节问题。—、方法概述(overviewofapproach)本发明以叶片的简化为例,花和果实的简化类似。本发明中叶片简化算法由预处理和实时绘制两个部分组成。在预处理阶段中,叶片简化依次在三个层次,即单片叶片、叶簇和整个树冠进行。在第一层次中,叶片的网格模型被简化成四边形。第二和第三层次则通过不断地筛选出两片四边形的叶子进行合并来减少冠层中叶片的数目。同时通过在第三层次中设定距离限制,预先排除因距离较远而不可能合并的叶对来提高简化效率。为了建立冠层的多边分辨率表示,每片叶片都赋予了一个密度值,表针它所在区域的叶片的疏密程度。该密度值用于调节对应的叶片的简化误差,使得密度越大时简化误差越小。最终树冠中位于不同位置的叶片也就因密度的不同而拥有不同的细节层次。在预处理最后阶段,所有简化过程的数据,包括几何数据和简化信息,都存入硬盘。其中简化信息(简化关系、简化误差等)被保存到一个适合CPU和GPU操作的线性数组结构中。在实时绘制阶段,则首先读入存放在硬盘中的简化数据,然后根据当前视点与树木之间的距离、相机的参数以及用户设定的像素误差,通过对数组结构进行两次简单的二次搜索,提取出冠层适合的细节层次模型进行绘制。本发明算法的核心在于复杂叶片的两步简化法、距离限制法、叶片密度相关的多分辨率模型构造法,以及基于数组结构的细节层次模型提取法。算法具体包括9个步骤,其中前7个步骤在预处理阶段完成,后2个步骤在实时绘制阶段完成。如图l给出了本发明整个算法的流程。1、首先输入树模型,提取树叶信息。2、判断叶片是否为复杂叶片,如果是,则把叶片复杂的网格模型简化成四边形。这7层次,对象是叶簇内的每一片叶片。3、通过迭代的叶片合并操作把叶簇内的四边形叶片逐渐简化成为一个四边形,该四边形称之为代表四边形。这是简化的第二个层次。4、迭代地对树冠中的代表四边形叶片执行叶片合并操作,直到整个树冠用一个四边形表示。这是简化的第三个层次。该层次采用了距离限制法对简化过程进行加速。5、计算所有叶片的密度,并根据密度调节位于冠层中不同位置的叶片的简化误差。6、把叶片的几何信息和简化信息分别保存到两个数组中。7、把保存了几何信息和简化信息的两个数组作为不同文件保存到硬盘中。8、实时绘制开始时,把保存了叶片的几何信息和简化信息的文件从硬盘分别读入CPU和GPU内存,并设定相机信息和像素误差。9、根据当前视点信息和像素误差,通过对保存了简化信息的数组进行两次二次搜索,确定冠层合适的细节层次模型,并对该细节层次模型进行绘制,得到绘制图像。二、复杂叶片的简化自然界中的叶片通常具有各式各样的形状,每片叶片可由一个网格(Mesh)模型表示。它们不能被现有叶片简化算法简化,因为现有算法只能简化四边形或者三角形形状的叶片。为简化具有任意形状的叶片,本发明算法采取了两个步骤。在第一步中把叶片复杂的网格模型简化成四边形;然后再在第二步中采用叶片合并操作对四边形形状的叶片进行简化。在第一步,也就是叶片从网格模型简化成四边形的过程中,采用的是改进的点对收縮算法(VertexPairContraction)。叶簇中的每一片叶片的网格模型中的顶点分为三类内点、边界点和角点。其中内点和边界点的定义和传统的网格简化算法一样,而角点的定义稍稍做了调整。为了能在简化过程中更好地保持叶片的外形,有两种顶点被定于为角点,它们在简化过程中保持不变。其中第一角点是叶尖所对应的点,它通常距离其承接茎最远。第二角点是与叶柄相连的点,虽然在植物几何模型数据中,叶柄通常是缺省的。第二角点可通过第一角点根据叶片的对称性得到。在定义好三种点之后,就可对每一对有边相连的顶点求取简化误差并进行排序,然后选取误差最小的一对顶点进行简化。此过程不断地进行,直到网格变成四边形。第二步采用传统的叶片合并操作依次在叶簇和树冠这两级层次做简化。在每一步简化中,首先根据代价函数求取当前层次中每对叶片的相似度程度,然后从中选出最相似的一对叶片,即代价最小的一对叶片进行叶片合并操作。操作完成后,被简化的两片叶片消失,而新生成的叶片代替它们进行下一步的简化。这样的简化是一个迭代过程。首先在叶簇内执行,不断地两两合并,直到叶簇内的所有的叶片合并成为一个四边形,该四边形称之为代表四边形。通过实例化信息(已知,植物建模中产生),把代表四边形进行位移、旋转、大小縮放等变换,可得到树冠中所有的各自代表着一个叶簇的四边形。为简单起见,仍称它们为代表四边形。在树冠层次的简化即是对这些代表四边形进行迭代的简化。和叶簇层次类似,直到树冠中的所有代表四边形由一个四边形表示,简化才结束。三、简化过程的加速8叶片的两步简化法中的第二步是迭代过程,无论是在叶簇层次,还是树冠层次,都需要不断地计算所有参与简化的叶对的代价值,然后从中筛选出代价最小的叶对进行叶片合并操作,非常耗时。据观察,当两片叶片相距很远时,它们几乎不会被选中而进行叶片合并操作或线合并操作。因此可以假设只有当两片叶片之间的距离小于一定数值时,这两片叶片才可能被简化。其中两片叶片之间的距离为它们的中心点之间的距离。通过这项假设,可以首先由用户设定一个距离阈值Q,然后求取距离小于或等于阈值的叶对,为有效叶对,并把最优叶对的筛选限定在有效叶对中进行,从而避免对那些因相距较远而不可能合并的叶对进行不必要的计算和筛选。为了得到树冠中满足距离条件的叶对,即有效叶对,一个直接的方法就是对树冠中所有叶对求距离,然后进行判断。如果叶对之间的距离小于或等于阈值Q,则该叶对满足距离条件;否则,不满足。但这样求取有效叶对的方法的复杂度为0(!12),其中n为树冠中叶片的数目。为了加速有效叶对的求取,可采用改进的八叉树结构。该结构有一个很大的优点,那就是在对一个节点求有效叶对时,不需要同时遍历其邻居节点。也就是说,只需单独求出该八叉树的每一个叶节点内的有效叶对,就能得到树冠中的所有的有效叶对。为了简化计算,每一片叶片由其中心点代替。改进的八叉树结构就是对叶片的中心点建立的。首先计算中心点的包围盒,然后对它不断地细分。每一次把盒子细分成八份,每次划分都在盒子最长的那条边进行,而不像传统的八叉树依次对X、Y、Z三根轴进行划分。并且每次划分后,因划分而得到的两个盒子都会在对应边上增大Q/2,如图6所示,其中图6左是划分前的盒子,图6右是划分一次后的两个盒子。这样的细分不断进行,直到盒子里的叶片的数目,即中心点的数目小于或等于用户设定的阈值L,或者盒子有一条边的长度不再大于阈值Q。根据八叉树结构可求出树冠中的有效叶对。这些有效叶对只需计算一次,它们是接下来所有叶片合并操作的候选叶对。每一次简化,需要在候选叶对中选出最优叶对,即代价最小的叶对参与叶片合并操作。筛选过程分两步进行。第一步,在八叉树的每个叶节点内找出代价最小的叶对,这些叶对称为准最优叶对;第二步,对准最优叶对进行比较,找出它们之中代价最小的叶对,即全局最优叶对。在执行完一次叶片合并操作后,新生成的叶片取缔参与合并的两片叶片。这时需找出有关的叶节点,即包含了其中一片或两片参与合并的叶片的叶节点,然后对它们的有效叶对记录进行相应的调整,并重新计算这些叶节点的准最优叶对。而其他的叶节点的有效叶对记录和准最优叶对都保持不变。因此每次简化只需更新一部分叶节点的记录,这也是利用八叉树结构分两步筛选最优叶对的一个最大的优点。值得一提的是,迭代的叶片合并操作需要在叶簇和树冠两个层次中进行。叶簇内的叶片数目通常很小,例如只有5片叶子,不需要加速。因此上述加速算法只在树冠层次使用。四、细节层次模型的提取叶片简化算法虽然能建立植物冠层的连续的细节层次模型,但在绘制阶段如何根据当前的视点信息快速确定植物冠层的满足误差条件的细节层次模型是实现植物场景实时漫游的一个关键问题。因为在绘制每一帧图像时,需要对位于视锥内的每棵植物确定其9细节层次模型。如果缺乏高效的细节层次模型提取算法,就会因为累计效果而成为瓶颈。植物冠层的细节层次模型提取算法的效率和用于存储叶片简化信息的数据结构息息相关。传统叶片简化算法在预处理结束之时采用数组结构存储叶片的几何数据,如顶点坐标、法向、纹理坐标等信息,并采用二叉树结构存储简化信息。其中每一次叶片合并操作中新生成的叶片保存为参与合并的两片叶片的父节点。此外,二叉树中的每个节点还保存了对应的简化误差e。实时绘制时,首先把几何数据读入GPU内存,把简化信息读入CPU内存。然后根据相机的信息以及相机与待绘制的针叶树之间的距离,把用户定义的像素误差l转换成空间误差e。接着根据空间误差e,对保存了简化信息的二叉树结构进行遍历,直到遇到简化误差小于e的节点,这些节点就构成树冠合适的细节层次模型。最后把这些节点对应的顶点索引送往GPU,借助OpenGL中的VBO(VertexBufferObjects)技术即可进行绘制。一旦视点改变,需要重新计算空间误差并重新遍历树状结构,以更新细节层次模型。通过这种递归的方式确定细节层次模型,效率很低,并且不支持硬件加速。为此,本算法对二叉树结构进行了调整,提出了一种适合GPU渲染管道的线性数据结构来保存叶片的简化信息。利用该线性数据结构,一旦给定视点信息,可以仅通过两次简单的二次搜索就能确定冠层合适的细节层次模型。1数组结构对于如何把二叉树结构变成数组结构,Dachsbacher等人提出了一种方法。在二叉树结构中,每个节点保存了一个值rmin,它记录着该节点被选中而送往GPU绘制的最小距离。对二叉树进行由上至下遍历时的判断条件是r>r^,其中r是当前相机与物体之间的距离。也就是说,如果节点的rmin小于或等于r,则该节点是细节层次模型的一部分,应送往GPU进行绘制;否则继续对其子节点进行判断。为把二叉树变成数组,Dachsbacher等人对二叉树中的每个节点赋予了两个值r^和r^,其中rmax是节点对应的父节点的r^值。如果节点是根节点,则它的r^值为无穷大。[rmin,rmax)就构成每个节点的有效范围(见图7(a))。这时,递归判断条件r〉r^可以转换成另一种非递归形式rG[rmin,rmax),即如果r落在一个节点对应的rmin和rmax范围内,则该节点是细节层次模型的一部分,需要进行绘制;否则不绘制。采用非递归形式的判断条件的最大的优点在于每次判断只需对一个节点进行,不需考虑该节点和其他节点的关系,各节点是相互独立的。在算法的具体实施过程中,Dachsbacher等人把二叉树中的节点按照r^值排序得到一个数组(见图7(b))。当用户给定一个r值,如图7(c)中,r=3.5,首先通过一次二次搜索剔除掉位于数组尾部的因r,值小于r而不可能构成当前的细节层次模型的一些节点,接着对剩余的节点一一进行条件判断rG最终满足条件的节点,如图7(c)中的节点c、e、f和g,就构成了适合当前视点的细节层次模型,这些节点通常离散地分布在数组中。为了使任何一个细节层次模型的各节点连续地存储在数组中,即不同的细节层次模型都构成数组中的完整的一段,只是每段的起始点和终点不同。本算法对Dachsbacher等人的方法进行了改进,使得最终由二叉树转变而来的数组不仅满足rmax排序,还满足rmin排序。这样就能更有效地利用GPU的资源。如果把一个节点的有效范围[rmin,rniax)分成不同段,例如[rmin,ri),[巧,ig...[1>r^),然后对每一段分别判断,判断结果不会因此改变。假如r值落入其中的某一段,那么r值同样满足条件rG[rmin,rmax);假如任何一段都不包含r值,则r也不会满足条件rG[rmin,rmax)。在构建同时满足rmax排序和rmin排序的数组中,正是利用了节点的这种属性,对只满足其中一种排序的节点进行分裂。虽然分裂会使一个节点变成两个,导致数组中节点数目的增加。针对叶片简化算法,在对二叉树遍历时,判断一个节点是否绘制在于它的简化误差e是否小于或等于空间误差e。因此,符号r,r^和r^可以转换成对应的e,emin和emax。数组中的每个节点被赋予三个值e^,e,和SN,其中e^是该节点的简化误差,emax是其父节点的简化误差,SN表示叶片的序号,通过这个值可以得到该叶片的顶点索引信息,即得到表示该叶片的多边形的顶点编号。在数组的构建过程中,在把二叉树转换成数组的过程中,emax的降序排序为主要的规则,而emin的降序排序为辅助规则。因此,当在数组中添加新节点时,数组仍能满足emax排序,但不一定满足e^排序。不满足辅助规则时,就需对相关节点的有效范围进行细分而产生新的节点,使其最终也同时满足emin排序。对不满足条件的节点进行分裂,使其一分为二,最终使数组同时满足emax和emin降序排序。算法1显示了由二叉树转变成同时满足rmax和rmin排序的数组的伪代码。算法1:二叉树转变为同时满足e^和e皿排序的数组输入二叉树输出F_Array初始化把二叉树的根节点添加到F_Array;currentNode为F_Array的第一个节点whilenotFinished()dodoifcurrentNode==currentNodeend6ls6leafnode=itsnextnodechildl=currentNode.Childl;child2=currentNode.Child2;lastNode=thelastnodeofF_Array;ifeminSatisfied(childl,child2,lastNode)==YesAddNodesInArray(childl,child2);currentNode=currentNodnextnode;end6ls6foreachnodefromcurrentNod'snextnodetolastNodePropagate(node,currentNode.emin)endAddNodesInArray(childl,child2,newpropagatednodes)currentNode=lastNode'snextnode;endendend算法1主要由3个函数函数eminSatisfied,函数AddNodesInArray禾口函数Propagate组成。其中函数eminSatisfied判断当力口入当前节点(currentNode)的两个子节点时,数组是否依旧满足e^排序。如果两个子节点的e^值小于或等于当前数组中最后一个节点(las飼e)的e^,则函数eminSatisfied返回真;否则返回假。函数AddNodesInArray按照emin由大到小的顺序在数组中添加新的节点。函数Propagate则以当前节点的e^值(currentNode'semin)为分界点对节点的有效范围进行细分,即把一个节点的有效范围[e迈in,e隨)分成[emin,currentNode'semin)禾口[currentNode'semin,e隨)两段,并赋给两个新节点,但这两个新节点的SN值相同,都等于被分裂节点的SN。图8依次显示了把图7中的二叉树转变成同时满足emax和emin排序的数组的5个步骤。图中每个节点都赋予了一个有效范围[emin,emax)和一个SN值。在第一步中,当前节点(currentNode)和数组中的最后一个节点(lastNode)相同,均为二叉树的根节点a。节点a有两个子节点节点b和c。因为节点b和c的简化误差都小于lastNode的emin,因此函数eminSatisfied返回真。此时节点b和c按照emin由大到小的顺序直接添加到数组,如图8中第二步所示。之后,当前节点往下顺延一位,成为节点b,而lastNode为节点c。节点b有两个子节点节点d和e。由于节点d的简化误差大于节点c的emin值,使得函数eminSatisfied返回假,这意味着在数组中新加入节点d和e会破坏emin排序。这时需要对位于currentNode禾口lastNode之间的节点以及lastNode执行函数Propagate,艮卩进行分裂操作而产生新的节点。如图8中的第三步所示,节点c的有效范围[3,10)被分为两段[3,7)和[7,10),因此产生两个新的节点,这两个新的节点的SN均为c,它们将代替被分裂的原始节点c。分裂操作完成后,新生成的两个节点和当前节点的两个子节点,也就是节点d和e按照e^递减的顺序加入数组。值得注意的是,这一步完成后,当前节点不往下顺延一位,变成节点c,而成了lastNode的下一位,即节点d,而lastNode为节点e。接下来的每一步中,在数组中新加入当前节点的两个子节点都能满足e^排序,也就是函数eminSatisfied始终返回真,这时只需把两个子节点直接添加到数组,不需要执行函数Propagate。在叶片简化算法中,叶片合并操作的信息采用二叉树结构保存,而复杂叶片的网格模型简化成四边形的过程采用线性结构保存。当把二叉树转换成数组结构之后,可以把这两部分统一起来,用同一个数组结构表示。这个统一的数组称之为简化关系数组(SimplificationRelationshipArray)。2二次搜索利用简化关系数组可以快速地确定植物冠层的细节层次模型。对于场景中的每棵植物,首先根据它与相机之间的距离,以及相机的参数设置(如视角),把用户给定的像素误差l转换成空间误差e。然后根据此空间误差e,从对应的植物样本的简化关系数组中提取出适合的细节层次模型。只需对简化关系数组进行两次简单的二次搜索就能得到满足空间误差要求的细节层次模型。其中第一次搜索寻找数组中第一个满足条件e,〈e的节点,该节点记为N;第二次搜索寻找数组中第一个满足条件e^〉e的节点,该节点记为M。第一次搜索在整个数组内进行,而第二次搜索的范围为节点N到数组的第一个节点。由于简化关系数组同时满足emin和^降序排序,因此位于节点M和N之间的节点满足条件£G[e^,ej,所以它们构成了当前的细节层次模型,其中每个节点都代表着一片叶片。相对于二叉树遍历,采用二次搜索确定细节层次模型的效率非常高。此外,通过利用相邻帧之间的关联性,该过程还能得到进一步的加速。在对场景进行漫游时,视点通常是逐渐变化的。因此同一棵植物在相邻两帧中的细节层次模型变化不会很大。换句话说,同一植物冠层在相邻两帧中的两个细节层次模型在简化关系数组中对应的起始位置(M)和终止位置(N)都相差不大。利用这点可以縮小搜索范围,提高搜索的效率。实验中,每棵植物都保存三个数值My^和^,它们分别记录了上一帧的M,N和e值。当绘制新的一帧图像时,首先比较当前的空间误差e与^的大小关系,然后根据结果进行不同的处理。结果有如下三种情况參如果e=ey则M=MyN=Ny不需要重新搜索。參如果e>^,则首先进行第一次搜索,搜索条件为e幽〉"搜索范围为节点M工到数组的第一个节点,搜索结果记为M。然后再在节点M到节点&中进行第二次搜索,寻找第一个满足条件emax<e的节点,第二次搜索结果为N。參如果e<^,则首先进行第一次条件为e,〈e的搜索,搜索范围为节点^到数组的最后一个节点,搜索结果为N。然后再在节点N和M工之间进行条件为e^〉e的第二次搜索,搜索结果为M。由上述方法提取了适合的细节层次模型后,可根据构成此模型的所有节点的SN值,得到一组对应的顶点索引编号。把这一组顶点索引编号存入另一个数组,并从CPU传输给GPU,借助0penGL,就能完成绘制。叶片的几何信息在绘制之初已送入GPU内存,因此在绘制过程中,几何数据不需要进行传输,但顶点索引编号的传输仍会增加时间消耗,降低绘制的速度。幸运的是,由于各细节层次模型的构成节点在简化关系数组中是连续分布的。利用这一点,顶点索引编号的传输同样可以得到避免。在预处理过程中,可根据简化关系数组构建一个新的数组,该数组称之为索引数组(IndexArray)。它按照简化关系数组中的节点的顺序记录了简化关系数组中每个节点的顶点索引编号。因此这两个数组存在着一一对应关系。在绘制开始时,把几何信息和索引数组都存入GPU内存中,而把简化关系数组存入CPU内存中。当给定视点后,首先利用简化关系数组通过两次二次搜索提取适合的细节层次模型,即得到M和N。再找出这两个值在索引数组中对应的位置,记为M'和N'。一旦得到M'和N',就能在0penGL的协助下完成绘制。在这种情况下,CPU和GPU几乎不需要任何的数据传输,因此绘制效率很高。即使是绘制数万棵树木组成的森林,也能达到实时的要求。五、基于叶片密度的多分辨率模型第四节中介绍的方法可以根据树木与视点之间的距离,对树冠提取出合适的细节层次模型。树距离视点越远,描述树冠的细节层次模型越粗糙。这样提取出的细节层次模型中,位于树冠各处的器官的表达精度是一样的。这是不合理的,因为不同位置的冠层器官对绘制结果图像的贡献是不一样的。本算法在叶片密度的基础上,对树冠建立允许多种分辨率共存的模型。最终提高树冠整体的数据压縮比,同时保证绘制图像的质量。叶片在冠层中的分布是不均匀的,而人类的眼睛对于冠层中叶片稀疏程度不同的区域的敏感程度也不一样。对于叶片茂密的地方,人类的视觉不敏感。即使这些地方发生了变化,人们也不一定感觉得出。而对于叶片稀疏的地方,人们则比较敏感。这些地方一旦13发生改变,通常能立刻觉察出来。利用人类视觉的这种特性,根据叶片的分布情况可以建立冠层的多分辨率模型,使得叶片茂密的地方比稀疏的地方的简化程度更高。为描述叶片在冠层中的分布情况,本算法提出了叶片密度的概念。叶片A的密度A=A(A,p)定义为叶片A临域内叶片的数目,其中叶片A的临域定义为球心位于叶片A的中心,半径为p的球体。判断一片叶片是否落入另一片叶片的临域内,需要判断叶片多边形各个顶点与对应球体的位置关系。为了简化计算,每片叶片由其中心点代替。算法中,球体半径P为常数,因此叶片A的密度可简写为A=A(入)。得到各叶片的密度后,需进行归一化操作,使得它们的值属于[1,n]。其中参数n由用户定义。在实际应用中,取n=2。归一化操作为简单的线性变换,公式如下A'(A)=[n-l]X[A(入)-AmiJ/[Amax-AmiJ+l其中Amin=min{A(A);AGA},Amax=max{A(A);AGA},A是所有叶片的集合。对于在叶片合并操作或者线合并操作中新产生的叶片,而叶片合并操作中新生成的叶片的密度定义为参与合并的两片叶片的加权平均值,其中权重由叶片的合并次数决定,叶片的合并次数记录着被它合并的原始叶片的数目。其密度可由下面的公式得到A,(x)=(G(y》XA,(y》+G(y2)XA,(y2))/(G(y》+G(y2))其中是x新生成的叶片^和^是参与合并的两片叶片,G(y》和G(y》分别是叶片y工和^的合并次数。归一化操作完成后,可根据叶片密度调节树冠中不同位置的叶片的允许的空间误差。使得叶片茂密的地方采用大的空间误差,而叶片稀疏的地方采用相对小的空间误差。这样在绘制时,位于茂密处的叶片的表示模型就比位于稀疏处的叶片更粗糙。叶片A经调节后的空间误差值e(A)可由下面的公式得到e(入)=eXA,(入)空间误差的调节在实时绘制阶段进行,每一帧都要计算一次。虽然采用密度调节后,每一帧需要绘制的多边形数目会减少,从而縮短绘制时间。但调节运算本身也需消耗一定的时间。幸运的是,叶片密度和视点信息无关,它不因视点的改变而改变。因此基于叶片密度的调节不用限定在实时绘制阶段进行。前面提到,在对二叉树结构进行遍历时,判断一片叶片是否属于当前的细节层次模型的标准在于看它的简化误差e是否小于或等于空间误差e。因此放大空间误差e与縮小简化误差e的效果是一样的。既然叶片密度与视点无关,就可以采用另一种方式——在预处理阶段根据叶片密度调节叶片的简化误差。首先计算各叶片的密度,然后根据密度调节叶片的简化误差。调节过程结束后,即可删除叶片密度信息。这样不仅不会在绘制阶段增加额外的计算,而且也不需要对叶片密度进行存储。叶片A的简化误差e(A)可根据其密度值A'(A)通过下面的公式调节成为<formula>formulaseeoriginaldocumentpage14</formula>由公式可知,A'(A)越大,叶片A的简化误差就越小,这就意味着绘制时,叶片入的简化程度会越高。树冠中位于不同位置的叶片也就因密度的不同而拥有不同的细节层次。密度调节对二叉树结构转换成线性数组结构不影响。在预处理阶段,当对各叶片的简化误差根据对应的密度进行调节后,叶片的简化信息可按照调节后的简化误差利用第四节中介绍的方法存储在简化关系数组中。实验结果与结论用C语言实现了本发明所描述的方法,并用于了几种常见针叶的简化。所有的实验都是在一台Pentium(R)3.4G、1GB内存、GeForce8600GT显卡、操作系统为Windowsxp的PC机上完成的,显示部分使用了标准的0penGL图形函数库。附图9显示了本算法简化复杂叶片的整个过程。随着用户给定的像素误差不断增大,叶片的表示从网格模型逐渐转变成为四边形。其中标示为红色的顶点是角点,它们在简化过程中几何位置保持不变。附图10显示了一棵具有681,200片叶片的40岁黑杨树的细节层次逐渐递减的四个模型。这四个模型的压縮比分别为100%、5.2%、0.25%和0.01%。可以看出,即使当叶片数量很少时,树冠外形仍能很好地保持。为了显示本发明中细节层次模型提取算法以及GPU支持对绘制速度的影响,本发明以白杨树模型(图11(a))为例进行了实验。首先对白杨树树冠的细节层次进行量化,使得每个细节层次采用0到1之间的实数表示(见图11(b)冠层细节层次模型量化成内的实数)。其中0表示树冠最精确的模型,即原始模型;1表示最粗糙的模型。然后对这棵白杨树采用四种不同的绘制方式,并测量每种方式在提取和绘制白杨树树冠的不同的细节层次模型时所消耗的时间。其中方式1为传统方法,它采用二叉树遍历法提取树冠的细节层次模型,并且不支持GPU加速,所有的数据都保存在CPU内存中。因此在绘制每一帧时,都需要把这一帧需要绘制的几何信息从CPU传到GPU。方式2和方式3为半GPU支持。叶片的几何信息,即顶点数组在绘制之初存入GPU内存,因此在绘制时不需要在CPU和GPU中传输几何数据。这两种方式的区别在于它们采用了不同的细节层次模型提取算法。方式2和方式1的一样,采用二叉树遍历法;方式3则采用了本发明中介绍的方法。方式4和方式3的细节层次模型提取算法一样,但方式4为全GPU支持,即在绘制之初,顶点数组和索引数组都保存在GPU内存中。因此这种方式在绘制过程中CPU和GPU之间几乎不需要进行数据传输。这四种方式的统计结果见图11(c)四种绘制方式的时间消耗曲线。从比较中可看出,方式4的效率最高。相对于传统方法,即方式1,方式4对绘制速度的提高达到100倍以上。此次实验还测量了这四种绘制方式在绘制白杨树树冠时的CPU和GPU内存的消耗情况。统计结果,包括原始树模型的叶片的数目,原始树模型的几何数据的大小,CPU内存消耗,以及GPU内存消耗,见表l。表1:四种绘制方式的CPU、GPU内存消耗情况<table>tableseeoriginaldocumentpage15</column></row><table>附图12为一棵35岁秋天的挪威枫树分别采用和不采用叶片密度调节的结果比较。其中图12(a)为原始模型,它包含73,600片叶子,可看出树叶的分布是不均匀的,图12(b)(e)都为简化模型,它们对应的叶片数分别为11,960、8,399、6,440和6,385。图12(b)和图12(d)是不考虑密度影响的结果,图12(c)和图12(e)为对应的考虑了密度影响的结果。在比较中,图12(b)和图12(c)为一组,图12(d)和图12(e)为另一组。图12(b)和图12(c)的空间误差是一样的。这两幅图像的视觉质量相当,但图12(c)比图12(b)的叶片的数目少。通过这组比较可知,在同一误差条件下,考虑密度影响的简化结果能在保证图像质量的前提下取得更高的几何数据压縮比率。图12(d)和图12(e)的叶片的数目相当,但是图12(e)的图像质量明显比图12(d)好。这说明在叶片数量一致的条件下,考虑密度影响的简化结果能更好地保持原始模型的几何细节。附图13是一棵25岁春天山楂树的LOD模型。处于四个不同位置的山楂树因与相机的距离不同而具有不同的细节层次。离视点越远,树冠中的叶片就越少。但它们的视觉效果相似。表2列出了这四棵树的统计数据,包括与相机之间的距离、叶片数目、以及相对于原始模型的压縮比。表2:附图13中四棵山楂树的统计数据<table>tableseeoriginaldocumentpage16</column></row><table>图14和图15是一片由阔叶树和针叶树组成的混合林在两个不同的视点条件下的绘制结果。这片秋天的森林包含22,560棵树,这些树由七棵植物样本复制而来。这七棵植物样本分别为10岁樟子松、12岁白杨、12岁菩提树、15岁冬青树、15岁山楂树、20岁云南白杨以及35岁枫树。未简化前,描述该森林的树叶的多边形的数目为868,850,760,树枝的多边形数目为7,299,027,168。这样的数据量超过了CPU和GPU所承受的范围。图14是以步行的方式对森林漫游时看到的景色。此时有1,452棵植物在视锥体内。这些树的树叶由18,081,048个多边形和8,996,680根线表示,因此可知叶片数据的压縮比为3.1%。绘制结果的图片大小为1280X1024,绘制速度为12.82帧/秒。图15则是以鸟瞰方式对森林进行漫游时所看到的景色。图15中有1,058棵树,它们的叶片由7,318,239个多边形和235,704线表示,因此压縮比为0.87%。绘制速度为21.28帧/秒。图14和15的阴影效果均在后处理阶段完成。以上所述,仅为本发明中的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉该技术的人在本发明所揭露的技术范围内,可理解想到的变换或替换,都应涵盖在本发明的包含范围之内,因此,本发明的保护范围应该以权利要求书的保护范围为准。权利要求一种对复杂叶片的快速简化和绘制方法,其特征在于,包括下列步骤,其中步骤S1-S7在预处理阶段完成,步骤S8-S9在实时绘制阶段完成步骤S1首先输入树模型,提取树叶信息;步骤S2对叶簇内的每一片叶片进行判断,判断叶片是否为,如果是,则把叶片复杂的网格模型简化成四边形,完成叶片的第一个层次简化;如果不是复杂叶片,则执行步骤S3;步骤S3通过迭代的叶片合并操作把叶簇内的四边形叶片逐渐简化成为一个四边形,该四边形称之为叶簇代表四边形,完成叶片的第二个层次简化;步骤S4迭代地对树冠中的代表四边形叶片执行叶片合并操作,直到整个树冠用一个四边形表示,完成叶片的第三个层次简化,第三个层次采用距离限制法对简化过程进行加速;步骤S5计算所有叶片的密度,并根据叶片密度调节处于树冠中不同位置的叶片的简化误差;步骤S6采用数组结构把叶片的几何信息和简化信息分别保存到两个数组中;步骤S7把保存了几何信息和简化信息的两个数组作为不同文件保存到硬盘中;步骤S8把保存了叶片的几何信息和简化信息的文件从硬盘分别读入CPU和GPU内存,并设定相机信息和像素误差;步骤S9根据当前视点信息和像素误差,通过对保存了简化信息的数组进行两次二次搜索,确定冠层合适的细节层次模型;对相应细节层次模型进行绘制,得到绘制图像。2.按权利要求1所述的方法,其特征在于,所述简化成四边形是采用改进的点对收縮算法把叶片复杂的网格模型简化成四边形。3.按权利要求2所述的方法,其特征在于,对每片叶片指定两个顶点为角点,角点在简化过程中几何位置保持不变,其中第一角点定义为距离其承接茎最远的顶点,第一角点是叶尖所对应的点;第二角点是与叶柄相连的点,通过第一角点根据叶片的对称性得到第二角点。4.按权利要求1所述的方法,其特征在于,所述采用距离限制法对简化进行加速时,首先由用户设定一个距离阈值Q,然后求取距离小于或等于阈值的叶对,为有效叶对,并把最优叶对的筛选限定在有效叶对中进行。5.按权利要求4所述的方法,其特征在于,在求取有效叶对时,采用叶片的中心点代替叶片,并对中心点采用改进的八叉树结构进行细分;该八叉树结构首先计算中心点的包围盒,然后对它不断地细分;每一次把盒子细分成八份,每次划分都在盒子最长的那条边进行,并且每次划分后,因划分而得到的两个盒子在对应边上增大Q/2;这样的细分不断进行,直到盒子里的中心点的数目小于或等于用户设定的阈值L,或者盒子有一条边的长度不再大于阈值Q。6.按权利要求l所述的方法,其特征在于,所述叶片A的密度A=A(A,p)定义为叶片A临域内叶片的数目,其中A代表一片叶片的编号,叶片A的临域定义为球心位于叶片A的中心,半径为P的球体;按照此定义求出原始模型中的原始叶片的密度后,再进行归一化操作,使得原始叶片的密度值属于[i,n],其中参数n由用户定义;而叶片合并操作中新生成的叶片的密度定义为参与合并的两片叶片的加权平均值,其中权重由叶片的合并次数决定,叶片的合并次数记录着被它合并的原始叶片的数目。7.按权利要求1所述的方法,其特征在于,所述用数组结构存储叶片的简化信息,该数组结构支持GPU加速,它满足以下两个条件(1).组成树冠的任意的一个细节层次模型的各节点都是连续地存储在数组中,即不同的细节层次模型都构成数组中完整的一段;(2).—旦用户给定像素误差,只需对数组执行两次二次搜索就能确定冠层合适的细节层次模型。8.按权利要求7所述的方法,其特征在于,数组中每个节点被赋予三个值e^,e^和SN,其中e^是该节点的简化误差,e^是其父节点的简化误差,SN是该节点表示的叶片的序号;该数组由传统二叉树结构变换而来,在把二叉树转换成数组的过程中,以emax的降序排列为主要规则,以emin的降序排列为辅助规则;当新加入的节点不满足e^排序时,对不满足条件的节点进行分裂,使其一分为二,最终使数组同时满足emax和emin降序排序。9.按权利要求7所述的方法,其特征在于,两次二次搜索的条件分别是e^〈e和e^〉"其中e是当前允许的空间误差,并利用相邻帧之间的关联性来縮小搜索范围。全文摘要本发明为一种对复杂叶片的快速简化和绘制方法,输入树模型提取树叶信息,对叶簇内复杂叶片完成一层次简化;迭代地叶片合并完作二层次简化;迭代地对树冠中的叶片合并操作完成叶片的三层次简化;计算叶片密度;用数组结构把叶片几何和简化信息分别保存到两个数组中并读取,根据当前视点和像素误差,对保存简化信息的数组进行二次搜索,确定冠层合适的细节层次模型绘制图像。本发明适用于任意形状的复杂叶片的简化。利用距离限制提高简化速度,实现植物冠层的细节层次模型的高效提取和绘制。通过密度因素构建树冠的多分辨率共存的模型提高绘制速度。本发明能保持树冠的形状,有效克服走样现象,最终实现数万棵植物构成的森林的实时漫游。文档编号G06T17/00GK101751694SQ20081023932公开日2010年6月23日申请日期2008年12月10日优先权日2008年12月10日发明者张晓鹏,邓擎琼申请人:中国科学院自动化研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1