-
近年来,树木三维可视化建模成为虚拟植物研究领域的热点课题之一,在数字植物园建设、虚拟景观规划设计、三维游戏开发和影视动画设计等诸多领域都有着广阔的应用前景。树木包含的器官较多,其结构较为精细且无规则性,尤其是枝干和树叶,具有复杂的几何拓扑结构。这使得计算机对其进行建模会比较困难,所以如何快速、精准建立具有高真实感的树模型是主要需要解决的问题[1]。目前,植物三维建模的方法主要分为3种:基于图形的方法、基于图像的方法和基于专业软件的方法。3种建模方法各有优劣,基于图形方法的模型比较注重植物生理的形态结构,主要包括基于分形理论的迭代函数系统(iterated function system)和L系统(L-system),还有粒子系统(partial system)和随机过程生长法等,建立模型效率较高且构建方式较为灵活,但是难以对形态结构特别复杂的植物进行三维建模。图像方法则是针对图形方法的不足提出的,它是根据输入计算机的一幅或多幅2维图像来完成对植物形体的三维重建,但其建模过程较为复杂,生成的模型形态结构固定,缺乏灵活性。另外,由于易受室外环境的影响,如遮挡或季节因素导致图像数据的缺失而难实现可视化建模[2-3]。基于软件建模的方法,目前比较流行的软件有SpeedTree,Xfrog,3dsMax以及Maya等[4-7],虽然生成的模型真实感是所有方法里最好的,并且能实现具有复杂形态结构的植物体的建模,但是该建模方法要求用户具备较扎实的植物生理学知识。综合比较上述方法,出于能够快速、高仿真、可交互建立具有真实植物空间结构信息的三维树木模型的目的,本研究针对现有建模方法的缺陷和不足,利用基于改进的分形迭代函数系统的建模方法,设计并实现了单树建模软件系统,通过提取特征参数和变量控制系数来控制树体模型生成,所建立的模型能较好地反应树木生理生态结构,还克服了建模流程复杂、模型真实感弱、交互性差等缺点。
HTML
-
为了实现基于OpenGL的交互式树木三维可视化建模系统,本研究选用Visual Studio 2010作为开发工具,用Visual C++语言编程实现,通过配置OpenGL运行环境,运用OpenGL提供的图形图像技术以及基于改进的分形迭代算法绘制虚拟三维树木,实现通用性高、真实感强且人机交互性良好的虚拟三维树木模型的自动化生成系统。运行硬件环境具体为:Windows 10 64位操作系统,8G内存,Inter Core i5-4200h处理器,NVIDIAGeForceGTX 950M显卡。
-
根据1.2节模型构建内容可知,若知道枝段元底面半径就可以依据三角函数定理得到正六边形下底面每个顶点在三维坐标系中的位置,由枝段元的高度和半径衰减系数又能得到上底面六边形顶点坐标,也就是次级枝段元下底面六边形各顶点坐标。利用OpenGL图形绘制技术就能绘制出六边形棱台用以表示枝段元。表 1列出了六边形底面各点在三维坐标系的具体取值,图 4是六边形各坐标点的位置及对应纹理贴图的示意图。
坐标点 坐标值 次级坐标点 次级坐标值 Q1 (R·cos$ \frac{\pi }{3}$,0,R·sin$ \frac{\pi }{3}$) Q1′ (R′·cos$ \frac{\pi }{3}$,L,R′·sin$ \frac{\pi }{3}$) Q2 (-R·cos$ \frac{\pi }{3}$,0,R·sin$ \frac{\pi }{3}$) Q2′ (-R′·cos$ \frac{\pi }{3}$,L,R′·sin$ \frac{\pi }{3}$) Q3 (-R,0,0) Q3′ (-R′,L,0) Q4 (-R·cos$ \frac{\pi }{3}$,0,-R·sin$ \frac{\pi }{3}$) Q4′ (-R′·cos$ \frac{\pi }{3}$,L,-R′·sin$ \frac{\pi }{3}$) Q5 (R·cos$ \frac{\pi }{3}$,0,-R·sin$ \frac{\pi }{3}$) Q5′ (R′·cos$ \frac{\pi }{3}$,L,-R′·sin$ \frac{\pi }{3}$) Q6 (R,0,0) Q6′ (R′,L,0) Table 1. Value of each point
由于枝段存在弯折和偏转的特征,坐标点位置就要根据夹角和旋转角加以变更,具体变更公式见关系式(3)。各坐标点位置确定后即可通过OpenGL的纹理贴图函数glNormal3f(),glTexCoord2f(),glVertex3f()加以贴图渲染,基于以上操作即可得到带纹理效果的枝干,具体效果如图 5。
-
本研究用图片贴图的方法模拟树叶,素材取自自然界真实树叶的照片,格式选择24位图的bmp格式。为了提高树叶的真实感,需要将除叶片以外的图像像素全部消除或隐藏,所以这里采用了BMP透明处理技术,其方法原理是获取一张像素为2n×2n,格式为bmp的位图,将图片中所有需要透明处理的地方的Alpha值设置为0.0,不需要透明处理的地方的Alpha值设置为1.0,然后设置Alpha的测试通过条件为:“大于0则通过”。如一张背景为黑色的树叶照片,将像素为黑色的Alpha值设为0.0,除黑色以外的Alpha值设为1.0,绘制树叶纹理时使用OpenGL图库自带的glEnable(GL_ALPHA_TEST)和glAlphaFunc(GL_GREATER, 0)函数就可以使树叶完整的显示出来,从图 6可以看到经BMP透明技术处理后的树叶模型效果。
-
为了增加树木绘制的真实感,本研究还增加了光照和阴影效果。在OpenGL里光照模型是由光源、材质和光照环境决定的,通过设置光源位置(LightPosition),环境光(LightAmbient)和反射光(LightDiffuse)等属性值,共同作用来模拟现实光照效果。基于光照就可以绘制阴影效果,目前比较流行的阴影模拟方法是采用Shadow Maping算法,其生成阴影的原理为:shadow map将场景渲染2次,第1次是从灯光的角度(把相机放到灯光位置)渲染场景,然后存储渲染的深度信息到一张纹理上。第2次再从观察者的角度来渲染,在第2次渲染时才渲染阴影,对于每个图元的深度信息和第1次从灯光角度渲染的深度信息比较,如果当前深度值大于第1次渲染的深度值,则说明有物体在当前片元和灯光之间,那么当前片元在阴影区[13]。
2.1. 建立应用接口
2.2. 枝干可视化模拟
2.3. 树叶可视化模拟
2.4. 阴影绘制
-
为了增加树体建模的灵活性,本研究将树木模型参数做了可视化处理,即把涉及到树木形态结构的参数整合到一个参数控制面板上,这些参数总共包括了14项:树枝干深度系数(TreeDepth),枝干段元夹角(Angle),侧枝段元夹角(LateralAngle),沿上级枝的旋转角(Twist),与上级枝的夹角(SideAngle),枝干长度衰减系数(LenScale),枝干半径衰减系数(RadScale),侧枝深度衰减系数(SideScaleDepth),侧枝尺寸系数(SideScaleSize),树叶大小(LeafSize),树叶偏转角(LeafAngle),树影长度(TreeShadowLen),枝影密度(BranchShadowDen)和叶影密度(LeafShadowDen)。当改变其中一项参数后,树体的形态变化将实时显示在视图区。另外,还增加了贴图更换功能,当点击更换按钮后可通过选择文件夹里已有的贴图文件来更换模型外部特征,进一步增加了建模的灵活性。通过控制键盘前后左右按键和鼠标左右键实现上下左右旋转功能和前进后退功能,有利于更细致的观察。
-
树干建模的参数主要受枝干深度系数、枝干段元夹角、侧枝段元夹角、沿上级枝的旋转角、与上级枝的夹角、枝干长度衰减系数、枝干半径衰减系数、侧枝深度衰减系数、侧枝尺寸衰减系数等9项参数控制,参数不同生成的树木形态结构就不同,由此可以生成形态各异的三维树木。为了适应树木模型的多变性,添加了树皮更换功能。点击控制面板上的“树皮更改”按钮后(图 7A)弹出树皮选择窗口(如图 7B),选择所需树皮贴图,点击确认按键后即可生成用户所需的树皮样式。树皮更改后的树木模型如图 7C。
-
根据1.1节树木形态结构分析可知,单轴树会有一根明显的主干,围绕主干生成侧枝,主干和侧枝的长度、半径自底向上呈现缩减趋势,所以需设置长度和半径缩减系数。为了模拟现实中弯曲状态,通过设置枝段元夹角等参数即可实现,主要参数如表 2所示,效果如图 8所示,稍微调节其中一个参数就可改变相应树形态。但是需注意的是TreeDepth和SideScaleDepth的属性值不能同时设置到最大值,若设置过大,会引起枝干数量呈指数型增长,从而瞬间增加计算机显卡的计算量并占用大量内存而造成卡顿。
参数 参数值 取值范围 SetTreeDepth 23 1~25 SetAngle 10 0~90 SetLateralAngle 15 0~90 SetTwist 73 0~180 SetSideAngle 50 0~180 SetLenScale 0.95 0~1 SetRadScale 0.82 0~1 SetSideScaleDepth 0.75 0~1 SetSideScaleSize 0.83 0~1 Table 2. The parameter graph of a monoaxial tree
-
合轴树没有明显的主枝干,具有茂密的侧枝,整个植物冠状呈张开形态,所以只需根据上表的参数加以调整,利用分形迭代算法即可实现合轴树的效果,主要参数如表 3所示,效果如图 9所示。同样,这里只需调节其中一个参数就可改变相应树形态,TreeDepth和SideScaleDepth属性值不能同时设置到最大值。
参数 参数值 取值范围 SetTreeDepth 21 1~25 SetAngle 13 0~90 SetLateralAngle 10 0~90 SetTwist 79 0~180 SetSideAngle 34 0~180 SetLenScale 0.92 0~1 SetRadScale 0.73 0~1 SetSideScaleDepth 0.86 0~1 SetSideScaleSize 1 0~1 Table 3. The parameter graph of a multiway tree
-
对于构建好的枝干模型,根据树叶建模和可视化模拟,添加树叶后使得树木进一步增加了真实感,为了进一步增加建模的灵活性,本研究将树叶的大小和角度属性进行了交互式的设计,通过调节控制面板对应属性值即可自动调整树叶在枝干上的分布特征。另外,为了适应树模型的多变性,也添加了树叶更换功能,同树皮更改一样,点击控制面板上的“树叶更改”按钮后(图 10A)弹出树叶选择窗口(如图 10B),选择所需树叶贴图点击确认按键后即可生成用户所需的树叶样式。树叶更改后的树木模型如图 10C。
-
树的影子主要通过树影长度、枝影密度、叶影密度3项属性值加以控制。用户可以通过对以上属性参数调节来获得所需的阴影效果,数值越大树影长度越长,枝干和树叶影子越明显;数值越小树影长度越短,枝干和树叶影子越稀薄(图 11);当数值为0时无阴影效果。