一种动态碰撞检测方法与流程

文档序号:13513962阅读:323来源:国知局
一种动态碰撞检测方法与流程

本发明涉及一种碰撞检测方法。



背景技术:

碰撞问题多年来一直受到较多的关注,碰撞检测方法在计算几何、计算机动画、仿真机器人和虚拟现实等领域中都有较好的应用前景。

近些年来,国内外学者在碰撞检测领域中做出了相当多有意义的工作并提出了一些高效的检测方法。这些方法从时间域的角度,可分为静态碰撞检测算法、离散碰撞检测方法和连续碰撞检测方法三类;从空间域的角度,可以分为基于实体空间的碰撞检测方法和基于图像空间的碰撞检测方法。对于基于实体空间的方法,根据所使用实体表示模型的不同可以分两类:第一类是基于bsp(binaryspacepartitioning)树、k-d树和八叉树(octree)等的空间剖分法(spacedecomposition)[na90][mpt90];第二类是基于层次包围体树的方法。层次包围体树法根据包围盒类型的不同又可以分为包围球层次树、轴向包围盒层次树、方向包围盒层次树、k-dop(discreteorientationpolytope)层次树、凸壳层次树以及混合层次树等等。

传统的多物体间的碰撞检测算法一般时间复杂度为o(n2),不能满足实时性的要求,而且大多是集中式串行处理方法,不利于碰撞检测快速实现。八叉树和其它几何模型在解决碰撞检测的框架之间的几何干涉问题时,不会大幅度提高算法效率。采用层次包围盒技术来加速多面体场景的碰撞检测,但包围盒方法作为一个整体的方法,检测精度低,效率提高并不明显。另外提出了一种空间分割技术的方法,影响该算法效率的一个重要因素是分区的多少,而分区的数目又较难把握。



技术实现要素:

本发明的目的是一种性能良好的并行动态碰撞检测方法,能适用于凸体碰撞检测,并在保证高精度前提下,有效地满足碰撞检测的实时要求。

为了达到上述目的,本发明的技术方案是提供了一种动态碰撞检测方法,判断多面体a与多面体b是否发生碰撞,其特征在于,包括以下步骤:

将多面体a分解为n个简单多面体a1,a2,……,an,将多面体b分解为m个简单多面体b1,b2,……,bm,再利用cluster结构或smp结构的并行机同时判断简单多面体ai,i=1,2,……,n,与简单多面体bk,k=1,2,……,m,是否发生碰撞,若有,则多面体a与多面体b有碰撞发生,否则没有,其中,将多面体a分解为n个简单多面体a1,a2,……,an与将多面体b分解为m个简单多面体b1,b2,……,bm的方法相同,包括以下步骤:

步骤1、获取待处理的多面体的顶点坐标值以及构成多面体的各个平面的顶点序列;

步骤2、根据平面方程生成函数得到构成多面体的所有平面的平面方程,各个平面的法向量指向多面体外部;

步骤3、从顶点序列中选择凸顶点,组成凸顶点序列;

步骤4、从凸顶点序列中选取一个未经过处理的凸顶点,将其邻接顶点投影到平面上,利用delaunay三角剖分算法,得到当前凸顶点的凸空间;

步骤5、将当前凸顶点和它的凸空间从多面体中剖分为独立的四面体;

步骤6、是否遍阅凸顶点序列中的每个凸顶点,若是,则完成剖分,否则返回步骤4。

优选地,定义表达多面体及简单多面体的数据结构m,数据结构m中定义如下字段:

指向第一个平面节点的一个平面节点指针;

指向下一个平面节点的一个平面节点指针;

平面节点,每个平面节点有x、y、z、d四个数据域,代表构成多面体的一个平面,每个平面的法向量{x,y,z}指向多面体的外部;

一个凸顶点节点指针,指向第一个凸顶点节点;

指向构成平面的边节点的一个边节点指针;

指向构成平面的下一条边的边节点指针;

边节点,每个边节点有ph、pt、fl、fr四个数据域ph、pt、fl、fr,ph、pt分别代表组成边的头、尾顶点,fl、fr分别代表边的左边平面和右边平面;

顶点节点,每个顶点节点有x、y、z三个数据域,代表当前顶点的坐标值;

指向下一个顶点的指针;

指向下一个顶点的邻边节点的指针;

