1.一种用于植物群体虚拟仿真的植株碰撞检测方法,其特征在于,所述方法包括以下步骤:
步骤一,首先,根据番茄植株的形态结构,将番茄模型进行分割,并构造植株、叶轴和器官三层结构:
每一株番茄植株包含多个叶轴结构,针对每一个叶轴结构,构造其相应的混合包围体树;
在每一个叶轴结构内部包含有叶片和叶轴的分段结构,这些结构是番茄植株碰撞检测的基础结构,针对他们构造OBB作为混合包围体树的叶子节点;
步骤二,在获得番茄植株的包围体树后,将番茄植株的模型信息按照种植的行列位置保存在一维数组中,而所有的潜在植株碰撞对由一个植株碰撞对表进行保存;相间隔的两株植株不会越过其他植株发生碰撞,因此,认为每一株植株仅会与其邻接的最多8株植株发生碰撞;当按照下标顺序对场景中的植株进行遍历时,若其中某一植株与该植株属于潜在碰撞对,首先检测该碰撞对在植株碰撞表中是否已经存在,若不存在,则添加入表中;完成对场景中所有番茄植株的一次遍历后,获得所有可能发生碰撞的植株对;对于碰撞表中的每个潜在碰撞对,遍历它们的所有复叶结构,并两两进行碰撞检测;对于每对复叶结构,将两者的混合包围体树进行碰撞检测;鉴于在植株间的叶轴碰撞情况中,叶轴顶端结构的碰撞概率高于叶轴分支根部的碰撞概率,因此优先进行尖端包围体的碰撞检测;
步骤三,除了步骤二所述番茄植株间碰撞检测外,单株番茄植株内部也可能出现碰撞情况;进行番茄植株内部各器官碰撞检测,首先需要以所有底层器官作为叶子节点,构造番茄植株结构树;
首先由叶轴分段以及该分段上生长的叶片组合成以分段为基础的叶轴分组,每个分组内默认不进行碰撞检测;每个复叶结构的所有叶轴分段组合为单个分枝,植株内部碰撞检测按照分枝分组进行;最后,所有分枝组合共同构成番茄植株结构树;
对于单株番茄植株,首先需要对其所有复叶结构进行碰撞测试,获得潜在碰撞对;然后对每个潜在碰撞对的包围体树进行遍历;植株自体器官的碰撞情况与植株间碰撞情况有所不同:对于向外延伸生长的叶轴分支结构而言,其接近内侧的内部结构之间更容易发生碰撞,自体器官碰撞检测中优先遍历LCD树的内侧包围体。
2.如权利要求1所述的一种用于植物群体虚拟仿真的植株碰撞检测方法,其特征在于,所述步骤一中,OBB是一种包围体,定义为包含目标对象且在空间中可取任意方向的最小长方体;OBB的数据结构为:长方体所在的局部空间坐标系的三个正交坐标轴:X axis,Y axis,Z axis,以及长方体在三条坐标轴上的投影半长度:X ext,Y ext,Z ext。区别于世界坐标系的三条标准坐标轴,OBB的三条局部坐标轴是空间中任意一组三维正交基向量,OBB的三条坐标轴经由目标对象顶点的协方差矩阵求得。
3.如权利要求2所述的一种用于植物群体虚拟仿真的植株碰撞检测方法,其特征在于,LCD是OBB的一种形式,在左手坐标系中,将世界坐标轴的Y轴作为固定的局部坐标系取向轴,而在XOZ平面上具有任意的取向,LCD适用于生长方向以水平延伸为主的多种植物。
4.如权利要求3所述的一种用于植物群体虚拟仿真的植株碰撞检测方法,其特征在于,分离轴测试是进行包围体间交叉测试的方法,通过检测空间中是否存在一条分离轴,使得两个包围体在其上的投影范围完全不重叠,从而判断两个包围体是否相交;对于OBB而言,这样的分离轴测试需要进行最多15次,而对于LCD,则需要进行最多5次。
5.如权利要求3所述的一种用于植物群体虚拟仿真的植株碰撞检测方法,其特征在于,所述步骤一中,混合包围体树是层次包围体树的拓展,是将多种包围体构造成为二叉树,混合包围体树由OBB和LCD两种包围体组成,其中OBB作为叶子节点,LCD构成其他节点。
6.如权利要求2所述的一种用于植物群体虚拟仿真的植株碰撞检测方法,其特征在于,所述步骤二中,番茄植株间碰撞检测的流程如下:Step2.1.输入番茄植株包围体数据集并进行遍历,获取番茄植株i周围3-8株植株,记为Around(i);
Step2.2.植株i与Around(i)中的植株依次进行顶层交叉测试;若交叉测试通过,将该对植株编号构造为与植株碰撞表中元素进行比对,将不重复的碰撞对加入碰撞表;
Step2.3.重复以上步骤,直到包围体数据集遍历完毕。
Step2.4.对于Step2.3得到的碰撞表中的植株对,循环遍历两者的子包围体树,执行交叉测试,对于包围体树数量分别为m和n的两株植株,针对包围体树的交叉测试执行m*n次;
Step2.5.对于Step2.4中每一对包围体树的交叉测试,从两复叶结构的尖端子包围体开始,执行同步递归向下的相交测试,直到底层OBB包围体为止,将碰撞检测结果返回并保存;
Step2.6.重复Step2.4到Step2.5,直到碰撞表中所有植株对碰撞检测执行完毕。
7.如权利要求3所述的一种用于植物群体虚拟仿真的植株碰撞检测方法,其特征在于,所述步骤三中,番茄植株内部各器官碰撞检测流程如下:Step3.1.输入番茄植株包围体数据集并进行遍历,对于每一株植株内部,按照复叶叶序编号,将每一组复叶结构与其他复叶结构的包围体树之间进行交叉检测;为了防止重复比对,每一组复叶结构只与编号更大的复叶结构进行交叉检测,因此对于一株包围体树数量为m的植株,总共需要比对m*(m-1)/2次;
Step3.2.每一对包围体树的交叉测试,从两复叶结构的内侧子包围体开始,执行同步递归向下的相交测试,直到底层OBB包围体为止,将碰撞检测结果返回并保存;
Step3.3.在每一组复叶结构内部,获得所有的底层OBB包围体,按照下标顺序进行遍历,进行本包围体与其他底层包围体的相交测试;
Step3.4.对于Step3.3中的每一个包围体,首先获取所包含的对象在植株结构树中的节点位置,剔除该节点的父节点包含的所有对象,并于其他对象的OBB包围体执行交叉测试,将测试结果返回并保存;
Step3.5.重复上述步骤,直到返回所有植株的内部器官碰撞检测结果。