基于OpenGL与IFS的牡丹植株仿真研究

2021-01-13 05:42许艳凰王其棣
闽西职业技术学院学报 2020年4期
关键词:分枝枝干牡丹

许艳凰,王其棣

(漳州城市职业学院,福建 漳州 363000)

当前,主要从基于视觉真实感和基于植物学知识这两个方面,对植物形态进行计算机仿真。第一类仿真的侧重点是视觉上的逼真性,主要从视觉上对植物几何特点进行研究与构造,模拟不同植物的形态发生模型,绘制出植物外部形态。如淮永建、杨猛等通过采集植物三维点云或拍摄图片提取数据,进行花瓣形态及生长模拟[1-2];孙海洪实现了基于OpenGL的虚拟林场漫游[3]。第二类仿真的侧重点是以植物的生物学特征为基础,结合大量的实验数据定量地模拟植物的自然生长过程,有专门针对花卉植物形态与生长可视化的仿真研究[4-5],还有基于L-系统的植物形态模拟方法的研究与应用[6-8],这些研究主要应用于农业方面。在植物仿真建模方面,目前最常用的方法是L-System[7-9],以及在此基础上提出的改进算法Open-L系统和随机L-系统[10-11]。在树木生成方面,主要有基于IFS迭代系统的改进算法[12]。素有 “国色天香” 之称的牡丹是中国历史悠久的传统花卉,具有一定的代表性,又不失一般性,国内暂无学者对其进行仿真实验研究。本文基于VR技术,对牡丹植株形态和开花过程进行研究与模拟,可应用于以牡丹为代表的灌木植物的植物学研究、园林园艺展销与植物教学交互。

1 模拟

1.1 牡丹花朵和叶的建模

1.1.1 牡丹花朵的建模

花的形态仿真重点在于花瓣形态的描述。每朵花都由若干个花瓣组成,不同品种的牡丹花的花瓣形态各不相同,但都可以视为一个在三维空间中的曲面。贝塞尔曲面的算法相对比较成熟,具有显示的图形平滑、控制参数少等特点,OpenGL中有专用的函数支持。当我们获得若干特征点后,便可使用相应的图形库方便地显示出其曲面。绘制一个贝塞尔曲面可用公式(1)表示:

牡丹有千余个品种,不同品种的花朵形态与结构有很大差别。牡丹花的类型主要有:单瓣型、荷花型、菊花型、蔷薇型、托桂型、金环型、皇冠型、绣球型、千层台阁型、楼子台阁型。现以蔷薇型牡丹为例进行模拟。首先,利用贝塞尔曲面,结合该类牡丹花瓣较圆的特点,将牡丹花瓣形成的曲面用4×6个区域,共35个关键点来模拟。然后通过关键点的调节,让模型尽可能接近真实的花瓣形态。图1所示的是初始状态的花瓣,弯曲度较大,第一行的关键点z轴的值从负到正变化,使得花瓣的最上端成S形弯曲。随着花朵绽放,花瓣在一定范围内变宽变长且弯曲度变小。为了表达这种变化,设置花瓣关键点的x和y轴坐标值随花朵开放而按比例变大,z轴坐标值按比例缩小,可用函数来表示:

glScalef(sx,sy,sz);

sx=sx+0.005; sy=sy+0.004; sz=sz-0.005;

if(sx>1) sx=1;

if(sy>1.2) sy=1.2;

if(sz<0.8) sz=0.8;

1.1.2 牡丹叶的建模

牡丹常见的叶型有大圆叶、小圆叶、大长叶、小长叶和中形叶型5类。中国牡丹的羽状复叶除了极个别为一回的,大多数是二回三出,长和宽以及各小叶的形状、大小多数不相同。根据牡丹叶的这一形态特点,使用15个关键点来建立贝塞尔曲面进行叶片建模。现以常见的叶型为例(如图2所示),通过3D建模后获得叶的关键点(如图3所示)。

图1 三维牡丹花瓣模型的关键点

图2 牡丹常见的叶型

图3 牡丹仿真叶子

1.2 牡丹花朵开放模拟

牡丹的花瓣是多层的,系统中设置为5层,每层5个花瓣,每层花瓣的初始倾角和最终倾角的取值范围不同,内层的值比外层小。随着花的开放,花瓣倾角变化的加速度呈现先大后小的趋势。牡丹花瓣存在自相似性,在生长过程中也存在花瓣形态的迭代过程。因此,可设置状态库对花瓣生长状态进行存放,并将库中的对象加入随机数以模拟现实中的性状差异,使牡丹开花仿真效果更佳。

