APP下载

一种基于质点-弹簧系统的植物形变模拟改进算法

2019-11-01

浙江工业大学学报 2019年6期
关键词:质点骨骼弹簧

(浙江工业大学 计算机科学与技术学院,浙江 杭州 310023)

植物是自然界中一类最常见的景物,也是构成三维场景的基本要素之一[1]。构造逼真的植物模型,在影视娱乐、游戏与广告设计、园林规划和社区设计等多个领域均具有重要的应用价值。此外,精确的虚拟植物模型,也可以为诸多农业科学问题研究提供虚拟平台。一般地,木本植物由主干、枝条、叶片、花朵和果实等器官组成,许多植物的枝干和其他器官都比较柔软,因此在受到外部作用(如推拉挤压、风力等)时,会产生比较明显的形变。在影视特效、3D动画等领域,常常需要构建包含植物模型的动态场景,并且用户需要对场景中的植物模型进行交互操作,逼真地表现这些交互操作对植物产生的影响,具有十分重要的实际意义。常见的植物三维建模方法可大致分为基于图像的建模[2]、基于规则的建模[3-5]和基于草图[6-7]的建模三大类,而常见的植物动态模拟方法可以分为基于物理的方法和基于过程的方法[8],其中基于物理的方法被广泛应用于植物和自然环境[9]和物体[10]等的交互模拟。例如,Pirk等[11-13]针对逆向过程建模方法进行了研究,从静态的树木模型中提取出树木的生长规则和参数,利用参数集重建不同阶段的树木模型,并且基于植物模型生成受力传感器,模拟出20 株左右的树木在风中的实时生长变形情况。Stava等[14]使用基于骨架的树木模型,实现了植物的实时变形,并且考虑了光照分布情况和场景中的障碍物。然而,这种变形方法较难改变植物的结构,并且变形结果受到模型原有形态的影响。Yang等[8,15]针对雨滴和树木枝叶的交互进行了研究,通过质点-弹簧模型对树木枝叶的动态进行模拟,并给出了一种雨滴在叶片上运动的计算方法。然而,这种算法主要处理了树木枝条在受力下的形变情况,对叶片等其他器官的结构进行了简化。Quigley等[16]提出了一种基于铰链连接刚体模型的树木受力形变模拟方法。这种算法将植物枝干离散为由铰链连接的刚体块,较好地模拟了刚度较高的枝条结构的形变情况,但是对于植物中其他刚度较低的器官,例如花朵叶片等结构,适用度可能不高。

上述专家学者已经进行了多种植物及其器官的形态建模以及形变模拟,然而,以上研究也存在一些不足之处。首先,许多研究是针对特定的植物结构进行模拟,而忽略或简化了不同器官之间的相互影响;其次,很多研究并没有考虑到物体碰撞对植物结构形变的影响情况。因此,针对现有研究中存在的问题,笔者提出了一种基于质点-弹簧模型的植物形变改进算法。该算法基于三棱柱弹簧模型构造植株的物理模型,同时结合骨骼节点的碰撞检测,使其能够进行基于物理的形变模拟。

1 植株重建

在进行植株形变模拟的过程中,需要针对植株的枝条和叶片等多种器官结构进行重新绘制。植株模型库中存在多种方式构造的模型,其中许多使用建模软件或者生长规则进行构造的植株模型,其模型分割和顶点坐标修改比较困难,在形变过程中也容易出现形状失真的情况。为了防止发生这类问题,在进行形变模拟之前,先基于现有模型库进行植株模型的统一化重建。番茄作为一种常见的作物,其生长结构比较简单而有规律,同时其主要的器官为枝条结构和叶片结构,可以完整表现出笔者算法的实现流程,因此选择番茄植株作为实验对象。笔者通过对已有番茄模型进行骨骼节点的提取,并基于骨骼节点进行番茄模型的绘制和物理模型的生成,最终完成植株形变的模拟。整体流程如图1所示。

图1 植株绘制和形变模拟流程Fig.1 The process of tomato plant rendering and deformation simulation

番茄植株所包含的主要器官和结构为叶片结构及主轴和枝条结构。在骨骼节点提取的过程中,为了简化骨骼节点的种类和番茄植株骨骼的结构,以提取枝条和叶片节点为主,如图2所示。原始植物模型的来源不同,使用的骨骼节点提取和简化方法也有所不同。例如,基于L-系统等规则参数生成的模型,可以通过提取参数规则所对应的植物器官结构的位置和生长方向来获得骨骼节点数据。获得的植物骨骼不一定可以直接应用于番茄植株重建和物理模型构造上,因此需要进行相应的修改和简化。

