基于形态参数的植物根系生长模型可视化构建
2023-01-11石祥龙刘桂阳
石祥龙,刘桂阳
(黑龙江八一农垦大学信息与电气工程学院,大庆 163319)
0 引言
为了便于观察位于地下的植物根系,通过建立虚拟植物根系模型,以可视化的方式定量而系统地描述植物生长发育、器官建成和产量形成等生理生态过程与环境之间的数量关系,对指导农业科研生产和教学具有重要意义[1-5]。
目前研究中建立植物根系模型的成果较多,但大都是通过实际植物根系生长测量或虚拟植物生长模拟得到三维空间拓扑结构数据,形态仿真上大都是在大体结构上对某一种特定植物进行简单模拟,结果实现的三维模型拓扑结构相对简单,模型形态材质粗糙,与实物差别较大[6-9]。还有一些研究中使用了参数化的建模方法,使根系模型具有较多的可控性,但一般都是数学上的简单描述,实验中的涉及到计算机图形学上的面片建模与材质生成算法都没有实现,一般根系专业研究人员无法直接使用[10-16]。
本文通过对一般植物根系三维数据进行参数提取,利用实时可视化的方法定制生成指定的根系模型,并实现了按时间信息生成的模拟仿真算法。该方案以Unity3D为研发平台,为根系研究人员提供自动化根系的生成工具插件,可以根据观测或虚拟仿真数据直观地生成根系模型,并提供方便的手动调整功能。
1 植物根系形态结构参数提取
1.1 根单元的定义
植物根系是由大量根个体组成的一个复杂系统。为了有效地描述根系的各组成部分,通常采用类似于植株地上部分的节元概念[17]。通过观察图1可以发现,植物的根系可以划分为较小的树形结构,每个较小的树形结构可以进一步细分更小的树型结构,继续下去,直到划分为多条位置和粗细都不规则的折线段。我们可以将整个根系定义为由多条不同级别的折线段来组成,这些折线段是构成根系的基础。这里将每条折线段定义为根单元[18]。如图2所示,根单元是多个端点首尾顺序连接、直径大小连续变化的多个柱状结构体。一个根单元的节点处可以派生出新的根单元,多个层级的根单元组成一个小型的根系,多个小型根系层级连接组成整个根模型。
图1 群体组织结构模型
图2 根系构成
通过以上分析可以看出,一个完整的植物根系系统就是由多个层级连接的根单元组成的集合。
1.2 根系拓扑结构实现
在描述植物根系的拓扑结构时,采用图论中一个倒向放置的轴向树来进行分析[19]。根系统是一个具有多级树型的拓扑结构,在Unity3D系统中,使用父子物体来实现,每个GameOb⁃ject物体上存在相关的插件来实现根单元之间生长消息的传递。图3分别为根系的抽象拓扑结构、对应的Unity层次对象和仿真模型。
图3 抽象拓扑结构、Unity层次对象和仿真模型
一个根单元可以直接位于根系统下,也可以位于其它根单元的单元控制子节点下,与上级根单元形成父子关系。上下级的根单元之间存在空间和时间上的约束关系,作为子物体,下级根单元从属于上级根单元的控制子节点。
1.3 根单元的参数提取
如图4所示,一个根单元模型可以看成根据n(n≥2)个单元控制子节点(node)位置及相关参数生成的平滑柱体。柱体的面数由截面边数(seg⁃ment)确定,其中每个根单元含有截面形状、直径大小、生长时间等参数,主要参数如表1所示。
表1 根单元的主要控制参数
图4 根单元抽象模型
由于植物生长特性,控制点的生长时间及粗度与上一个控制点有直接关联,所以采用相对累加的参数化进行设置,便于控制模型的生长,即在每个控制点上设置的相对于上一个控制点的粗度和时间变化值。表2列出了各子节点的主要参数。
表2 根单元控制子节点的主要参数
一个根单元的不同控制点之间,生长时间存在偏差,离根部越近的节点开始生长时间越早,为便于数据标定,使用startGrowTime表示前后两个节点之间的时间差,growPeriod则表示生长开始到结束的整个时间差。
1.4 根单元截面参数获取
控制子节点用来表示根单元的路径位置,每个节点处还需要有横截面信息才能实现根单元的三维模型,定义为Section类,其主要字段和方法见表3。
表3 根单元控制子节点的主要参数
根据实际需要的不同,截面分为三种级别:正多边形模拟的粗糙圆形、一般图像边界顶点多边形、手动调整的精确多边形。
1.4.1 粗糙类圆截面
对于一些比较细小、根枝截面接近圆形的根单元,可以使用正多边形来表示,生成正多边形的算法比较容易实现。如图5(a)所示,角度步进值deltaAngle=360/segment,currentAngle每次累加步进值即可,截面顶点坐标取正弦和余弦的一半是为了保证多边形的外接圆直径为1,这样再存储截面的缩放比例直接表示直径长度。
图5 根单元截面类型
1.4.2精确多边形截面
对于直径相对较大且截面不规则的根单元,为了使根模型更加精细,这里使用截面图形来提取截面信息。图5为棉花主根的截面图像,图像预处理为背景颜色与截面颜色不同的JPG格式,当不方便区分前景、背景颜色时,可以使用背景色透明的PNG格式。
从中心开始利用平分周边Segment(默认24个方向,每个偏移15°),采用类似计算机图形学中的DDA画线算法[20],每次判断当前点的颜色找到通道为0的点(边界)则选取存入顶点集合。
等分多边形探测边界算法如下:
(1)初始化当前角currentAngle=0及步长角deltaAngle=360/segment。
(2)从当前射线currentAngle方向开始向外探测循环。
(3)初始化中心坐标cx,cy为图像中心(宽高一半像素值)。
(4)新建子物体curObj,取当前角正弦sinA和余弦值cosA。
(5)从cx,cy中心位置开始取当前像素颜色。
(6)若当前颜色不是背景色,前进当前位置cx+=cosA,cy+=sinA。
(7)若当前颜色是背景色,则将curObj定位当前位置,累加currentAngle+=deltaAngle,返回c。
(8)按顺序连接所有子物体位置显示参考线(调用OnDrawGizmos模块)。
(9)返回所有子物体位置到截面对象。
上面的算法可以快速得到截面数据,对精度要求不高的模型比较适合,但如果截面不规则变化较大,且精度要求较高的模型,会出现一定的偏差,这里采用子物体存储位置的方法可以较好地解决这一问题,如图5(b),可以使用手动调整子物体得到精准截面边界,利用37个顶点,通过手工调整得到精确边界顶点。
2 根单元模型的实时生成
2.1 根单元子节点状态确认
根据前面的设计,如图6所示,设每个根单元含有n个控制点,依次为P0,P1,…,Pn-1。参数绝对化计算后,每个控制点都已经确定自己的出生时间、生长粗细等信息。在确定的系统时钟下,每个根单元可以分为三种状态:出生、正在生长、生长完毕。首先要确认哪些节点已经出生,然后根据出生节点的位置及半径缩放建立模型。
图6 根单元控制点
算法流程如图7所示,其中Pi为第i个控制点,Ti为第i个控制点出生时间,Stime为系统时钟。
图7 控制点生成流程图
这里相对复杂的是只有部分控制点出生的情况,为保证生长仿真的连续性,在末尾已经出生和将要出生的两个控制点之间,利用线性插值的方法建立临时控制点,便于后期模型生成算法的统一。
2.2 根单元截面在主模型中的校准
在1.4中得到的粗糙和精确两种截面数据,可以作为参数利用Vector3类型数组传递到根单元的模型生成算法中。但这些数据只是在同一平面内(默认XOY平面)的多个顶点坐标,在场景中使用时,要与控制点位置相匹配。需要使用空间变换矩阵来实现。为保证模型过渡平滑不出现缺口,这里将截面变换到每个顶点与其前后两个顶点连线的角分面。
如图8所示,以第i个控制点Pi为例,前后两个顶点分别为Pi-1和Pi+1。
图8 截面法线计算
Unity系统采用空间坐标系为左手系,计算下一个顶点Pi处理截面方法:Ni标准化后得到控制点Pi处的截面法线。对于首尾控制点的法线,可以直接用P0-P1,Pn-2-Pn-1来表示,截面平面图形顶点存储在XZ水平面上,法线为Y轴,即(0,1,0)。
法线变换矩阵的确定,根据原来和新的法线可以计算得到变换矩阵,这在计算机图形学中已是标准算法,Unity中可以使用Matrix4x4.TRS标准函数来得到,形如:
其中TRS函数的第一个和第三个函数为平移和缩放变换,此处为需要平移,使用零向量。缩放参数中的scale是前后两个控制点的相对缩放比例。有了这个变换矩阵,可以很方便地根据前一个截面计算后一个截面各个顶点的位置。
2.3 根单元三维Mesh网格模型生成
得到了根单元各个截面的顶点数据,可以利用生成面域的算法,来生成根单元的侧面和端面。
利用Mesh三角化算法,生成侧面网格模型,如图9所示,首先将前面得到的各个控制点的截面顶点信息保存到Mesh顶点数据中,再利用左手系法线规则加入三角平面,△(Vi_0,Vi_1,Vi+1_0),△(Vi_1,Vi+1_1,Vi+1_0),……,最后一组三角面循环到第一个顶点。依此类推,生成模型所有三角面,最后使用类似扇形的椎体结构,建立末端封口。
图9 Mesh三角平面构成及根单元三维网格模型
2.4 根单元材质着色器
在一些植物的根须表面,有很多细小的根毛,要表现这些特征利用简单的纹理贴图是无法实现的。根毛非常微小而且数量特别巨大,用真实模型建模对目前的一般计算机资源难以完成,无法做到在移动设备上实时渲染。这里参考一些大型虚拟现实场景中常用到的Shader Lab技术,使用Shader着色器编程利用GPU来完成这些海量计算。
通过观察可以发现,一些细小的根毛一般底层较密集,外层较为稀疏。当从侧面观察时比较清晰,而正面看比较模糊。根据这些特点,在根须外部扩展出若干层,利用分层着色的办法实现,如图10所示。
图10 分层着色
使用多层图像表面渲染技术,分层显示根毛细节,每一个Pass通道表示一层,通过控制每一层的alpha值来实现根毛从根部到尖部逐渐变小,每一层只渲染alpha大于0的顶点,多层叠加,并根据噪声像素图计算Alpha通道,实现根毛的视觉效果。
关键Shader脚本如下:
当渲染每一层时,往法线方向将顶点位置“挤出”模型表面,则对应的像素点位置的公式:
RootFURSTEP表示当前层数/总层数,增加层数可以创造更精细毛发。这里RootFURSTEP从0.1到1.00,步长为0.1,共10层Pass通道,效果如图11所示。
图11 根毛视觉效果
3 根模型的可视化仿真生长
3.1 多层级根单元数据的累加校准
在前面设计中,为了便于根单元的参数标定,每个根单元的空间与时间参数都是以上级根单元为参考,设置的直径大小为前一个节点的相对比例值,生长时间也是本段的生长周期值。这样设计的好处是便于参数修改和后期局部复制后的自动调整,但这种相对参数在生长仿真中需要进行统一的累加调整。
本文在建立的根物体上建立RootSystem模块,进行统一的数据校准。首先从根物体出发,按层迭代遍历所有下级根单元,算法使用递归子函数完成数据传导,计算每个根单元的每个控制子节点的空间位置与绝对生长时间。在RootSystem中利用静态全局变量growTime建立统一根生长虚拟时间,在设计编辑和仿真运行两种情况中实现每帧时间震荡传导。每个根单元与统一的growTime值进行匹配,来确认每个部分的生长状态,从而得到哪些节点已经产生,并计算已经产生的节点直径大小。
3.2 子系统的克隆参数控制
在生长仿真中,由于植物根系的自相似性,可以复制其它部分到新的节点上。本文通过设计点克隆的方式来实现,cloneSource参数为克隆源,对该参数提供的子树进行复制,得到的新的根系根据父顶点相关参数实现位置、直径大小、生长时间自动一致。cloneCount是复制子根数量,为实现逼真效果,加入三个轴向角度,uAngle为子根起始垂直偏移角、vAngle为子根基与父根基垂直夹角、wAangle为子根基自身旋转角。offsetDistance为子根基与父节点位置距离的参数偏移。具体实现效果如图12所示。
图12 克隆根系
3.3 样条曲线拟合生成根须
前面实现的根单元建模是基于子节点和截面而生成的,只要提供的子节点足够多,理论上可以逼真地实现各种根模型效果。但在实际的一些根系中,一些比较细小的须状根很多,用细分节点的办法实现起来工作量相当大。这类根须形状接近一些细线,很难找到合适的单一数学公式进行描述。使用计算机图形学中的样条拟合方法是一个比较好的解决方案。
使用节点的子物体作为控制顶点,利用Hermite样条曲线进行拟合[21-22],将子物体控制点之间的参考球直径作为参数输入,如StartNo⁃deScale为开始结点的尺寸,EndNodescale为结束结点的尺寸,nodeDistance为子节点的距离参数,多个样条控制点之间的平滑曲线使用分段插值的方法生成,生成比较逼真的平滑根须模型,如图13所示。
图13 样条曲线生成根须
3.4 数据的规范化与移植
根系的原始数据来源有三种:使用专用的设备进行测量、虚拟植物的仿真生长计算、专家观察人工指定。在设计过程中为便于后期管理,RootSystem中加入了规范节点名称Normali⁃zeName算法实现按层级对根单元及控制子节点进行统一规范命名。为了方便参数管理,这里提供了标准XML文档形式存储,导入相关参数文件,生成根系模型,对模型进行调整后可导出最终的模型和参数文件,便于在其他可视化平台运用。XML文档格式如下:
4 实例模型可视化生长实现
基于上述根系仿真及可视化生长参数系统,为验证该系统的可行性,文章选用了黑龙江八一农垦大学实验田中的蒲公英根系加以验证。将专家观测获取的部分生长参数转换为系统模拟所需的几何参数导入,生成蒲公英根系三维仿真模型。但由于一些细小的侧根难以通过观测得出数据,为了实现更加逼真的仿真模型,故按照上述样条拟合的方式生成部分根须,再通过点克隆完成大量根须的生成,效果如图14所示。
图14 蒲公英根系实体与仿真模型
最后,为了实时模拟出根系生长的动态过程,如图15所示,为蒲公英根系按照相应的生长规则,在虚拟时间5、15、25、35、45、55实现根系的动态生长的效果,并获得根系不同时期的三维结构以及完整的生长参数输出。
图15 虚拟时间内蒲公英根系生长过程
5 结语
利用虚拟现实引擎Unity3D实现了植物根系仿真及可视化生长参数设计的通用方法,打通了一般根系研究人员在计算机图形学上的技术壁垒,对研究植物根系在不同生长时间三维形态结构及生长参数提供了有力的抓手,对其它植物仿真算法具有较好的推广价值,为实际农业生产研究及生物教学提供了可靠的技术支持。