基于OpenGL和VC的树木三维可视化模拟实现1)

2010-08-09 11:07:16赵庆丹罗传文孙海洪
东北林业大学学报 2010年11期
关键词:圆台树干绘制

赵庆丹 罗传文 孙海洪 陈 立

(东北林业大学,哈尔滨,150040)

近年来,随着科学计算可视化技术的发展,日益深入了对树木生长机理的研究、森林生态系统的模拟与预测的研究。人们力求构造更加通用的三维建模与可视化系统,对树木及林分的自然生长和人工经营措施等进行实时的本真还原和科学模拟,让决策者有一个真实的、身临其境的感受,对辅助森林经营管理及影响评价具有极其重要的科学意义。所以,以树木、森林景观为主要对象的计算机建模和可视化技术成为森林经理学、生态学、自然地理学、植物学等领域的一个研究热点[1-2]。自1968年美国生物学家Aristid Lindenmayer提出L-system并被Smith引入到图形学以来,国外专家学者在植物可视化领域做了许多研究[3]:1981年,美国科学家Witten和Sander提出了对部分树木的形态结构进行计算机模拟的DLA模型;1984年,Aono与Knnii提出了树木三维几何模型,使用分枝角、开度角等几何参量,实施对树木几何结构的控制和修改;Toronto大学景观研究中心构造了以图像方式表达树木模型的数学建筑物模型;EXRI公司的ArcView 3DX则采用简单矢量植物模型;Gruen Al等人利用自主开发的三维交互式建模系统建立了一些城市景观模型,但真实性较差。我国数字植物研究始于20世纪90年代,起步相对较晚,但近年来我国在此领域也取得了一定的进展[4]4-19:郝小琴、宋铁英等较早地在树木可视化方面进行了开创性的工作;徐杨等应用L-System模拟树木的基本形状;魏琼等以DOL为基本算法,对树木的形态进行三维模拟;雷蕾等提出了一种基于能量模型的叶片纹理构造算法,比通常的纹理贴图法有更好的随机性和立体感;宋仁波、常敏基于实测数据和经验模型建立了长白落叶松人工林单木静态结构模型等。由于树木形态的复杂性,以及树木生长的生理确定性(如树种、方向性等生理性质)和长势不确定性(如生长受地理位置、条件等约束)等特点,使得树木三维可视化的研究至今仍未得到一个完备的三维计算机树木模型。笔者将以东北重要树种——红松(Pinus koraiensisSieb)为例,将表达树木形态结构特征的实测数据转化为图形或图像形式在计算机上进行模拟,积累树木建模和绘制的经验,逐步开发一个通用的树木模型及可视化系统,以期在林业研究领域得以应用。

1 研究方法与模型构建

1.1 研究方法

树木可视化,就是一种运用计算机图形学的理论与方法对树木形态结构和生长过程进行仿真的技术。它将构成树木形态结构特征的数据转化为图形或图像形式在计算机上进行模拟,即把树木结构的描述方法与几何形态参数反演成具体的树木空间形态,通过光照、纹理、渲染等手段绘制成树木[4]12。

文中以穆棱地区天然次生混交林(穆H-1)中的红松为例,在VC++6.0开发平台上结合OpenGL开放式图形库,采用传统的几何实体建模技术和树木形态结构相结合方法,实现基于实测数据(包括胸径、树高、一级枝条构件的组成数据(枝条、弦长、基径、着枝角度、方位角、弓高等))的静态单木可视化模拟。同时,运用纹理贴图技术,对树模型及树木生长的环境进行真实感描绘,将这些图片转化为二维纹理放置于三维树模型可视化系统中,以提高模拟的逼真性。

1.2 结构模型

结构模型一般包括分解信息、几何结构信息(描述各组分的形状和空间位置)和拓扑结构信息3个部分的内容[5]。几何结构模型是指对植物整体和器官的三维几何形态的描述。拓扑结构模型描述植物器官之间的连接关系。植物的拓扑结构与其分解的组成单元密切相关。文中主要讨论几何形态描述的方法,且只对红松的地上部分(树干、枝条、树叶)进行三维可视化研究。

1.2.1 树干模型

