基于GJK的凸体快速连续碰撞检测研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于GJK的凸体快速连续碰撞检测研究
作者:刘丽等
来源:《河北科技大学学报》2014年第05期
摘要:针对一段时间内的多个运动物体之间的碰撞检测,提出一种基于距离算法(GilbertJohnsonKeerthialgorithm,GJK算法)的凸体快速连续碰撞检测算法,该算法主要通过判断一段时间内两物体之间的最小距离是否为零来检测碰撞发生情况。首先利用GJK算法在有限步骤内计算得到最小距离,检测两物体是否发生碰撞;若两物体发生碰撞,进而利用raycasting算法确定发生碰撞的精确位置,根据环境要求做出相应响应,调整运动物体位置。仿真结果表明,对多个运动物体间的连续碰撞检测,该算法有较高的实时性和准确性。
关键词:连续碰撞;GJK算法;运动物体;碰撞检测;凸体
中图分类号:TP391.9文献标志码:A
Abstract:This paper presents a fast continuous collision detection algorithm to dealing with moving multiple convex objects within a period of time, which is based on the GilbertJohnsonKeerthi algorithm. The algorithm is determined by whether the minimum distance between the two objects within a period of time is zero to detect the occurrence of a collision. First,the algorithm utilizes GJK algorithm to calculate the minimum distance between the two objects and to detect the collision in finite steps. If two objects collide, then, determine the precise collision position of two objects based on the raycasting algorithm, and respond according to the environmental requirements, adjust two objects' location. The simulation results show that this algorithm has high realtime and accurate characteristics for continuous collision detection between multiple moving objects.
Key words:continuous collision; GilbertJohnsonKeerthi(GJK) algorithm; moving objects; collision detection; convex objects
碰撞检测在计算机图形学、CAD/CAM、虚拟现实、虚拟制造、三维游戏等诸多领域都有广泛的应用,是提高虚拟场景物理真实感的关键问题之一[14]。按照场景模式不同,碰撞检测主要分为静态检测和动态检测。动态检测针对场景中至少存在一个运动物体的情况;根据碰撞检测方式的不同,动态检测分为离散检测和连续检测[5]。离散碰撞检测算法是对运动物体进行取样检测,因此容易造成漏检测,进而产生穿透现象[6]。针对两物体间的穿透现象,连续碰撞检测算法通过对一段连续时间内物体的运动过程进行建模,判断两物体之间的碰撞情况,可以很好地解决漏检测问题[6],但计算量相对较大。目前,虚拟环境的场景复杂度越来越高,对碰撞检测的实时性及准确性的要求也越来越高。因此,提高检测实时性及准确性是连续碰撞检测要解决的关键问题。
经过多年发展,目前已有多种连续碰撞检测算法,主要有基于扫描实体的算法[78],应用Minkowski和与球面高斯映射相结合的方法[9],保守前进算法及其改进算法[10],基于GJK的算法[1113]以及张应中等提出的线性连续碰撞检测(linear continuous collision detection,LCCD)算法[13]等。其中,基于扫描实体的方法及应用Minkowski和与球面高斯映射相结合的方法计算量都较大,不适合实时碰撞检测;基于CA及其改进算法虽然提高了检测精度和速度,但其本质仍属于基于步长的碰撞检测;LCCD算法适用于简单凸体之间的碰撞检测。
为提高碰撞检测的快速性及精确度,针对多个凸体之间的连续碰撞检测,本文提出一种基于GJK的快速连续碰撞检测(fast continuous collision detection,FCCD)算法。该算法以Minkowski差集为工具,可在有限步骤内计算得到两物体间的最小距离,检测两物体是否发生碰撞,加快碰撞检测速度,并利用raycasting算法计算得到凸体间第一次发生碰撞的位置,及时作出碰撞响应。最后通过仿真对本文算法和LCCD算法进行了比较,仿真结果表明该算法具有较高的实时性和准确性。
1GJK算法概述
GJK算法是本文算法的基础,下面对GJK算法涉及到的相关几何理论、概念以及GJK算法的基本理论进行介绍。
1.1相关定义
定义1:d单形体是指d维空间内,仿射无关的点集形成的凸包。如0是单形体是指一个点;1是单形体是指一条线段;2是单形体是指一个三角形;3是单形体是指一个四面体[14]。
GJK算法通过在CSO边界上降序迭代求得CSO中距离原点最近的点。在每次迭代过程中,在CSO中生成一个单形体,并且确保其所含顶点比上一次迭代中产生的单形体更接近于原点。定义Wk是在第k次迭代过程中生成的单形体,始终包含1到4个顶点;vk是这个单形体中距离原点最近的点,通过“距离子算法”(或Johnson算法)计算得到vk[14]。对于凸体对象,GJK算法可通过有限步的迭代运算返回最终结果。GJK算法的迭代过程如下。
初始条件时,W0=,v0为CSO中任意点。
1)初始化单形体Wk为CSO中一个或多个顶点(最多为4个)。
2)通过距离子算法计算得到vk。
3)若vk为原点,则原点就在CSO中,A,B两物体发生碰撞。GJK算法结束并返回“A,B相交”。
4)针对Wk中不包含顶点vk的子单形体,将其顶点从单形体中移除。