一种基于剖分的并行碰撞检测方法 【技术领域】
本发明涉及计算机动画、仿真机器人以及虚拟现实领域,具体的说是一种任意物体之间的碰撞检测方法。
背景技术
碰撞问题作为计算几何、计算机动画、仿真机器人和虚拟现实等领域中的一个经典问题,多年来一直受到较多的关注。计算几何领域的研究者们对多面体的交集等问题产生了兴趣,之后又意识到解决碰撞问题自身比求交集问题更有意义。这些算法虽然在异常的情况下较为有效,但往往由于过于理论化,而难以实现。在仿真系统中,碰撞问题主要是集中于为在障碍物间运动的物体作碰撞检测和物体的碰撞响应上。在有关虚拟现实的应用中,碰撞检测的实时性成为最突出的问题之一。人们尝试对物体用不同的表示方法来加速碰撞检测过程,如八叉树表示法,CSG表示法,边界表示模式(B-Rep),现在,很多采用层次包围盒技术来加速多面体场景的碰撞检测,另外提出了一种空间分割技术的方法。
传统的多物体间的碰撞检测算法一般时间复杂度为O(n2),不能满足实时性的要求,而且大多是集中式串行处理方法,不利于碰撞检测快速实现。八叉树和其它几何模型在解决碰撞检测的框架之间的几何干涉问题时,不会大幅度提高算法效率。采用层次包围盒技术来加速多面体场景的碰撞检测,但包围盒方法作为一个整体的方法,检测精度低,效率提高并不明显。另外提出了一种空间分割技术的方法,影响该算法效率的一个重要因素是分区的多少,而分区的数目又较难把握。
【发明内容】
本发明的目的是提供一种性能良好的基于剖分的并行碰撞检测方法,不但能适用于任意物体动态碰撞检测,并在保证高精度前提下,有效地满足碰撞检测的实时要求。本发明的技术方案如下所述。
一种基于剖分的并行碰撞检测方法,其包含以下步骤:
a、将碰撞检测问题中涉及的多面体剖分为若干个四面体,则两个复杂的多面体间的碰撞检测问题变更为多个四面体间的并行碰撞检测;
b、采用并行处理的方式分别解决上述多个四面体间的碰撞检测;
其中,将多面体剖分为若干个四面体的剖分方法包含如下步骤:
步骤1:判断多面体的类型,若是简单多面体,转向步骤2,若为凸多面体,转向步骤3,若为非凸多面体,转向步骤4;
步骤2:调用简单多面体V(F,O)剖分为系列四面体的算法:DivideV(F,O),转向步骤5;
步骤3:调用凸多面体的剖分算法:DivideConvex(V);
步骤4:调用非凸多面体的剖分算法:DivideNonconvex(V),转向步骤5;
步骤5:判断多面体是否已剖分为系列四面体,如没有,转向步骤1,否则结束。
其中,所述的简单多面体V(F,O)剖分为系列四面体的算法:DivideV(F,O)的方法包含如下步骤:
步骤1:将组成V(F,O)的原多面体的面F按Delaunay三角划分,剖分成几个三角形;
步骤2:这些三角形分别与顶点O构成一系列四面体;
步骤3:将这些四面体分别剖分出去。
其中,所述的凸多面体的剖分算法:DivideConvex(V)包含如下步骤:
步骤1:任取多面体的一个面F,一个顶点O(O不是面F的顶点);
步骤2:将顶点O与面F的各个顶点相连接,得简单多面体V(F,O);
步骤3:将V(F,O)剖分出去,得一新多面体V’;
步骤4:调用DivideV(F,O),将V(F,O)剖分为系列四面体。
其中,所述的非凸多面体的剖分算法:DivideNonconvex(V)包含如下步骤:
步骤1:任取多面体的一个面F;
步骤2:找出所有符合以下条件的顶点:顶点位于面F的反侧,而该面位于该顶点的反向;
步骤3:求出每个顶点到面的垂直距离;
步骤4:判断是否还有其它未处理的面,如有,转向步骤2;如没有,转向步骤5;
步骤5:在求得的所垂直距离中,找出距离最短的一组:即面F与顶点O;
步骤6:将顶点O与面F地各个顶点相连接,得简单多面体V(F,O);
步骤7:将V(F,O)剖分出去,得一新多面体V’;
步骤8:调用DivideV(F,O),将V(O)剖分为系列四面体。
本发明的一个优选的技术方案是在步骤(a)之前加入如下的步骤:用体积略大而几何特性简单的包围盒来描述多面体,接着通过判断包围盒是否重叠来计算两多面体是否碰撞;如果用包围盒作碰撞检测,没有发生碰撞时,则两个多面体一定没有发生碰撞,如果用包围盒作检测,检测到发生了碰撞,则需要对多面体按步骤(a)、(b)做碰撞检测。
本发明的一个优选的技术方案是通过构造树状分层结构包围盒一步步逼近所述的多面体,以提高检测精度。
本发明提出了一种快速并行碰撞检测方法。与以往方法相比,不但进一步降低了多个物体间的碰撞检测的时间复杂性,而且方法具备良好的通用性,能很好地适用于各种运动形式的任意物体的碰撞检测,实时进行物体运动状态更新,完成动态碰撞检测。同时也很好地保证各仿真节点的自治性和仿真监控系统的可扩展性。
【具体实施方式】
现结合实施例,对本发明做进一步的描述。
实施例
本实施例采用MPI编程模型来模拟并行碰撞检测方法,MPI程序设计模式主要有两种:对等模式和主从模式,MPI并行程序实际上是分布在多台计算机上的多进程程序,进程间的通信与调度由MPI库来实现。在进行程序设计时,采用了主从模式,主控进程控制数据的同步,辅助进程用于计算是否发生碰撞。下面简要地介绍一下这两个进程。主控进程函数,它首先生成物体A,B的包围盒树,然后接收辅助进程发送的数据请求消息或碰撞发生消息,若已经发生了碰撞或物体A,B的所有结点数据都已发送给辅助进程计算,则通知该辅助进程可以退出;否则把物体A,B的下一个结点数据发送给该辅助进程计算。如此重复,直到所有的辅助进程都已退出。
辅助进程向主控进程发送数据请求消息或碰撞发生消息,接着接收主控进程发送的数据,若数据的第一位是0,则表示是结点的数据,就可以计算是否发生碰撞;若是1,则表示其他进程已检测到碰撞,该辅助进程退出;若是2,则表示所有的数据已计算完毕,该辅助进程退出。
MPI并行检测方法程序在PIII 700,RAM 256M,Linux 7.2的集群计算机上测试,MPI并行程序采用了多个节点来计算,每个节点就是一台双CPU的计算机,每个节点上运行一个测试进程,用了4个节点,测试结果如表1所示。
表1碰撞检测程序运行测试结果
现在再把基本碰撞检测方法与并行检测方法的测试数据对比分析,并行检测方法的并行加速比接近2∶1,本发明所述的并行碰撞检测方法与基本碰撞检测方法相比在时间效率上有了较大的提高,而且,并行检测方法的检测时间将随着并行机CPU数目的增加而呈线性下降趋势。因此通过该并行检测方法,若碰撞检测的实时性达不到我们的要求,则还可以增加处理的节点来进一步减少计算的时间,故本并行检测方法也具有良好的可扩展性。若运用包围盒树的方法实现的并行碰撞检测,则进一步提高检测方法的速度。