树干是树木的重要组成部分,其干形一般有通直、完满、弯曲、尖削以及主干是否明显之分。红松的干形通直、明显,且分叉少。干形的变化,随其粗度自下而上逐渐减少,可用形状和削度来描述。树干的形状一般从横断面和纵断面两个方面进行研究。在研究中,横断面被认为是圆形的。树干的纵断面形状由干曲线式来描述。(孔兹干曲线式:y2=Pxr。式中:y为树干横断面半径;x为树干梢头至该横断面的长度;P表示系数;r为形状指数,且r=2[ln(y1)-ln(y2)]/[ln(x1)-ln(x2)]。

经学者研究表明,树干各部分的形状指数一般都不是整数,即树干各部分只是近似于某种几何体。所以,结合干形削度(d2r/D2=-0.108 6+1.085 9(H-Lr)/(H-1.3)。式中:D为胸径;H为树高;Lr为任一高度;dr为高度Lr处的直径)的变化,将树干按区分段(每个区段长度为1 m)进行解析,并将树干看作由若干个圆台体和一个圆锥体组成。

图1 树干模型

1.2.2 枝条模型

枝条的长度、大小、方位以及与树干的角度决定着树冠的形状,并对叶片起着支撑的作用,它的分枝结构决定着叶片的空间分布。枝条分枝级数的确定依据文献[6]采用由内及外的方法,即以主干为0级枝,从树干上分出来的枝条为1级枝,从1级枝上分出来的枝条为二级枝,从2级枝条分出来的枝条为3级枝,并以此类推。枝条的建模绘制也采用简单的几何图形及利用实测的数据生成。以一级枝条为例,将枝条分成若干断,将每一断看成是圆柱体或圆台体,进行一定角度的偏转来实现。通过总着枝深度、方位角、着枝角度可以确定一级枝条的具体生长位置,通过基径、枝长、弦长和弓高数据可以确定枝条的生长和形态。

由于枝条存在弯曲度,其绘制方法略不同于树干,一般有参数曲线拟合方法和参数设定弯曲度模拟的方法。前者需要对枝条的弯曲形状做大量测量,不适合模拟植物形态及其生长过程。后者虽然简单,但是很难形成逼真的弯曲形状。鉴于二级枝条、三级枝条……数量多,且不容易进行测量,故以分形理论,用迭代的方法产生这种具有自相似性的结构。每一个枝段可以用弯折、扭转、长度和半径4个参数来表示。一条形态复杂的树枝可以看成是由一个给定初始值的枝段通过若干次的迭代生成的。通过生枝段的参数设置并经过若干次的迭代之后,树枝将逐段发生扭转,各枝段的长度和半径均将逐渐缩小,而各枝段的弯折程度则保持不变。

1.2.3 树叶模型

红松的叶子为针形,且为五针一束。每一针叶子组成的形状近似为细长的圆锥体,在绘制叶子时,可以根据实测的叶子的长度、宽度和厚度采用简单的几何图形来绘制。但如果对树叶逐片通过实测数据进行几何建模,将耗费巨大的空间和计算量。因此需要将空间上相邻的多个叶片及连接它们的细枝合并,形成“叶簇”。有些研究[4]96则采用“枝片”来简化细枝条的几何表示,即采用一种基于图像的枝条细节表示方式,由一个可变形、由细枝中心线扩展而成的四边形条带来表示细枝及其子枝和叶子,然后用预计算的枝片纹理实现叶簇的外观。这种方法能显著地减少模型的面片数量,又能获得更多细节,实现叶子和细枝条的模拟,并达到仿真效果。研究中叶子的建模绘制利用OpenGL提供的简单的线条图形函数并利用实测的数据、参考叶簇方式绘制生成。

2 树木可视化实现

2.1 基本流程与步骤

三维世界中的物体经过一系列的几何变换,通过投影使物体以合适的状态显示出来,然后定义视口,使投影后的物体显示其内,相应的流程见图2。

图2 三维图形绘制的实现流程

[7],基于OpenGL的树木可视化可以分为5个步骤。

①坐标变换,生成基本图元:将现实世界中的物体显示到计算机的二维屏幕上需要一系列复杂的过程,主要涉及多种坐标系之间的转换。根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述。在 OpenGL中,所有的几何体都是由若干个有序的顶点集合来描述,而不是将线段、多边形组合起来构造几何体。

②裁剪变换:把景物模型放在三维空间的合适位置上,并且设置视点以观察所感兴趣的场景。三维几何物体是在三维坐标中考虑的,当三维图形的顶点绘制到屏幕上时,它将是二维图像。因此,将几何物体的三维坐标转化到屏幕上的像素位置,需要在计算机进行3种操作:矩阵相乘的变换,包括造型、视图和投影等操作,这些操作包括旋转、平移、缩放、反射、正交投影和透视投影;窗口裁减,由于场景是在一个矩形窗口中创建的,所以位于窗口之外的物体必须要裁减掉;视口变换,即在变换坐标和屏幕像素之间建立对应关系。

③色彩与光照:根据应用要求来确定色彩,同时确定光照条件。

④光栅化,生成图形片段:把景物模型的数学描述及其色彩信息转换成计算机屏幕上的像素点。

⑤纹理贴图:图形硬件处理的几何图形越多,它所需要的渲染时间就越多,为了快速真实地反映现实感,采用简单的图形应用到一个多边形的表面。文中树干部分即采用该方法,先将采集的树干纹理图像进行过滤,然后在物体表面进行贴图。

2.2 应用接口的建立

在Visual C++中应用OpenGL编程的主要步骤具体有4个部分。

①建立应用程序Win32API与OpenGL库文件之间的联系,并加入库文件 opengl32.lib、glu32.lib 和 glaux.lib,在由MFCApplication Wizard生成的视图类的头文件中,加入gl.h、glu.h和glaux.h。应用程序即可调用OpenGL提供的数据类型和函数。

②设置像素格式和管理着色描述表:在创建一个绘图描述表RC(Render Context,又称渲染描述表)之前,首先要设置像素格式,完成像素格式的设置后,需要为OpenGL建立RC,只有建立RC后,OpenGL才能调用绘图原语在窗口中绘出图形。通过填写结构PIXELFORMATDESCRIPTOR来设置显示设备描述表DC(Device Context)的位图格式属性;MySetupPixelFormat()函数主要完成建立对所需像素格式的描述,选择系统支持的最接近的像素格式,然后指定为DC的像素格式。图形绘制完毕后,应断开当前线程与RC的联系,并删除RC,可在视图类的WM_DESTROY消息处理函数中完成。

③建立OpenGL视点,添加成员变量和成员函数,调用OpenGL函数绘制图形:主要是定义视景体、清除深度缓存、设置投影模式、建立光照模型、作图、图形平移、旋转等,完成绘图的初始化及图形渲染绘制。

④消隐:物体被阻挡部分的光线不能到达观察者的眼中,这些部分就是隐藏部分,是不可见的。如果要使计算机显示具有真实感的三维物体,必须在视点确定之后,就将物体表面上不可见的点、线、面消去。OpenGL执行这一过程的方法叫做图形消隐。

2.3 红松单木可视化模拟

2.3.1 树干模拟

为了让绘制的图形与现实中的树干看起来更加接近,根据前面构建的树干模型,将树干看成是由一系列圆台体和一个圆锥体组成,树干的横断面几何形状近似为圆形。具体方法就是将树干分为合适的若干段(圆台),而不同段的上下底直径可以通过实测数据或者树木的削度方程,即不同高度处计算出来的直径来获得,主要参数包括标准地号、树木号、RH(相对高系数)、树高、对应树高处的直径等。这样就会模拟出和现实相接近的图形,并且使模拟出来的图形能够具有生物学的意义。

首先,读取实测数据并进行数据有效性检查。单木实测静态数据文件以EXCEL形式存放。包括以下字段项:标准地号(穆棱混交林一号地)、解析木号(红松平均木)、RH、h(相对高)、D(相对高处带皮直径)、树高(树木全高)。结构形式及数据如表1所示。

其次,建立一个结构体,表示和存储各个圆台体的信息,包括三维坐标、旋转角度、上下两个面的半径、圆台体高度、顶点数组等。

然后,通过改进后的圆台体绘制函数进行绘制。OpenGL提供了圆台体几何绘制函数gluCylinder(),但由于该函数控制的每一段圆台体上、下面的边数并不能随着模拟树干的断面直径进行变化,同时在纹理贴图方面也不能根据树高的大小进行调节,所以将不同的圆台按照合适的角度、位置拼接出来合适的图形,是研究的关键所在。

完成树干绘制后,为了达到更加逼真的显示效果,应对树干进行渲染。具体实现方法是:从下自上先渲染第一个圆台体,然后将坐标系在Y轴方向上移第一个圆台体的高度,进行第二个圆台体的渲染,再上移第二个圆台体的高度,渲染第三个……依次递进。

2.3.2 枝条模拟

通过前人的理论研究和实践分析发现[9],一级枝在树干上的垂直分布,基本符合均匀分布。一级干主要参数有枝的方位角、着枝角度、弯曲度、枝长、枝的基径、枝长、弦长、弓高。通过方位角、着枝深度(或总着枝深度)和着枝角度控制一级枝生长的位置,通过枝节数、枝长和基径的生长方程控制一级枝的生长及形态。结构形式及数据如表2所示。

表1 解析木树干实测数据

表2 解析木部分枝条实测数据

枝条的绘制方法与树干的绘制过程基本一致,如果树枝是直的,那么可以将枝条看成是圆锥体,如果是弯曲树枝,枝条的几何形状可以近似看成是由若干段圆台体加一个圆锥体相互偏转一定的角度组成拼接的弧线。一般,自然情况下生长的枝条都具有一定的弧度,所以文中所绘制的都是带有一定弧度的枝条。同时,基于复杂的分枝结构,采用递归算法生成枝条。为了进一步绘制多样化和更加自然的树木,在树木生长过程中引入随机性和枝粗衰减系数,其中随机性包括多个生成规则的随机选择,生成分枝前的随机扰动[10]。

2.3.3 树叶模拟

叶子的主要参数包括叶的叶数、束量、长度、宽度以及高度。其中叶数为一束叶子的针数,红松叶子是五针一束,所以叶数为5,在绘制时采用了相连具有一定角度的5根线条表示;叶子的长度、宽度、高度由实测数据取值(将树冠分为上中下3层,每层各挑选一个标准枝并采集叶子样本,再将叶子样本按长、中、短分为3组,并分别测得长、宽、高各值。见表3),通过OpenGL线条宽度设定。由于树叶多,很难进行方位角、着枝角度等参数的测量,所以一律采用随机方法产生。

在绘制树叶时,每束用相连且有一定角度的5根线条表示,每根线条由若干段组成,且稍有扭曲,所以将每段偏转一定的角度来反映叶子的扭曲。叶子的初始化由两个函数完成。InitMyLeavs()函数完成树干上最上一段树干(当年生)的叶子初始化,另一个函数InitMyLeaf()对具体的枝条叶子初始化。叶子的渲染由MyShowLeavs()函数通过调用叶子结构体成员函数Draw()实现。

表3 解析木树叶实测数据

图3 树木可视化的效果

2.4 树木生长环境模拟

真实感的三维地形绘制,必须采用现实世界中的具体数据来构造,一般采用数字高程模型方法。这种方法生成的地形精度高,但是数据结构复杂,图形生成速度慢。文中对地形方面没有那么高的要求,主要是满足感官上的要求,所以采用模拟地形的方法随机生成地形,但是不能和现实世界一一对应。

在场景中绘制蓝天白云效果,可以增强场景的真实程度,绘制方法主要有盒子方法和球形方法[11],虽然这两种方法模拟出的云彩都有流动感,但是两者有较大差别。为了增强系统的运行速度,采用盒子方法,简单建立天空效果。云彩的绘制时通过一个四边形上贴一幅云彩图像来模拟,流动效果是通过变换纹理坐标来实现,再加上雾化效果以达到更加逼真的效果。

3 结论

在总结分析前人工作的基础上,重点围绕基于几何实体的树木建模技术对树木三维可视化技术进行了研究探讨,并对红松进行了三维可视化模拟,实现了较逼真的树木三维可视化效果,真实描绘树木生长的环境。但也存一些缺点和不足,有待进一步的研究与提高:改进渲染算法,有效降低林木渲染的复杂性问题;与计算机硬件技术相结合,进一步提高渲染速度的问题;采用更加合适的构图法,从而建立更加通用的树木模型,解决树木种类繁多、不能适合所有树种的问题;动态模拟树木生长过程问题。

参考文献

[1]陈彦云,林珲,孙汉秋,等.高度复杂植物场景的构造和真实感绘制[J].计算机学报,2000,23(9):917-925.

[2]郝小琴.林业科学与可视化[J].林业科学,2001,37(6):105-109.

[3]刘倩.三维可视化技术的应用研究[D].郑州:河南农业大学,2008.

[4]刘兆刚.樟子松人工林树冠动态三维图形模拟技术的研究[D].哈尔滨:东北林业大学,2003.

[5]Godin C,Caraglio Y.A Multiscale Model of Plant Topological Structures[J].Jtheor Biol,1998,191(1):1-46.

[6]肖锐.樟子松人工林树木构筑型的研究[D].哈尔滨:东北林业大学,2006.

[7]费广正,芦丽丹,陈立新.可视化OpenGL程序设计[M].北京:清华大学出版社,2001.

[8]Wright R S,Michael S Jr.OpenGL超级宝典[M].3版.徐波,译.北京:人民邮电出版社,2005.

[9]雷相东,常敏,陆元昌,等.长白落叶松单木生长可视化系统设计与实现[J].计算机工程与应用,2006,42(17):180-183.

[10]陈晓,彭国华,赵丛.基于分形三维L系统的真实树木摇曳动态模拟[J].计算机工程与应用,2008,44(26):77-79.

[11]和平鸽工作室.OpenGL高级编程与可视化系统开发:高级编程篇[M].2版.北京:中国水利水电出版社,2006.

猜你喜欢
圆台树干绘制
Art on coffee cups
为什么树干不是方的?
军事文摘(2021年16期)2021-11-05 08:49:16
放学后
童话世界(2018年17期)2018-07-30 01:52:02
1.1.3圆柱、圆锥、圆台
为什么要在树干上刷白浆
为什么要在树干上刷白浆
为什么要在树干上刷一层白浆
机身共形圆台阵结构对地杂波谱特性影响分析
现代红木家具鉴赏——十二生肖圆台
浙江林业(2015年6期)2015-02-24 06:05:50
在转变中绘制新蓝图
中国卫生(2014年9期)2014-11-12 13:02:00