图2 番茄植株骨骼节点提取和模型重建流程Fig.2 The process of tomato plant skeletal node extraction and model reconstruction

1.1 植株特征分析及模型骨骼提取

番茄植株的结构大体可分为三层:主轴—叶轴—叶片等器官,其中包括“主轴—叶轴”以及“叶轴—叶片”等器官的二级关联关系。即叶轴围绕主轴生长,而小叶片生长在叶轴两侧及尖端,与叶轴共同构成番茄植株的复叶结构。因而在植株形变模拟时,应当考虑叶片对叶轴、叶轴对主轴所施加的力。在获取番茄植株模型骨骼时,如果骨骼节点过于密集或分布不均匀,可能导致两个方面的问题:1) 在植株重建时生成过多的顶点和面片,影响番茄植株的绘制效率;2) 在物理模型构造时生成过多的质点和弹簧结构。这除了影响模型形变的计算效率外,还可能在模拟流程中由于对质点位置和速度的迭代计算次数过多而导致运算结果的不稳定。同时,对一些高精细度模型提取的骨骼节点,可能数量比较多,但是在模拟时不一定能表现出节点之间的相对运动,故可以对模型进行适度的简化。因此,根据对番茄植株特征的分析,同时结合番茄植株物理模型构建的需求,最终得出番茄模型骨骼节点提取及简化原则如下:1) 节点沿着主轴/叶轴/叶片主叶脉生长方向进行分布(图3a);2) 尽可能提取生长有子结构的模型位置作为骨骼节点;3) 当两节点距离过小时,将两节点进行合并(图3b);4) 若存在节点A,C之间有一节点B,在B处无子器官生长,同时向量AC与向量CB的夹角比较小时,将C节点删去(图3c)。

依照上述原则进行骨骼节点的提取,并依照番茄植株的层次结构,保存为番茄骨骼节点序列。接下来,使用该骨骼节点序列进行番茄植株的建模。

图3 番茄植株骨骼节点提取Fig.3 The extraction of tomato skeleton nodes

1.2 植株建模

使用上述方法获取原始模型的骨骼节点后,可以根据骨骼节点的结构进行番茄植株的重建工作。番茄植株的骨骼节点主要记录了番茄主轴和叶轴等枝条结构,以及叶片器官的生长情况。因此,番茄植株的建模工作可以分为主轴/枝条建模以及叶片建模两个部分。

1.2.1 主轴及枝条建模

主轴及叶轴等枝条结构采用广义圆柱(Generalized cylinder)[17]方式进行模拟(图4a)。将1.1中获取的植株骨骼节点作为控制点,每个节点使用与下一节点的方向向量作为Y轴,构造局部坐标系,对枝条截面进行扫描变换。使用广义圆柱构造的结构可以保持比较连续的曲率,因此基于简化后的番茄植株骨骼模型节点,可以生成自然的番茄枝条。同时,在骨骼节点位置改变后,将枝条截面顶点基于变化后的骨骼节点局部坐标系进行变换,即可快速完成番茄枝条结构的重建。图4b为基于广义圆柱生成的番茄枝条结构示意图。

图4 广义圆柱构造示意图Fig.4 Schematic of generalized cylinder construction

1.2.2 叶片建模

为了降低叶片形态模拟的复杂度,采用纹理贴图方式进行番茄叶片的绘制。在叶片局部坐标系下,首先根据叶柄根部到叶片尖端的主叶脉方向获取叶片控制节点,获取方法类似1.1节(图3a),但由于叶片本身没有生长的子结构,因此控制节点可以比较均匀地获取。然后,以变换到叶片局部坐标系下的控制节点组为基准,进行叶片曲面构造,如图5所示。

图5 番茄叶片模型构造示意图Fig.5 Schematic of tomato leaf construction

1.3 植株群体建模时的优化策略

由于植株形变模拟的过程需要较大的计算量,因此在进行植株群体的形变模拟实验时,考虑对群体中较远处的植株模型绘制进行简化,以降低模型绘制工作对计算资源的占用,从而提高系统整体运行的效率,并支持更大规模植株群体的实时形变模拟。为达到以上目的,结合1.2中使用的番茄植株建模方法,设计了相应的番茄植株模型简化策略。具体的简化方案采用多级递进的简化方法。

主轴/叶轴采用了基于骨架节点的广义柱面的构造形式,因此在简化过程中,通过保留植物模型骨架,减少圆环顶点树,将原本的圆柱/圆台简化为面数更少的棱柱/棱台,从而达到减少模型网格数的目的。简化效果如图6所示,经过多级简化后,番茄枝条结构的面片数量有了明显减少。