指向边节点的指针;

指向边节点对应边的头顶点的下一条邻边节点的指针。

在计算几何学中,剖分是一类基本问题。其中平面多边形的剖分问题已经得到很深入的研究,已有较多将多边形剖分为三角形的算法。但由于空间立体图形的复杂性,目前国内外文献上还很少见到凸体的剖分算法。而在本发明当中,就是要在完成任意多凸体的剖分算法基础上,将之应用于虚拟环境中的碰撞检测中,引入并行技术来提高碰撞检测的实时性。

本发明提供的基于凸体剖分的并行碰撞检测算法较好提高碰撞检测速度,并行程序的执行时间随着处理节点的增加而呈线性下降趋势。

附图说明

图1(a)至图1(c)为凸顶点的空间delaunay三角剖分过程示意图;

图2为本发明中所使用的基本数据结构图。

具体实施方式

下面结合具体实施例,进一步阐述本发明。应理解,这些实施例仅用于说明本发明而不用于限制本发明的范围。此外应理解,在阅读了本发明讲授的内容之后,本领域技术人员可以对本发明作各种改动或修改,这些等价形式同样落于本申请所附权利要求书所限定的范围。

本发明提供的一种动态碰撞检测方法基于以下定义:

定义1、对于多面体的任意一个顶点p,所有以p为顶点的面称为p的邻面,所有以p为端点的棱称为p的邻边,所有邻边的另一个端点称为p的邻接顶点;如图1(a)所示,pc的邻接点为p1、p2、p3、p4。

定义2、设p是多面体上的某一顶点,pi,pj……pk是p的邻接顶点,若任意三个邻接顶点所构成的三角形平面不属于多面体,且p与任三个邻接点构成的四面体内的点(除四个顶点外)均不属于原多面体,则称p为凹顶点,记为pn,反之称之为凸顶点,记为pc。所有的顶点都是凸顶点的多面体是凸多面体。

定义3、对于任意一个凸顶点pc的邻接顶点序列pi,pj……pk所围成的闭环l,将l投影到二维平面,得到一个对应顶点为pi’,pj’,……,pk’的平面多边形l’,将此平面多边形l’进行delaunay三角剖分。再根据对应的顶点将空间环l进行剖分(如图1(a)及图1(b)所示多面体,pc为一凸体的凸顶点,p1、p2、p3、p4为pc的邻接点,p1、p2、p3、p4构成环l,其在平面的投影为l’,l’进行三角剖分后,再根据对应顶点将空间环l三角剖分,得到两个三角形,p1p2p3、p1p3p4),称之为pc的空间delaunay三角剖分。

定义4、对于多面体的任意一个凸顶点pc,可得到pc对应的空间delaunay三角剖分,根据剖分的三角形,得到一系列的空间三角形平面,这些三角形平面与pc的邻接面构成的立体空间称为凸顶点pc的凸空间(如图1(c)所示,pc的凸空间由pcp1p3p4和pcp1p2p3两个四面体组成),记为v(pc);

定理:对于任意的凸多面体v,经过若干次的凸空间剖分,最终可分解为一系列的四面体集合.

证:对于凸多面体v的来说,它的任意顶点都是凸顶点,可任选一个顶点pc作它的空间delaunay划分,得到pc的凸空间v(pc),由定义1知v(pc)中的点都属于将该凸多面体,则原凸多面体可分解为几个四面体和一个新的多面体v’。由于v’中的任意三个顶点构成的三角形平面f与v中存在一一对应的平面f,即f∈v且f∈v’,因此v’中的所有顶点的任意三个邻接点构成的三角形平面都属于v’,所以v’中所有顶点都是凸顶点(v’也是凸多面体),则v’也可以再次剖分为几个四面体和一个新的多面体v”,依此类推,最终可将v分解为一系列的四面体。

虚拟环境下的碰撞检测技术已成为实现动态实时仿真的一个瓶颈问题,而提高检测的实时性成为问题的关键所在。通常来说,碰撞检测问题最终都转化为判断三维空间中两凸体是否相交的问题,本发明将凸多面体剖分为系列四面体后,将两个复杂的凸体间的碰撞检测问题转换为多个四面体间的并行碰撞检测。

一)凸多面体剖分为系列四面体

确定表达多面体的数据结构,根据面体模型数据及剖分算法的特点,给出了本发明所使用的基本数据结构,如图2所示,包括如下字段:

