1、本科毕业设计(20届)基于人工生命模型的虚拟植物生长动画初探所在学院专业班级计算机科学与技术学生姓名学号指导教师职称完成日期年月I【摘要】近些年来,我们开始了对自然景物的模拟,而且它也一直都是计算机图形学中很具挑战性的工作之一。植物是自然界最常见的景物之一,也是我们身边随处可见的景物,它种类繁多,千姿百态,而且具有自相似和不规则等特性,更是给研究者提出了很多的难题。模拟自然界植物生长,在教育、军事、农业、商业、3D平面设计等方面得到广泛应用。本论文首先描述了模拟自然植物的重要性,其次再对分形算法、L系统算法进行详细介绍,之后再结合程序本身,对OPENGL语言给予相关解释,最后对毕业设计程序进行
2、演示和功能讲解。【关键词】虚拟植物;虚拟树;分形;L系统;OPENGLII【ABSTRACT】INRECENTYEARS,WESTARTEDONTHESIMULATIONOFNATURALFEATURES,ANDITHASALWAYSBEENAVERYCHALLENGINGPROBLEMINCOMPUTERGRAPHICSPLANTSARETHEMOSTCOMMONFEATURESOFNATURE,ASWELLASCANBESEENEVERYWHEREAROUNDTHESCENE,ITOFFERVARIETY,ASWELLASIRREGULARANDSELFSIMILARNATUREOFTHE
3、IRSTRUCTURE,RESEARCHERSMADEANUMBEROFCHALLENGESNATURALPLANTGROWTHSIMULATION,INEDUCATION,MILITARY,AGRICULTURAL,COMMERCIAL,3DGRAPHICDESIGNHASBEENWIDELYAPPLIEDFIRSTOFALL,THISPAPERDESCRIBESTHEIMPORTANCEOFSIMULATEDNATURALPLANT,SECONDTOTHEFRACTALALGORITHM,LSYSTEMALGORITHMSAREDESCRIBEDINDETAIL,THIRDTOGIVEAN
4、EXPLANATIONTOOPENGLLANGUAGEINTEGRATIONPROCESSITSELF,PRESENTATIONANDFUNCTIONALITYTOEXPLAINTHELASTGRADUATIONPROGRAM【KEYWORD】VIRTUALPLANTS,THEVIRTUALTREE,FRACTAL,LSYSTEMS,OPENGLIII目录第一章课题的目的和意义111模拟植物(树)生长的重要性112研究植物生长在各个领域中的作用213真实树木生长研究314模拟树木生长进展4第二章建模核心方法521分形方法5211植物与分形5212分型算法实现622L系统建模方法723随机L系统
5、、上下文相关L系统、参数L系统8231随机L系统8232上下文相关L系统9233参数L系统12234参数字符串的海龟解释13第三章OPENGL1331OPENGL语言介绍1332OPENGL工作方式1433OPENGL绘制过程1534OPENGL相关函数及操作介绍(TREE程序中用到)15第四章软件运行效果2141设计过程21411学习L系统,绘制树木生长草图22412在C中实现二维树木分型图22413OPENGL编程绘图2342核心程序介绍MAINTREE2643程序流程图、运行说明2844功能展示29第五章结束语335感悟和体会33参考文献36致谢错误未定义书签。1第一章课题的目的和意义1
6、1模拟植物(树)生长的重要性近年来,越来越多的人开始关注自然景物的模拟,而且自然景物独特的性质也决定了模拟它是计算机图形学中非常具有挑战性的工作之一。人们也越来越关注对树木、流水、波浪的模拟,将他们作为自然景物模拟的重要内容。尤其是植物,尽管它非常常见,但其种类繁多,形状各异,千姿百态,以及它们结构具有不规则性和自相似性等性质,给从事相关工作的研究者提出了很多的难题。植物是大自然的一部分,它是自然界中最常见的景物之一,它对人类的生存和发展至关重要。目前为止,植物的模拟在自然景观模拟中占有很大的比重,可见其重要性。虚拟植物就是在计算机上模拟植物的连续生长过程,具体而言通过对现实世界中的植物形态结
7、构进行研究,然后建立起植物模型,再经过应用3D数字化技术,对植物生长形态结构以及生长过程中的一些参数进行连续、精确的测量,并对所测得的数据进行处理分析研究,从而归纳出植物的生长规则。依据植物的生长规则,利用科学可视化技术在计算机上建立虚拟植物模型,并实现动态生长。通过对植物的仿真模拟,可以方便我们更好的对周围的植物进行学习和研究。例如,对于很多中小学生可以通过观看模拟植物生长程序演示,对更多的植物生长动态过程有所了解;对于一些搞种植业的农民朋友,可以通过观看植物生长模拟,对植物的生长习性有更好的把握;对于一些农业方面的专家,可以通过软件,改变水、温度、湿度等参数,对植物生长得出不同的结论,从而
8、研究出更好的适合植物生长的环境、更利于植物吸收的肥料、更提升植物质量的基因等;对于研究植物生长的程序员本身,更是一种挑战,要不断的改进,把模拟变得更加真实,更加逼真。树更是我们日常生活中常见的植物之一。道路的两旁,小区的四周,学校的过道到处都能看到树。但是,作为生活中的我们,很少有人会去观察树木是如何生长的,而它的生长过程又是怎样的。因此,这次毕业设计选题,选择模拟树木生长,我觉得意义重大,是一个很大的挑战。212研究植物生长在各个领域中的作用研究植物生长在各个领域都有广泛的应用。通过应用虚拟植物模型,可以非常方便的对植物、园林、森林等复杂的生态系统进行直观地观察研究,可以不用长时间的等待,发
9、现以前的一般研究方法和技术手段很难观察到的规律。虚拟植物(如农作物)运用生长技术进行虚拟实验在一些虚拟农田系统中,可以缩短某些研究课题的试验时间并且节省大量的试验费用,替代部分在现实世界中不易进行或费时、费力、昂贵的试验。通过虚拟技术可以进行虚拟育种、虚拟剪枝、虚拟施肥等操作;利用模型建立虚拟农场,通过计算机学习可以使学生和农民学习到农作物生长过程和农田管理知识,这样比通过带农民与学生参观农场效果更加明显。在农作物科技成果推广中,通过这种虚拟技术,可以使农民更易理解和掌握先进的农田管理技术;虚拟作物研究获得作物生长过程中的各参数的动态数据,可以改变作物生长中定量化难的局面,为精确农业提供依据。
10、虚拟植物(景观植物)生长技术在园林环境系统中进行虚拟实验,可以进行果树修剪,方便园林的设计,提高植物移植后的存活率,帮助不同植物习性的相匹配,从而设计出来的园林,不仅让人赏心悦目,更是让植物生长的更加舒适。虚拟树木生长技术在现实生活中进行虚拟实验,可以帮助我们更好的了解树木的结构、树木生长的过程,让我们更加贴近树木、贴近自然。从1960年开始,研究人员创建了植物生长模型,并运用人工智能、数理统计等方法,研究植物生长过程,从而定量化研究植物的生长规律。由于植物本身结构及其动态生长过程都极为复杂,这类模型对一般的植物形态结构对植物生长的影响方面进行简化。1968年,美国学者ALINDENMAYER
11、提出了L系统并把它作为植物形态模拟的一般框架。1980年,大型农业专家植物系统开始出现,它是建立在作物模型基础上,并在农业生产领域中得到了广泛的应用。随着研究的继续深入,学者们并不局限于简单的形态结构研究,而是将其余生理生态模型相结合,更准确地模拟植物的生长过程。把二者相结合,引导着虚拟植物发展的趋势。1990年起,三维可视化技术被研究人员用于虚拟植物的研究。以模糊系统、遗传算法、人工神经网络为代表的人工智能方法在该领域的不断应用,使得虚拟植物的研究得到进一步的发展。树木可视化软件目前也是非常受关注的。树木可视化软件可分为2类纯图形学软件和基于结构功能模型的软件。这些软件只要应用于教育、园林、
12、农业、娱乐、商业、计算机辅助景观设计、科研和林业生产等方面;但这款软件在树木逼真度、生长数据采集准确度、模型结构功能构建上以及可视化技术的运用上还需要继续改进、突破。因此仍需不断地对树木进行学习,研究。313真实树木生长研究寝室楼下的树的一些拍摄图11香樟树图12雪松图13红叶李图14夹竹桃4图14含笑图15紫荆树木生长,不是我们想象中的简单的种植树木,而是一个系统的、动态的操作过程。树木要能存活能生长,首先必须了解树种的生长习性以及对栽植地区生态环境的适应能力。其次再通过改变一些条件,让环境更好地适应树木生长。尤其要注意树对光照适应性。还要注意地下水位的控制,在适树适栽的原则中具有重要地位。
13、地下水位过高,是影响树木栽植成活率的主要因素。树木生长受环境影响,包括温度、光照、水分、土壤、空气、周围生物等物理环境因素。树木的生长发育除了会受自身的遗传特性影响外,还受制于环境条件的现状及变化趋势。树木多年生、占地空间大的生长特点,决定其与环境条件间的关系非常复杂。一方面,环境因素直接影响树木生长发育的进程和质量;另一方面,树木在自身发育过程中,会不断地与周围环境进行物质交换,如吸收CO2、放出O2,进行能量转换,吸收无机物质、合成有机物质等,对环境条件的变化也会产生各种不同的反应。14模拟树木生长进展从1965年开始,研究人员就开始了树木生长的模拟研究从而得出定量化研究树木的生长规律。所
14、建立的模型通过对树木生理生态过程的模拟,能够预测不同环境条件下生长的树木的某些综合指标,如产量、生物量,叶面积指数动态,数量等,而在树木形态结构和环境因素细微的对树木生长的影响等方面进行了简化处理。5近年来,模拟树木已成为教育业、植物学、农林业、娱乐业和计算机虚拟技术领域的研究热点。其核心内容是生长模型和可视化技术。无论建模还是将可视化运用于植物模拟,都对真正意义上的模拟树木起到至关重要的作用。虚拟树木生长模型也有很多,主要包括形态结构模型、功能模型和结构功能模型等,其中结构功能模型还可以模拟树木与周围环境间的相互关系,它最为接近现实树木的生长。所以我们可以预见结构功能模型也将会是虚拟树木生长
15、模型的发展方向。目前模拟树木生长的难点主要是树木形态结构的复杂性与计算时间和空间的矛盾。树木可视化还有不同于其他物体的特性,如多级分枝、自相似、枝条的弯曲、向光性、树木分枝间的光滑与非光滑连接等。但随着科技的进步和研究的深入,这些难题都在逐个逐个被解决。虚拟树木模型在未来的研究中,仍然会在植物学、农学、生态学、数学、计算机图形学等传统领域不断被更新、完善。从一般植物模型到虚拟树模型,我们可以得出虚拟树木模型的参数较复杂、对计算机性能要求较高,在未来的发展中,会对空间分辨率、树木形态结构表现上要求越来越高。再往其他方面看,虚拟树木还会在精确农业、生态系统物能流空间规律研究、生物基因拓展、植物生长
16、状况遥感监测等众多领域具有广阔的应用前景。第二章建模核心方法21分形方法所谓分形,就是只要一个有限的曲线和一个无限分形在主要性质上十分相近,这个曲线就可以近似地看作分形。211植物与分形在植物模型中,这种特性称为自相似。在几何学中,很早就开始用近似图形来解释抽象的概念。正如植物就需要抽象化,把它看成分形图形,也就是说,把分形作为真实结构的一个抽象描述。MANDELBROT曾说,树从某种角度讲可以被称为分形,曲线的算法和树形分支结构的算法之间还是具有相似性的。分形即是真实植物结构的一个简化的、抽象的代表。那么,我们为什么要关心这些问题呢在对真实植物结构进行分析和建模的过程,分形的6概念真的提供了
17、帮助吗在概念层次上,植物结构分析的分形方法的特性强调自相似,它为理解看似复杂的复合结构提供了一种方法,并提供了递归法发育机制,通过这个机制就可以生成这些复合结构。生物结构的相似性和物理中的对称性的含义是类似的。对称性一般被定义为元素结构在一系列自同构变换后的不变形。一般都认为变换是全等的,这样的变换可以通过旋转、反射和平移变换复合,那么也同样可以把这一系列的变换延伸到相似,并把自相似作为对称性的一个特例。212分型算法实现平面迭代函数系统是最基础的模拟植物的分型算法,他近似于带参数的L系统,但比它要简单很多。迭代函数系统FS既采用确定性算法也采用随机性算法,并将两者相结合生成植物的分形图。所谓
18、确定性是指用于迭代的规则是确定的,由一组仿射变换(A1,1A2,A3等)构成;随机性指迭代过程是不确定的,也就是说每一次究竟迭代哪一个规则是随机性的设最终要生成的图形为B,它满足集合方程;BA1A2AN。上式的含义是,随机地从AII1,N中挑选一个迭代规则迭代一次,然后再随机地在AII1,N中挑选一个迭代一次,不断重复此过程,最后生成的图形B就是要求的植物形态图。图21迭代流程图722L系统建模方法L系统着重以表达植物形态变化增长的系统,是分形系统领域诸多研究方法的重点之一。它由美国生物学家ARISTIDLINDENMAYER于1968年提出,后由SMITH为模拟植物而将其引入计算机图形学。L
19、一系统侧重于植物拓扑结构的表达,它试图用抽象出来的规则描述植物的形态及生长规律。LSYSTEM的核心思想是字符串替换。字符串会按照一定的规律来排布字符集合。一般情况下,这些字符串使用大写字母书写,它可以包含数字、短语、字母或标点符号。字符串替换被定义为根据一组改写规则或产生式,用替换的形式画出整个物体,即给出初始物体即一条字符串,然后按照产生式规定的替换规则去替换初始符串中的每一个字符。替换次数可以是无限的,可得到无限推导序列。同时我们也可以嵌套的来表示产生式,例如一种嵌套形式A一AB。后件AB代替前件A后新式子AB中又会产生新的A,而A又可以通过规则A一AB,从而得到无限推到序列。通过理解了
20、产生式之后,就可以很容易的理解产生式系统了。产生式系统是由若干个产生式构成的一组语句,并且各个产生式之间可以相互替换字符串。举个例子A一BF,B一FA,一开始是字符串是A,通过迭代规则迭代1次,得到字符串FAF,迭代2次FFAFF,3次FFFAFFF,。这里迭代一次表示的是用产生式系统中的所有产生式规则都来替换当前的字符串。如果要将龟形图用于计算机绘图,首先,计算机绘图也是要确定起始状态,一个起始点和开始画线的方向,当画图进行到任意一个阶段的时候,可以用X,Y,A这三个量来确定任意一个画图的状态,即当前的坐标(X,Y)和方向角A。我们需要考虑状态之间的转换方式。可以通过平移、旋转方向(A)、辅
21、助动作等多种方式来实现。最后再用一些符号来定义这些动作如何执行。F前进一步,在当前的位置画一条长为单位L的直线段。单位L是由用户自己设定的值,可以根据具体情况任意改变;逆时针方向旋转一个角度,角度由用户自己设定,可以根据具体情况任意改变;一顺时针方向旋转一个角度,角度由用户自己设定,可以根据具体情况任意改变;进栈,保存当前的位置状态出栈,取出当前的位置状态。注意出现的同时也要出现,即要成对出现。字符串替换通过字符串的迭代替换来实现分形树木图形。我们以一种普通的树木的L系统为例此L系统的表达式为LG,W,P10。G代表字符集,这里GF,一,;W8代表起始符号元,是用来确定字符串的起始状态,WG,
22、W是G上所有非空的子集。在这里WF;P代表此树的生成规则,也就是替换方式即产生式的有限集合,产生式可以写成AX,字母A和字母X分别是这个产生式的前驱和后继。规定任一字母AV,有且至少存在一个非空字母X,使得AX。若前驱AV没有明确给出的产生式,那么就规定AA是一个特殊的产生式并且属于P。每个AV,当且仅当只有一个字母X,使AX。根据这个原理,按照规定的重写规则,并且用参数控制,就可以模拟植物的生长过程以及各种植物的不同形态。在这里,PFFFFFFFFF这个公式是深度N2的转换迭代式。若深度3,改变替换法则P,在深度2中的F用FFFFFFFF代替,那么FF则变成FFFFFFFFFFFFFFFF,
23、后面的F也进行转换,就可以得到由L系统算法得到的深度为3的字符串如图25。这样生成的树都是同一个角度生长,且毫无变化。我们可以对此加以改进为每次迭代生成字符赋上不同的参数图2223随机L系统、上下文相关L系统、参数L系统231随机L系统由同一确定性L系统产生的所有树木具有相同的形态,尝试着把这些树木形态组合在同一张图中,将产生一个明显的、人工的规律性。为了避免这种效果,有必要引进同一树木种内样本和样本之间的变化,即保持同种植物的一般形态,但要修改每一个样本的细节。一个随机的OL系统式一个有序的四元祖G。其中,V是字母表;是起始字符串;P是与OL系统中定义相同产生式的集合;函数P0,1称为概率分
24、布,是产生式集合到产生式概率集合(即每个产生式被应用的概率)的映射。假设对任意的V,以为前驱的9产生式(可以是多个)被应用的概率之和为1。如果对一个字符串中的字母的每一种出现的情况,应用以为前驱的产生式P的概率等于(P),则V称为在G中随机推出。这样同一个前驱的不同长生是在同一步推导中可用于同一个字母出现的不同情况。随机L系统的一个简单例子如下F0331FFFFFF0332FFFF0333FFFF推到符号上方的数字表示该产生式被应用的概率,这里每一个产生式都可以大约相同的概率1/3被选择,由这个L系统经5步推到产生的分支结构如图所示。注意到这些结构看起来像是(虽然有些假想的)同一个种的树产生不
25、同的标本。图23232上下文相关L系统字符串L系统中的上下文OL系统中产生式是上下文无关的,也就是在应用中不考虑前驱出现的上下文关系。然而产生式的应用也可能与前驱的上下文相关,这种(上下文相关的)效果对模拟植物各部分之间相互作用是有效的传播。在过去,人们已经提出了各种上下文相关的L系统,并对他们进行了一些深入的研究。2L系统应用产生式的形式为LR,这里的字母能够产生字符串,当且仅当字母的前面是L,后面是R时,其中,L和R在这个产生式中组成字母的左和右10的上下文。1L系统的产生式只有一侧的上下文,因而它的形式不是L就是R。OL系统、1L系统和2L系统称为广义的IL系统,也称为(K,L)系统。在
26、(K,L)系统中,左边上下文是一个长度为K的字符串,而右边上下文是一个长度为L的字符串。为了保持L系统简短规范,可以修正通用的IL系统概念,即在一个系统中允许上下文长度不同的产生式共存。此外,在同一个严格的前驱中假设上下文相关的产生式优先于上下文无关的产生式。因而如果上下文无关和上下文相关的产生式两者都应用于一个给定的字母,则选择上下文相关的产生式;如果没有产生式应用,则这个字母将和前面L系统中假设的一样由其本身来替换。信号传播下面的1L系统是在一串字符中利用(信号)上下文模拟信号传播的例子。B1BGHMABCDESGHIJKLMNO图24带括号的L系统的上下文介绍比没有比没有括号的L系统的情
27、形困难得多,这是因为括号里表示轴向树的字符串不能作为邻节(轴向树)进行保存,因而与程序相匹配的上下文需要跳过表示分支或分支部分的符号。例如,上图中表示前驱是BCGHM的产生式就可以应用在下面字符串中的符号SABCDESGHIJKLMNO它包括对左边上下文的搜索跳过符号DE,对右边上下文的搜索跳过符号IJKL。在带括号的L系统的形式中,左侧上下文可以用来模拟控制信号的向顶传播,也就是从树根部或基生叶向模拟植物的顶点传播,同时右侧上下文代表信号向低传播,也就是从顶点向根部传播。例如,下面1L系统模拟了再不生长的分支结构中向顶信号的传播过程IGNOREFBFAFAFAFAFAFA1FB0,海龟的位置
28、变为(X,Y,Z),其中,XXHX,YYHY,ZZHZ,在点(X,Y,Z)和点(X,Y,Z)之间画线段。F向前移动一个步长0,不画线。绕U转动一个角度,若为正则向左转,如果为负的则向右转。/结构描述的像素格式的绘图图面。PIXELDESCNSIZESIZEOFPIXELFORMATDESCRIPTOR/结构长度PIXELDESCNVERSION1/结构版本PIXELDESCDWFLAGSPFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER|PFD_TYPE_RGBA/告知OPENGL如何处理像素应用程序写绘制结果到屏幕/支持OPENGL函
29、数/双缓存/采用RGBA颜色格式PIXELDESCIPIXELTYPEPFD_TYPE_RGBA/指定像素数据的类型。以下类型的定义。17渲染描述表及渲染OPENGL渲染描述表保存着在窗口中用来渲染一个场景所需要的信息。同时所编写的代码,要通过代码才能实现图形的绘制显示。在3DTREEDLGCPP文件中,同时也对渲染描述表进行了设置,接下来我们来看一下代码BOOLCMY3DTREEDLGCREATEVIEWGLCONTEXTHDCHDC/HRENDERRCWGLCREATECONTEXTHDC/创建一个与给定的DC兼容的渲染描述表,调用成功返回渲染描述表句柄,不成功返回NULLIFHRENDE
30、RRCNULLRETURNFALSEIFWGLMAKECURRENTHDC,HRENDERRCFALSE/渲染描述表非当前化RETURNFALSERETURNTRUE/渲染描述表当前化VOIDCMY3DTREEDLGRENDERSCENE/渲染OPENGL建立视场和程序框架,TREE程序创建过程18图32图3319图34点、线的绘画OPENGL通过是通过将物体抽象为卡迪尔坐标系下点、线段、多边形等多种形状的集合,再将点、线段、多边形等通过在函数GLBEGIN与GLEND之间的一系列顶点数据,绘制出图形还原物体。在TREE程序中,就有多个函数GLBEGIN与GLEND。如LANDCPP中土地的绘
31、制,还包括贴图的位置设定。GLBEGINGL_QUADS/开始绘图GLNORMAL3F00F,10F,00F/设置当前向量。GLTEXCOORD2F00F,00F/这些函数设置的当前的纹理坐标。GLVERTEX3FSIZE,00F,SIZE/设置顶点坐标GLTEXCOORD2F00F,80FGLVERTEX3FSIZE,00F,SIZEGLTEXCOORD2F80F,80FGLVERTEX3FSIZE,00F,SIZEGLTEXCOORD2F80F,00FGLVERTEX3FSIZE,00F,SIZEGLEND/界定完毕图形的变换假设计算机屏幕的分辨率为1024512,如下图所示20图35OP
32、ENGL将图形显示在屏幕上要经过多个变换过程,但主要是经过透视投影变换、视区变换、剪切变换,以及几何变换四个过程。透视投影变换包括平行投影和透视投影。几何变换包括平移变换、旋转变换、缩放变换。TREE程序中主要用到透视投影变换和几何变换透视投影变换在TREEDLGCPP中,在初始化对话框和重新设置时都有应用到透视投影,代码如下GLUPERSPECTIVE450F,FLOATRECTWIDTH/FLOATRECTHEIGHT,01F,1000F/函数设置一个透视投影。上下展开的视角,左右展开的区域。宽/高的比例,近边界,远边界几何变换中的平移变换即物体是相对原点定义与绘制的,所以移动坐标原点就相
33、当于与物体的平移运动。在TREEDLGCPP、GHGLCPP、MAINTREECPP等文档中都有用到GLTRANSLATEFTRANSLATEX,TRANSLATEY,TRANSLATEZ/由原点移到X,Y,Z的位置几何变换中的旋转变换是物体所在的坐标系发生旋转变换,因为物体相对于坐标系位置固定有坐标定义的顶点位置固定,所以坐标系的变化将直接导致物体的变化。(注意,物体不是在坐标原点,所以不是简单的旋转。)在TREEDLGCPP、LEAFCPP、MAINTREECPP等文档中都有用到GLROTATEFROTATEY,10F,00F,00F/旋转角度,绕着(X,Y,Z)射线逆时针旋转ROTATE
34、YGLROTATEFROTATEX,00F,10F,00F矩阵操作OPENGL进行图形运算离不开矩阵变换。GLLOADIDENTITY/用一个单位矩阵初始化当前矩阵。GLMATRIXMODEGL_PROJECTION/定义操作矩阵类型为透视矩阵矩阵堆栈操作,就是保持当前的坐标系状态,将当前的坐标系压入矩阵对战而后进行程序的各种变换,当变换完成时,弹出矩阵对战中的矩阵,回复保存的坐标系状态。GLPUSHMATRIX/当前矩阵压入矩阵堆栈21GLPOPMATRIX/弹出矩阵堆栈中的矩阵图像位图操作OPENGL通过对像素颜色的直接操作,并完成图像的位图操作,从而完成绘制。GLTEXPARAMETER
35、IGL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR/控制纹理函数一个像素纹理点对应多个物体顶点的纹理控制GLTEXPARAMETERIGL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR/控制纹理函数多个像素纹理点对应一个物体顶点的纹理控制GLTEXIMAGE2DGL_TEXTURE_2D,0,3,IMAGESIZEX,IMAGESIZEY,0,GL_RGB,GL_UNSIGNED_BYTE,IMAGEDATA/定义二维纹理GLTEXIMAGE2DGL_TEXTURE_2D,0,3,IMAGESIZEX,IMAGE
36、SIZEY,0,GL_RGB,GL_UNSIGNED_BYTE,IMAGEDATA/定义二维纹理/2D纹理,只有一种分辨率,纹理分量选择三色分量,纹理宽度,纹理高度,纹理的边界宽度0边界为,读取图像的定义的FORMAT,读取图像定义的TYPE,存储图像的数据地址指针。第四章软件运行效果41设计过程1、观察真实世界树木生长,通过网上搜集资料、书籍借阅,对树木生长的大致过程有所了解,并且绘制出纸质树木生长图。2、研究树木生长原理,学习树木基本结构生长的L系统模型,通过原理学习,绘制出二维树木生长过程3、采用OPENGL编程算法为主,创建三维树木,并模拟树木的生长过程。通过算法编程,最终可以实现一棵
37、树的动态生长过程,并设计了随机变化参量,让树的生长更具有逼真性,而不是简单的自相似生长。4、最后对程序在加以改进,增加了控制面板,添加了其他功能,是程序更加丰富。22411学习L系统,绘制树木生长草图图41412在C中实现二维树木分型图TREENODEH主要完成树木分枝生长,具体代码如下INCLUDECLASSTREENODEPUBLICTREENODEDOUBLEYYXCOS31415926ALPHA/180DISXXXYSIN31415926ALPHA/180DISYYYTREENODEVIRTUALVOIDRENDERCDCPDCPDCMOVETOX,YPDCLINETOXX,YY23P
38、UBLICDOUBLEXDOUBLEYDOUBLEXXDOUBLEYYVIEWCPP用来观看树分形生长,可以调整N的值,来看到不同分支的树INTN1CFXTVIEWCFXTVIEWX100Y400ALPHA90TREENEWTREE1,X,Y,10,ALPHA图42413OPENGL编程绘图1、尝试着学习OPENGL,并在里面绘制图形,先从树干开始画起在OPENGL中绘制三维图形与二维图形的方法是显然不同的,树枝是立体了,而不是简单的直线,而且在TREE程序中,树干和树枝是分开来画的。这样可以更好的控制树的生长。在OPENGL中,我们需要话圆柱在实现树枝的生长,同时树枝要生长就要用到很多参数,
39、如树的底部半径,顶部半径,树干的长度,左边树枝的生长,右半边树枝的生长等等CLASSBRANCH24PUBLICBRANCHINTDEPTH,FLOATLENGTH,FLOATTWIST,FLOATEXPAND,FLOATRADIUS,INTSLICES,CHARBMPPATH/构造函数BRANCH/析构函数VOIDSETDEPTHINTDEPTH/设置树枝的深度VOIDSETSLICESINTSLICES/设置树干的面数VOIDSETRADIUSFLOATRADIUS/设置树干的半径VOIDSETLENGTHFLOATLENGTH/设置树干的长度VOIDSETTWISTFLOATTWIST/
40、设置树干生长的角度XVOIDSETEXPANDFLOATEXPAND/设置树干生长的角度YVOIDSETTEXTURECHARBMPPATH/设置树干纹理2、为树木添加树叶树叶是位于树枝的顶端,设置一个IF条件,判断是否位于树枝顶端,然后再添加树叶纹理LEAFLEAFFLOATSIZE,FLOATTWIST,FLOATEXPAND,CHARBMPPATHTHISSIZESIZETHISTWISTTWISTTHISEXPANDEXPAND10THISVISIBLETRUETHISSHAKEBLEFALSECHGLLOADTEXTUREBMPPATH,3、完善树生长其他功能1添加树生长的土地LAN
41、DCPP,主要也是通过纹理贴图实现CLASSLANDPUBLICLANDFLOATSIZE,CHARBMPPATH/LAND构造函数LANDVOIDDRAWVOIDSETSIZEFLOATSIZEVOIDSETTEXTURECHARBMPPATH25VOIDSETVISIBLEBOOLVISIBLEFLOATGETSIZEBOOLGETVISIBLEUNSIGNEDINTGETTEXTUREPRIVATEFLOATSIZEUNSIGNEDINTTEXTURE/土地的纹理。BOOLVISIBLE2、控件的添加,在我的毕业设计中,有很多控件,这些控件主要包含在CONTROLDIALOGCPP、IN
42、FODLGCPP、TREEDLGCPP。分别起到提示用户如何观察树木生长、修改树木相关参数、摇摆树叶等一些作用。3、环境设置环境的设置包括光线材质的反应。主要包含在ENVIROMENTCPP的文件中。主要有漫反射、光颜色等条件的设置,是树木生长更加接近自然条件。4、功能创新添加,树枝生长添加随机角度不添加此功能,树木生长是按照规则生长的,自相似的生长,所有的树枝生长的角度都是一样的,看上去的树很死板,没有生机。于是我在原本的函数中,添加随机变量参数RAND,使每个枝干的生长角度不一样,看上去更显生机。LEFTBRANCHNEWBRANCHMAXBRANCHDEPTH,MAXBRANCHLENG
43、TH,60RAND20,25RAND5,BASEBRANCHRADIUS,6,“BARKBMP“/深,长,角度X,角度Y,树干半径,树面数RIGHTBRANCHNEWBRANCHMAXBRANCHDEPTH,MAXBRANCHLENGTH,70RAND20,15RAND5,BASEBRANCHRADIUS,6,“BARKBMP“上面可以看到左树枝60RAND20,25RAND5,右树枝70RAND20,15RAND5,这些参数的设置,使得生长角度随机生成,每个树枝生长的角度都是不一样的。5、生成树林中,修改参数,使得生长出来的树大小不一一开始编辑树林时,调用随机生成树函数,所有出来的树大小都是
44、一样的。但是通过修改程序,添加随机生长变量,可以使得生长出来的树大小不一。有些树由于过小,连叶子也还没有。VOIDMYTREERANDOMGENERATE/随机生长THISMAXBRANCHDEPTH5RAND426THISMAXBRANCHLENGTH06FRAND6/100FTHISBASEBRANCHRADIUS01FTHISMAXBASELENGTHMAXBRANCHLENGTH3THISLEAFSIZE01FLEFTBRANCHSETTWIST60RAND20LEFTBRANCHSETEXPAND25RAND5RIGHTBRANCHSETTWIST60RAND20RIGHTBRANC
45、HSETEXPAND25RAND5IFMAXBRANCHLENGTHSETVISIBLEFALSE通过参数传递随机变量,从而成长出来的每棵树都是不一样的,都有自己的个性。42核心程序介绍MAINTREEMAINTREE是整个毕业设计的核心程序,控制树的生长的全过程。在MAINTREE的头文件中,我们就可以看到树木生长所要用到的诸多函数,如画树干,画树枝,画树叶、设置环境、设置地面等等。INCLUDE“ENVIROMENTH“INCLUDE“BRANCHH“INCLUDE“LEAFH“CLASSMAINTREEPUBLICMAINTREEMAINTREEINTMAXBRANCHDEPTH,FLO
46、ATMAXBRANCHLENGTH,FLOATBASEBRANCHRADIUS,FLOATTWIST,FLOATEXPAND,INTSLICES,FLOATLEAFSIZEMAINTREEVOIDRANDOMGENERATE/随机生长VOIDDRAW/画树VOIDSHOWGROWPROCESS/显示生长VOIDREBUILD/重建VOIDDRAWBASEVOIDDRAWBRANCHESINTSTACKS,FLOATRADIUS,FLOATLENGTH,FLOATTWIST/画树枝27VOIDDRAWRBRANCHFLOATBASERADIUS,FLOATTOPRADIUS,FLOATLENGT
47、H,INTDEPTH,INTTWIST/画右边的树枝VOIDDRAWLBRANCHFLOATBASERADIUS,FLOATTOPRADIUS,FLOATLENGTH,INTDEPTH,INTTWIST/画左边的树枝VOIDSETMAXBRANCHDEPTHINTDEPTH/设置最大的树枝深度VOIDSETMAXBRANCHLENGTHFLOATLENGTHVOIDSETMAXBASELENGTHFLOATLENGTHVOIDSETBASEBRANCHRADIUSFLOATRADIUSVOIDSETLEFTBRANCHTWISTFLOATTWIST/设置左边的树枝生长的X方向VOIDSETLE
48、FTBRANCHEXPANDFLOATEXPAND/设置左边的树枝生长的Y方向VOIDSETRIGHTBRANCHTWISTFLOATTWISTVOIDSETRIGHTBRANCHEXPANDFLOATEXPANDVOIDSETBRANCHSLICESINTSLICES/设置树枝面数VOIDSETLEAFSIZEFLOATSIZE/设置树叶大小VOIDSETLEAFVISIBLEBOOLVISIBLE/设置树叶可见VOIDSETLEAFCHANGEBOOLCHANGE/设置树叶变换VOIDSETLEAFSHAKEBLEBOOLSHAKEBLE/设置树叶摇动VOIDPAUSEGROW/停止生长V
49、OIDPLAYGROW/开始生长INTGETMAXBRANCHDEPTH/得到树枝的最大深度ENDIF2843程序流程图、运行说明图4329在OPENGL中,将编辑完的程序进行编辑就可以运行了。图44点击绿色运行按钮。44功能展示运行成功后,进入页面后就会有一个INFO对话框提示,可以通过INFO对话,明确一些键盘对程序的控制图4530图46主界面在屏幕的右边,可以看到控制版面,通过调节最大深度,树干长度,最大树枝长度、枝干面数、最大枝干半径、树叶大小、水平夹角、垂直夹角来改变树的外形图47控制面板31图49点击生成树林图410点击去除叶子32图411改变光照效果图412改变纹理贴图效果33第五章结束语5感悟和体会几个月下来作品总算完成了,从一开始很么都不懂,思绪完全没有,到一步步自己慢慢看着书,一点一点学习3DMAX软件,一点一点学习OPENGL软件,一点点从门外跨入门内,从完全不懂到一点点理解掌握,尽管中间遇到很多坎坷挫折,但最终还是都克服了。可能