图6 多级递进简化下番茄植株主轴/叶轴部分示意图Fig.6 Schematic of multistage progression simplifies for leaf shaft of tomato plant

此外,对于叶片也可以采用多级递进的简化方法,通过降低叶片曲面构造的精细度,可以有效降低叶片器官绘制所需的面片数,但是叶片精细度过低有可能导致无法表现出自然的叶片形变效果。

2 植株的形变模拟

从原始模型获取植株的骨骼节点之后,可以基于骨骼节点进行植株物理模型的构造,主要内容为质点-弹簧组的生成和参数设置。构造完成后,通过对植株的受力和运动进行分析,设计了基于质点运动的植株形变模拟流程,其中包括质点的碰撞检测与处理阶段。

2.1 质点-弹簧组的生成和属性设置

本研究中质点-弹簧组的设计思想,来源于Yang等[8,15]提出的“三棱柱弹簧模型”方法,主要包括4 种弹簧结构:结构弹簧、切向弹簧、弯曲弹簧和回复力弹簧。结构弹簧和切向弹簧用于构建物体的基本结构和维持物体的稳定,而弯曲弹簧和回复力弹簧则是用于在物体形变过程中提供额外的回复力和阻尼力,使得整个质点-弹簧系统尽快达到受力平衡状态。由4 种弹簧结构组成的弹簧组能够模拟枝条的弯曲、扭动等形变情况。与Yang方法中使用k-means聚类筛选树枝骨架节点不同的是,笔者直接基于第1节中获取的番茄枝条模型的骨骼节点进行质点-弹簧组的生成。

2.1.1 枝条局部坐标系构建

番茄复叶结构的生长方向以主轴为起点,以一定的叶序角生长,因此以竖直坐标轴为局部坐标Y轴,以叶轴延伸生长主方向为坐标Z轴,生成局部坐标系,并将骨骼节点变换到局部坐标系下。

2.1.2 生成枝条弹簧组

如图7所示,在局部坐标系下,沿着叶轴方向,以叶轴骨骼节点为中心,取距离R,对每个骨骼节点生成3 个质点,质点质量总和为所属的骨骼节点质量,并依据三棱柱弹簧模型对质点组建立结构弹簧、切向弹簧、弯曲弹簧和回复力弹簧。

图7 枝条弹簧组生成Fig.7 Generation of branch mass-spring system

2.1.3 弹簧组属性设置

在番茄器官局部坐标系下,包括枝条、叶片等器官在内,可以认为器官根部骨骼节点是固定在上一级器官上的,因此以最靠近根部的骨骼节点所关联的质点开始进行弹簧组属性设置。假设番茄植株枝条结构的材料学特性基本一致,且切向弹簧和结构弹簧的属性相同。对弯曲弹簧和回复力弹簧根据节点顺序进行参数调整,公式为

(1)

式中:li为从节点i到根部节点的距离;ltip为最尖端节点到根部节点的距离。

2.1.4 质点属性设置

在质点-弹簧系统的位移计算阶段,需要考虑质点与其他物体的碰撞处理,以对质点位置进行修正,因此针对质点本身构造一个较小的AABB包围体,用以和其他物体的包围体进行碰撞检测。图8为基于笔者方法生成的质点-弹簧模型组示意图。其中黑色点表示质点,灰色线段表示各种弹簧结构。

图8 质点-弹簧模型组示意图Fig.8 Schematic of final mass-spring system

2.2 模型受力及动态分析

质点-弹簧系统的每一个质点都包含以下物理属性:质量、位置、速度、加速度以及合外力。每个质点的质量应当是恒定不变的。本研究暂不考虑植株生长、枝条断裂等会导致的质量或质点的增加和减少,整个植株的物质总量维持在恒定状态。当需要计算其他物体附着的情况时,笔者首先计算附着物对植株器官施加的合力,并将相应大小的外力直接添加到临近附着物的质点上。

每个质点的位置与它所属的骨骼节点位置相互依赖,在质点位置每个时间间隔更新后,其所属的骨骼节点依据相关质点的位置进行位置更新。每个时间间隔Δt下质点的位移ΔP与两个属性相关:质点的速度Vm以及质点在碰撞处理系统中需要进行的位置修正Pmove。其表达式为

ΔP=VmΔt+Pmove

(2)

其中Pmove的计算与质点的碰撞对象相关,即

Pmove=K×Linner×contactNormal

(3)