指向第一个平面节点的一个平面节点指针;

指向下一个平面节点的一个平面节点指针;

平面节点,每个平面节点有x、y、z、d四个数据域,代表构成多面体的一个平面,每个平面的法向量{x,y,z}指向多面体的外部;

一个凸顶点节点指针,指向第一个凸顶点节点;

指向构成平面的边节点的一个边节点指针;

指向构成平面的下一条边的边节点指针;

边节点,每个边节点有ph、pt、fl、fr四个数据域ph、pt、fl、fr,ph、pt分别代表组成边的头、尾顶点,fl、fr分别代表边的左边平面和右边平面;

顶点节点,每个顶点节点有x、y、z三个数据域,代表当前顶点的坐标值;

指向下一个顶点的指针;

指向下一个顶点的邻边节点的指针;

指向边节点的指针;

指向边节点对应边的头顶点的下一条邻边节点的指针。

凸多面体剖分为系列四面体就是不断从多面体中取一个凸顶点,进行空间delaunay三角剖分,用于生成多面体凸顶点的凸空间。然后将该凸顶点的凸空间从原多面体中剖分出去,原多面体减少一个顶点,成为新的多面体,如此重复,直到多面体的所有顶点都剖分完毕。其算法表达如下:

步骤1、获取待处理的多面体的顶点坐标值以及构成多面体的各个平面的顶点序列,生成多面体的数据结构m;

步骤2、根据平面方程生成函数得到构成多面体的所有平面的平面方程,各个平面的法向量指向多面体外部,将计算结果填充到数据结构m的数据项;

其中平面方程生成方法为:不在同一直线上的点a、b、c构成一个平面f,根据点a、b、c的坐标值及它们的排列顺序得到向量ab、bc的值,而平面f的法向量nf就是向量ab、bc的叉积,得到法向量nf,就得到了平面方程ax+by+cz+d=0中a、b、c的值,再将任一点的坐标值代入表达式ax+by+cz+d=0中就得到常数项d的值,就得到由三点a、b、c确定的平面方程;

步骤3、从顶点序列中选择凸顶点,组成凸顶点序列;

步骤4、从凸顶点序列中选取一个未经过处理的凸顶点,将其邻接顶点投影到平面上,利用delaunay三角剖分算法,得到当前凸顶点的凸空间;

步骤5、将当前凸顶点和它的凸空间从多面体中剖分为独立的四面体,根据剖分的顶点及平面修改多面体的数据结构m;

步骤6、是否遍阅凸顶点序列中的每个凸顶点,若是,则完成剖分,否则返回步骤4。

二)利用并行处理来提高碰撞检测的速度

关键在于要满足并行处理的条件:①求解问题可划分为多个子问题;②子问题间具有低相关性;有了凸体的分解算法,复杂凸体的碰撞检测问题就可分解为多个简单四面体间的碰撞检测,满足了并行处理的第一个条件;每一对简单四面体间的碰撞检测与其它简单四面体间的碰撞检测基本上没有任何关系,满足了并行处理的第二个条件。

因此第一)部分的凸多面体的剖分算法完成后,就已经基本具备了并行处理的条件,在这个基础上完成并行处理算法是一件相对容易的事,因为所使用的碰撞检测算法基本没有改变,只不过是将两个复杂凸体间的碰撞检测问题分解为多个四面体间的碰撞检测,这种分解为机群(cluster)式的并行处理提供了非常好的处理粒度。若判断多面体a与多面体b是否发生碰撞,将多面体a分解为n个简单多面体a1,a2,……,an,将多面体b分解为m个简单多面体b1,b2,……,bm,再利用cluster结构或smp结构的并行机同时判断简单多面体ai,i=1,2,……,n,与简单多面体bk,k=1,2,……,m,是否发生碰撞,若有,则多面体a与多面体b有碰撞发生,否则没有。

本发明基于凸体剖分的并行碰撞检测算法较好提高碰撞检测速度,并行程序的执行时间应该是随着处理节点的增加而呈线性下降趋势,而实验的结果则证实了理论分析。通过该并行处理算法,若碰撞检测的时间达不到要求,还可以增加处理的节点来进一步提高速度,测试结果如下表:

表1碰撞检测程序运行测试结果(时间:ms)

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1