在绘制花瓣的时候,因人眼视网膜视觉暂留现象,即使只绘制最外层的花瓣,仍可产生花瓣连续绽放的视觉效果。花朵在完全绽放前,内层花瓣被外层花瓣包裹,在最内层花瓣分开前,可只绘制最外层花瓣的形态,从而减少计算机性能开销。当最内层花瓣开始分离时,再将各层花瓣进行长、宽和角度变化的计算及绘制,并根据花瓣与花中心Y轴夹角判断花瓣生长快慢。可用以下算法表达:

Step1:设定花瓣的初始状态坐标点,并放入状态库Petal;设定花瓣层Layer=0;

Step2:通过Petal的旋转变化,得出第一层花瓣:

n=0;

for(n<5)

P=Petal沿 y轴旋转 360。 /5×n+Rand;

Draw(P);

存入状态库数组a[Layer][n]中;

n=n+1;

Step3:利用视觉暂存现象,用迭代的方法将当前最外层花瓣进行长、宽及与花中心Y轴夹角的变换,绘制新的最外层的花瓣,最终得到第2~5层花瓣:

for(layer<4)

layer=layer+1;

n=0;

for(n<5)

将状态库数组a[Layer-1][n]中的花瓣l=l+△l;w=w+△w;g=g+dgk;

Draw(P);

存入状态库数组a[Layer][n]中;

n=n+1;

Step4:当花朵处于开放期时,即g不超过90°时,将花瓣的长、宽、与花中心Y轴的夹角g分别增加相应的数值,得到下一时间点花瓣的状态。在绘制时,先绘制外层花瓣,再绘制内层花瓣:

for(layer>=0 and g<90。 )

n=0;

for(n<5)

将状态库数组a[Layer][n]中的花瓣l=l+△l;w=w+△w;g=g+dgs;

Draw(P);

存入状态库数组a[layer][n]中;

n=n+1;

layer=layer-1;

Step5:g>90°花朵停止绽放,退出绘制程序。

其中,l代表花瓣长度,△l代表花瓣长度变化值,w代表花瓣宽度,△w代表花瓣宽度变化值,g代表当前倾角的值,dgk代表倾角快速变化值,dgs代表倾角慢速变化值。

根据花朵生长规律,花瓣与花中心Y轴的夹角变化速度以g=angle/2为分界点,先快速变化,再趋缓,最终停止(图4)。所以在步骤3用了dgk,而在步骤4用了dgs。

图4 花瓣与花中心Y轴的夹角示意图

1.3 牡丹枝干和形态的建模

从宏观上看,花木枝干结构一般由主干、分枝及叶三个部分组成,且呈现层次结构,如图5、图6所示。主干是第一层,分枝是在主干的基础上生成的,为第二层,在前两层的基础上生成最后一层——叶。枝干的生长过程是一个迭代的过程,新的分枝生成过程与前一层分枝生成方式相同,这是一种自相似的分形结构。根据这一特点,可通过传递参数的方式,来建立枝干的整体模型[13]。

图5 真实的牡丹枝干形状

图6 仿真枝干的分枝模型

牡丹枝干的特点与一般的花木枝干类似,其生长受许多外力因素影响,每个枝干衍生出的分枝存在差异。根据枝干生长的规律,可以得出枝干生长的算法,具体如下:

(1)定义一个三维坐标系,坐标系Y轴方向表示树木主干0级主轴的生长方向。

(2)定义模型的各种属性,并通过合适的字母来表示相关属性。用R表示主干,用B来代表分枝的属性,L表示每一段枝干的长度,S表示该枝段的半径,C表示每一段枝段的弯折程度,A表示枝段的扭转程度。

(3)生成一段新分枝时,分枝先在平面XZ面进行,同时考虑重力、光源等因素对枝干生长过程的影响,使模型能描述同一个主干的不同分枝的长度、半径变化情况。分枝的扭转和弯折角度顺序是:先扭转一定角度,再绕向量[Cos(T′),0,Sin(T′)]转动一定角度[14]。

(4)要实现新分枝的衍生,可根据概率,设置、选择不同的产生式。同时,为了更好地实现对枝干的模拟,当层数较大时,应当考虑顶端优势带来的影响,并给予适当的控制,即在侧枝加入控制参数,调整后的函数如公式(2):

另外,两种新分枝的调整算法是不一样的,其中一种与枝干模型的调整算法相同,另一种调整算法如公式(3):