式中:Linner为碰撞对象的相交深度;contactNormal为碰撞对象的相交法线,它是一个三维向量;K为每个碰撞对象移动距离所占总移动距离的比例,即

(4)

式中:m为本物体质量;mother为所碰撞对象的质量。

对于番茄植株的每一个骨骼节点,其速度的计算包含加速度a和碰撞分离速度Vsep,即

Vm=aΔt+Vsep

(5)

质点的加速度由其所受的合外力决定,而单个模型结构所受到的力通常包括以下来源:1) 外界力Fouter;2) 重力G;3) 子结构赋予力Fsub;4) 弹簧弹性力Fspring。其表达式为

Fm=Fouter+Fsub+Fspring+G

(6)

2.3 植物形变模拟流程

植物形变模拟的整体流程包括受力计算、碰撞处理和质点状态更新三个方面,并且三者之间具有相互依赖的关系。其中,根据公式(6)可以得出:质点所受的合力与弹簧施加的弹性力有关,而每一个时间间隔后,弹簧施加的弹性力随着质点位移引起的弹簧长度变化而变化,因此为了保证质点-弹簧组的准确和稳定,包括弹簧弹性力在内的质点合力计算放在整个模拟流程最开始。质点碰撞检测和处理的目的是减少场景中模型穿透的现象。因此在每一个时间间隔内的碰撞处理完成后,质点的位置不应当继续发生变化。

植物形变模拟的整体流程如下:

Step1输入场景中所有的番茄植物模型models,从中获取全部质点列表MassList,所有质点受力生成器列表ForceList,以及所有碰撞发生器列表CollisionList。将场景中所有质点放入MassList,所有弹簧结构及重力计算结果以及对应的受力质点放入受力生成器列表ForceList。

Step2在每一时间间隔Δt时,检查所有质点是否有新的受力产生,更新受力生成器列表ForceList,并根据公式(6),使用所有受力生成器更新对应质点所受的合外力。

Step3遍历质点列表MassList,使用运动学公式更新所有质点的加速度、速度和位置。

Step4利用更新后的质点位置及其包围体进行碰撞检测,并将所有的碰撞对加入碰撞发生器列表CollisionList。

Step5遍历CollisionList,对于其中的每一对碰撞对,计算其碰撞避免所需位移Pmove和分离速度Vsep,并按照公式(4)计算分配比例K,最终按照公式(2,5)进行质点位置和速度的修正。

Step6质点位置更新完毕之后,根据质点和模型骨骼节点的关联关系,对番茄模型的骨骼节点位置进行更新,更新方式为:骨骼节点新位置为当前相关联质点位置的平均值。

Step7基于更新后的骨骼节点,使用绘制函数对番茄植株进行重新绘制,完成该帧内番茄植株的更新。

Step8重复Step 2到Step 7,直到停止物理系统的模拟。

3 运行结果与分析

本实验在联想Y-50笔记本电脑(Intel Core i7-4710HQ CPU 2.50 GHz,16 G内存,NVIDIA GeForce GTX860M显卡)上完成,界面及模型绘制采用Unity3D引擎实现。实验针对本文方法在多种场景下的运行效果和耗时进行了分析和比较。实验主要内容如下:

1) 对枝条和叶片的触动/拉扯,如图9,10所示。在图9中,通过对叶片施加横向的拉力,使得叶片控制点的相对位置发生了变化,原本弯曲的叶片随着控制点位置的变化变得比较平直。

图9 番茄叶片形变Fig.9 Deformation of tomato leaf

图10 番茄复叶结构形变Fig.10 Deformation of tomato compound leaf structure

在图10中,番茄复叶结构的叶轴尖端受到向上的牵引力,由于尖端质点所关联的弯曲弹簧和回复力弹簧带来的弹性力较小,因此尖端控制点的位置变化幅度大于靠近根部的控制点。表现在枝条整体上,可以看出枝条在向上牵引力的作用下,整体形态由自然向下弯曲变为向上弯曲。

2) 其他物体对番茄植株的碰撞结果,如图11所示,在叶轴尖端与下落的小球发生碰撞时,叶轴尖端控制点所属的质点与小球的包围体发生碰撞,经过碰撞处理的位置修正后,叶轴尖端控制点随着质点位置改变发生了较为明显的位移。

图11 番茄植株的碰撞处理Fig.11 The collision handling of tomato plants

