张 杰, 蔡文奇
(汕头大学计算机科学系,广东 汕头 515063)
自然界的植物千资百态、种类繁多,貌似无章可循,无法用传统的欧式几何进行描述。而分形算法的出现,将这些看似毫无规律的植物的描述和模拟变成可能。植物的模拟是计算机图形学的热点和前沿课题之一,深深地吸引着研究者的眼球。国内外有不少研究者运用经典的分形算法或分形算法的改进算法,借助C++、java等语言提出了二维或三维植物的建模方法。如:Lindenmayar于1968年提出的L系统奠定了树木模拟的基础[1],Prusinkiewicz等[2-4]于1988~1996年间提出了基于L系统的树木生长模拟系统;国内比较有代表性的成果有赵星等于 2001年提出的双尺度自动机模型,反映了枝条动态弯曲过程的力学原理[5],并于2003年进一步对花序进行模拟研究,模拟了有限花序和无限花序以及开花的顺序[6];张树兵等于2002年提出了基于L系统的植物建模的改进,将系统代码转换成简单的递归表达式结构,但生成的植物单一,没有参数化[7];张帆等于2003年提出了基于VRML的简化L系统算法[8],但生成的树没有交互性,也未提出叶序和叶子的生成算法。
模拟植物的主要分形方法有:文法构图算法(L系统)、迭代函数系统算法(IFS算法)、分形演化算法(DLA模型)[9]。经研究,单纯用其中一种算法来对植物建模,不但在编程实现方面比较繁锁,而且缺乏与用户的交互性。本文一方面采用L系统与递归算法相结合的方法,可以方便地编程实现植物的建模,另一方面 , X3D结合JAVA来实现建模,满足了用户的交互性的要求。除此之外,本文提出了基于树的生理结构的建模,包括,分枝结构、叶序、树叶。
X3D(Extensible 3D)由Web3D联盟提出,并于2004年正式通过ISO/IEC审议成为网络三维国际通用标准ISO/IEC19775。它被定义为可交互操作、可扩展、跨平台的网络3D内容标准,其前身是VRML97。X3D除了有VRML97的全部功能外,还整合了XML、JavaScript、Java和流媒体技术等先进技术,拥有更强大、更高效的3D计算能力、渲染质量和传输速度[10]。
1.1.1 轴结构
树枝是构成树的基本骨架,它的长短及空间排列对树的形状起着支配作用,不同的树有不同的分枝形式,主要有以下两种轴结构:
1) 合轴分枝,如图1(a)所示,即顶芽生长到一定程度后就停止生长或生长速度变慢,这时侧芽将超过顶芽的生长速度,逐渐长成很大的侧枝,常见的合轴分枝树有:梧桐、桑树等;
2) 单轴分枝,如图1(b)所示,即树木有明显的主干。主干是由顶芽不断向上生长形成的,各级分枝的生长都不超过主干,常见的单轴分枝树有:松树、杨树等。1.1.2 叶序
图1 树的分支结构
叶在树枝上的排列方式称为叶序。不同的植物有不同的叶序,主要分为:
1) 互生,如图2(a)所示,即在树枝的每个节点上交互生长出一片树叶,叶在树枝上呈螺旋状分布,如:向日葵;
2) 对生,如图2(b)所示,即树枝的每个节点上相对地生长出两片树叶并排列于茎的两侧,如:石竹;
3) 轮生,如图2(c)所示,即树枝上的每个节点上生长出3片或3片以上的叶子,也称轮状。如:夹竹桃;
4) 簇生,如图2(d)所示,即两片或两片以上的叶子生在节间极度缩短的树枝上,如马尾松、银杏等。
图2 叶序
L系统描述的是植物生长的数学模型,核心概念是重写,重写是通过应用一个重写规则或产生式的集合,对简单的初始目标中的部分进行连续置换来定义复杂目标的技术[11]。一个L系统可以表示为一个有序三元组G=
F代表初始元,“[]”表示按要求对初始元执行偏移操作,“+”表示向左偏转,“-”表示向右偏转“{}”表示将其内部作为一个整体执行上移操作。用此文法构造二叉树的过程如图3所示。
图3 分形树的生成过程(n=4)
仔细分析用L系统生成分形树的过程,不难发现这其实是一个递归过程[11]。本文将参数L系统和此递归过程相结合,提取出如式(1)所示的数学模型,h(0)为初始元,函数f(i)、g(i)为生成规则(i为整数且0≤i<n,n为设定的树的深度),i为参数,也为生成元,在每一次的递归过程中生成元i都是不同的,根据不同的参数i,就会有相应不同的生成规则P。如当参数i=1时,则生成元i=h(i- 1),生成规则为f(i);当1
树的数学模型的递归过程如式(2)所示
将上述二维的L系统扩展为三维的L系统,三维仿射是一个关键的因素。
定义:L代表原三维图形,L′代表经过三维仿射W后得到的新图形,则仿射W可表示为
上式可简化为W:L′ =L·A+T,可通过改变三维矩阵A、T即可实现对三维图形的旋转、平移、按比例缩放等操作,如
分别表示原图形L绕X轴、Y轴、Z轴旋转一定弧度α;
· 若T= (0,h,0 )T,则表示L沿Y轴方向平移h。
在以上理论中,需用链表结构来表示二叉树,这样编程实现的效率较低。本文用 X3D结合JAVA的方式实现建模,大大简化了程序的复杂度,同时也满足了用户实时性和交互性的要求。一方面 X3D中定义了很多几何图形节点和材质等域,利用这些节点和域就可以简单快捷地生成三维的初始元图形;另一方面,为了节约内存等开销,降低编程的繁琐度,使用户可随机地生成想要的图形,本文用JAVA来实现用递归结构来代替链表结构。
用n(n>0)表示树的层数,以控制整个程序的递归次数;用t(t>0)表示t叉树,即一个主干上有t个分枝;用b(b
1)T是由Cylinder节点定义的一个半径为r[j],高度为h[j]的圆柱体并沿Y移动-h[j]/2,r[j]、h[j](0 ≤j 2) 定义Tmax+=T[a](0 ≤a 3) 如果j= 0(0 ≤j 4) 如果j=1,则使G[0]绕Y轴旋转一定弧度6.282 (a+1)/m,并沿Y轴平移 -h[j]·(a+ 1)·ts/m,记为T1[a],重写Tmax,并命Tmax+=T1[a];对L=g[ 0]+Tmax+T沿Y轴平移h[j],然后绕X轴旋转一定弧度wt,得到的结果记为g[1]; 5) 如果j=n-1,定义stbe+=tbe[i](0≤i 否则将g[j- 1]+Tmax+T沿Y轴平移h[j],然后绕Y轴旋转一定弧度wt,此变换记为G[j],所得图形记为g[j]; 6) 输出图形g[n-1],即为最终结果。只要输入不同的参数就可以得到不同的树,其中生成的部分分形树效果图如图4所示。 图4 生成的分形树 在叶序的生成过程中,用n控制递归次数,用m来控制中间生成元中树叶的树木和叶序的种类,用w控制树叶与父枝的夹角,用α控制树枝的弯曲度。以下为具体算法步骤: 1) 用Cylinder节点生成树叶所附着的树枝stick,高度为H,并将stick上移H/2; 2) 如果m=1,即要生成互生叶序,则用内联节点Inline读取生成的树叶节点leaf.x3d,并绕X轴旋转一定弧度w,然后沿Y轴平移H,所得结果记为t[0];复制t[i-1],并绕Y轴旋转一定弧度1.5705,然后沿Y轴平移-H/m,所得结果记为t[i](其中0≤i 3) 如果m=2,则即要生成对生叶序,则用内联节点Inline读取生成的树叶节点leaf.x3d,并绕Z轴旋转一定弧度w,然后沿Y轴平移H;继续导入leaf.x3d,,并绕Z轴旋转一定弧度-w,然后沿Y轴平移H; 4) 否则就生成轮生或簇生叶序,则用内联节点Inline读取生成的树叶节点leaf.x3d,并绕Y轴旋转一定弧度6.282(c/m+ 1)/m,然后沿Y轴平移 -H·c/m2,所得结果记为t[0];复制t[i-1],并绕Y轴旋转一定弧度1.5705,然后沿Y轴平移-H/m,所得结果记为t[i](0 ≤i<m)。若c=0即为轮生叶序,否则为簇生叶序; 5) 将以上生成的图形记为G[0]; 6) 将G[j-1]绕X轴旋转一定弧度α,然后沿Y轴平移H;复制G[j-1],将此步骤中生成的图形记为G[j](0 ≤j 7) 输出图形G[n- 1],即为最终结果,生成的叶序效果图如图2所示。 绘制树叶模型的基本思想是先画一个三角形△ABC,然后以△ABC为生成元,对它进行旋转、缩放等操作,然后将之前生成的总图形作为生成元重复以上步骤就可以得到想要的结果。在建模的过程中,用n来控制递归次数,用参数y来控制线段AB的初始长度,用β控制△ABC的宽度,用s控制线段AB与AC的长度差异,用α控制叶子的弯曲程度。具体算法步骤如下: 1) 给定初始坐标A( 0,0,0)和B(0,y,0 ),用公式(6)求得三角形另一个顶点C(x′,y′,z′),其中∠CAB=β,s为线段AC的长短比例(A点坐标不变),画三角形△ABC得到图形L[0]; 1) 将上一步中得到的图形L绕Y轴旋转一定弧度α,然后绕Z轴旋转一定弧度β,得到新图形L′; 2) 将L[0]按比例s[i]=1 + 0.2i缩放(A点坐标不变)得到图形L[i]; 3) 将前面所有步骤中得到的总图形L+L[i]作为新的图形L并返回步骤2),重复n次,就能得到想要的叶子图形。 生成的树叶模型如图5所示,有椭圆形、针形、菱形、掌形、扇形等,只要输入不同的参数就可以生成不同的叶子模型。 图5 生成的叶子 本文针对传统L系统编程实现繁琐,生成的图形没有随机性的不足,提出了用 X3D结合JAVA来轻松实现三维图形的建模,以上所介绍的系统不仅可以生成逼真的三维树,还可以通过设置不同的参数,生成花、草等其他三维图形,除此之外,可用改变参数的方式,运用 X3D中生成动画的节点可生成动态的图形,如树木的生长过程,花开的过程等。因此,本方法还是有一定的推广价值。 [1]Lindenmayer A. Mathematical models for cellular interactions in development [J]. Journal of Theoretical Biology, 1968, 18: 280-315. [2]Prusinkiewicz P, et al. Developmental models of herbaceous plants for computer imagery propose [J].Computer Graphics, 1988, 22 (4): 141-150. [3]Prusinkiewicz P, et al. Synthetic topiary [C]//Computer Graphics Proceedings, Annual Conference Series,ACM SIGGAR PH,Orlando, Florida, 1994: 351-358. [4]Mech R, Prusinkiewicz P, et al. Visual models of plants interacting with their environment [C]//Computer Graphics Proceedings, Annual Conference Series,ACM SIGGAR PH, New Orleans, Louisiana, 1996:397-410. [5]赵 星, DeReffye P, 熊范纶, 等. 虚拟植物生长的双尺度自动机模型[J]. 计算机学报, 2001, 24(6):608-617. [6]赵 星, DeReffye P, 熊范纶, 等. 基于双尺度自动机模型的植物花序模拟[J]. 计算机学报, 2003, 26(1):116-124. [7]张树兵, 王建中. 基于L系统的植物建模方法改进[J].中国图像图形学报, 2002, 7(5): 457-460. [8]张 帆, 谭建荣. VRML环境中3维分形植物的生成及应用[J]. 计算机工程, 2003, 29(21): 110-112. [9]孙博文. 分形算法与程序设计[M]. 北京: 科学出版社, 2004: 61-216. [10]张金钊, 张金锐, 张金镝. X3D 虚拟现实设计[M].北京: 电子工业出版社, 2007: 7-8. [11][加]Prusinkiewicz P, Lindenmayer A. 植物的算法美[M]. 孟 军, 邓华玲译. 北京: 科学出版社,2008: 1-3.3.2 树的叶序结构的建模
3.3 树叶的建模
4 结 束 语