从公式(2)(3)可以发现,算法中增加了3个常数, 即 SideScaleDepth、SideScale和 Eside。 参 数SideScaleDepth用于削减侧枝的段数,使左右分叉的生长规模有区别;参数SideScale用于控制分叉的左右枝变,使其大小不相同;参数Eside用于控制每一个分叉展开的角度,即与其主枝的夹角[15]。

使用符号来替代分枝的对应属性,见表1。

枝干的初始结构设置完成之后,建立一些生成规则P(规则被选择概率之和等于1),最后通过概率选择相应的生成规则。

表1 系统中出现的符号及含义

当N=i时,调用分枝规则,此时:

r1=Lsun表示主枝长度的缩短比例

r2=SideScale表示分枝长度的缩短比例

α1=Tg表示分枝与主枝间的夹角

α2=Tg+180表示分枝上各分枝间的夹角

d=Eg表示分枝与分枝间的夹角

R=(Li+1/Li)*Rscale*Rad 分枝半径的缩放比例

ω=F(d)=F(Li,Ri,Ti,Ei)

P1: A(w) →! (w)F(i) [&(a1)B(1×r2,w×wr)] / (d)A(1×r2,w×wr);

P2: B(w) →! (w)F(i) [- (a2)$C(1×r2,w×wr)] C(1×r2,w×wr);

P3: C(w) →! (w)F(i) [+(a2)$B(1×r2,w×wr)] B(1×r2,w×wr);

同时为每个产生式设置调用概率。

新的分枝算法如下:

Step1:在主枝顶端的侧边生出两个侧枝;

Step2:将这两个侧枝当成新的主枝;

Step3:当级数等于4的时候,就随机调用分枝上述的产生式。

本算法中分枝的生成方法,采用确定性和随机性两种算法相结合的办法。同时,每个字母的取值是根据树枝所在的层次,通过表达式计算出这个分枝的旋转角度和缩放尺度,也是非固定值。

2 系统设计

依据上述算法思想,基于Win7系统,在Visual Studio2012集成开发环境中,使用C++语言,借助OpenGL图形渲染引擎和MFC框架,研发了虚拟现实三维牡丹花开仿真系统。

该系统主要有牡丹展示区,控制面板和右键菜单(图7)。可实现的功能如下:

(1)点击系统可执行文件,打开导航画面,待系统载入后,进入主程序界面;

(2)点击右键选择全屏显示系统界面;

(3)点击右键选择牡丹花种类,调取相应牡丹开花过程;

图7 系统主界面功能区分布图

(4)点击右键打开控制面板,对牡丹枝干的数量、长度、半径、扭曲程序、展开角度进行适当的调整;

(5)点击右键选择自动旋转,查看牡丹不同角度的形态特点;

(6)点击关闭按钮退出程序。

3 实验结果分析

通过虚拟现实三维牡丹花开仿真系统的开发实现,模拟了3种牡丹的生长与开花形态。通过图8及图9的比较可发现,系统使用本文的算法实现的牡丹仿真,能较真实地模拟出牡丹植株形态和花朵开放。用户可通过对控制面板中各参数的调节,达到对画面中牡丹形态的控制,亦可通过键鼠改变用户视角,或以牡丹植株为中心进行自动旋转,方便用户对牡丹进行全方位的观察。

4 总结与展望

图8 牡丹花朵绘制效果对比图

图9 牡丹植株仿真展示图

本文根据现实世界中植物的自相似性与差异性等特征,对牡丹生长进行仿真研究。首先,分析牡丹生长过程中各器官的特点,对其进行分类。其次,重点研究牡丹花开形态及植株生长形态,对花瓣及叶使用了贝塞尔曲面进行模拟。对牡丹花开放过程的研究,主要是通过分析花朵绽放过程中各阶段的器官形态特征,建立器官模型库,通过模型调用并作随机数变换,减少反复建模的系统开销。最后,对于植株枝干部分,在考虑重力、顶端优势等因素的影响下,采用改良的IFS算法,即确定性和随机性相结合的办法,进行分枝的生成。同时,加入用户交互部分,可以得到各种极端条件下植株的形态特征。在未来的工作中,还将探索改良剪枝算法,及对顶端优势控制的参数设置。

猜你喜欢
分枝枝干牡丹
何 芳
一株吊兰
“三不够”牡丹节
玫瑰或刺
玫瑰或刺
短截和摘心对矮砧苹果幼树分枝特性的影响
牡丹的整形修剪
绿牡丹
“牡丹”情
红花群体自交结实及分枝性状探究