3) 在番茄群体植株场景中进行的形变模拟,效果如图12所示。在模拟开始时,番茄植株叶轴结构处于比较平直的伸展的状态,即叶轴结构的控制点构成的叶轴骨骼曲线弯曲程度比较低;此时所有植株由于自身器官和结构所受重力的影响发生形变,以使得番茄植株进入受力平衡状态:由于叶轴结构尖端所关联的弯曲弹簧和回复力弹簧强度较小,因此发生比较明显的向下位移,导致番茄植株叶轴结构的弯曲程度变大,例如图12中标注的右侧前排植株叶轴结构。在经过一段模拟时间后,番茄植株的多数叶轴结构都发生了一定程度的弯曲。

图12 番茄植株群体形变模拟Fig.12 The deformation simulation of tomato plant population

最后,结合笔者提出的植物群体形变模拟算法,实现了番茄群体植株场景的建模和漫游,并为其中少量植株进行了质点-弹簧组的构造,以在确保场景渲染效率的情况下实现近景植株的形变模拟(图13)。采用了1.3中的多级简化方案进行番茄植株多分辨率模型的生成,并结合广告牌模型,绘制出较大规模的番茄植株场景。

图13 番茄植株群体绘制场景Fig.13 Rendering of tomato plant population

通过对不同规模的番茄植株或器官的形变进行模拟,可以得到相应的质点、弹簧数量和模拟效率数据,结果如表1所示。

表1 不同场景规模下形变模拟耗时

Table 1 The comparison of time-cosuming for plant deformation in different scenes

植株规模单叶片单复叶结构单株4×4 株网格面片数量/个81201 83029 280顶点数量/个101051 63526 160质点数量/个151202103 360弹簧数量/个574327561 296初始化耗时/ms3.397.0010.50125.60形变模拟帧数/fps65~7063~6657~6125~28

上述实验结果图片和数据表明,笔者提出的方法较好地模拟了番茄植株及器官在受到外部作用时的形变情况,并且在小规模群体的模拟中具有较好的实时性。相应的,在场景规模进一步扩大时,其消耗的运算时间将会进一步增加,在模拟过程中可能出现帧率不足的情况。其中表现比较明显的是叶片部分的模拟耗时:由于叶片结构是植株中数量最多的结构,因此构成叶片的骨骼节点数量也占据了番茄模型骨骼中的大部分。例如某株番茄植株具有10 条叶轴,每条叶轴上生长7 片小叶片,假设每片叶片上有4 个骨骼节点,则按照1.1中提出的骨骼节点提取原则,生成的总节点数为262 个,其中叶片节点有210 个。由此分析可以看出:在小规模的植株形变模拟中,由于需要展示比较自然的叶片,需要对植物的叶片结构进行精细度比较高的形变模拟,从而占用较大比例的计算资源。因此,当需要进行更大规模的植株形变模拟时,应当对当前使用的质点-弹簧组进行简化,例如可以减少叶片上控制点的采样数量,以减少整个系统中的质点和弹簧数量。

同时,可以考虑将质点-弹簧系统与其他形变模拟算法进行结合。例如,在叶片的形变模拟上采用基于位置的动力学方法,可以通过对叶片控制点的合理选取,从而降低叶片形变模拟时间的消耗。相对应地,多种物理模型之间的配合问题有待进一步研究。同时,可以将现有基于串行实现的质点-弹簧系统使用GPU进行并行化加速运算,以提高模拟效率。还可以结合植物学和材料学方面的相关研究,探索不同物理性质的植物器官结构与其相应质点-弹簧组数值的对应关系,从而进一步提升植株形变时的物理真实感。

4 结 论

提出了一套使用质点-弹簧系统进行番茄植株形变模拟的改进算法:首先,使用基于骨骼节点的绘制方法生成适用于形变模拟的番茄植株模型;然后针对番茄植株模型构造基于三棱柱模型的质点-弹簧组,并根据番茄植株的特征对弹簧组的数值进行了调整;最后,对番茄植株的受力和运动情况进行了分析,建立并实现了一套番茄植株运动模拟算法。实验结果表明,笔者提出的算法能够在实时情况下对番茄植株的形变进行较好的模拟。在未来的工作中,将会探索多种基于物理形变方法的融合,以及基于植物学和材料学相关知识的物理模型参数获取。同时,也可在笔者方法的基础上进行进一步简化或者并行化的实现,从而在保证模拟效率的情况下,减少模拟流程所消耗的时间。

猜你喜欢

质点骨骼弹簧
联合弹簧(天津)有限公司
做家务的女性骨骼更强壮
巧用“搬运法”解决连续质点模型的做功问题
三减三健全民行动——健康骨骼
析弹簧模型 悟三个性质
如何求串联弹簧和并联弹簧的劲度系数
质点的直线运动
质点的直线运动
骨骼是如何生长的
神奇的骨骼