一种基于SIMD的k-DOP包围盒碰撞检测方法

文档序号:6423016阅读:1020来源:国知局
专利名称:一种基于SIMD的k-DOP包围盒碰撞检测方法
技术领域
本发明属于计算机检测技术领域,具体涉及一种基于SIMD(单指令多数据流)的 k-DOP包围盒碰撞检测方法。
背景技术
包围盒层次结构(BVH)是一种针对三角形网格模型进行高效碰撞检测的重要工具。各种BVH,如球(Sphere)树,轴对齐包围盒(AABB)树,定向包围盒(OBB)树,离散定向多面体(k-DOP)树等,这些层次结构通常采用自顶向下的方法进行构造,被广泛应用于刚体或柔性物体的碰撞检测。而柔性物体的BVH的快速更新技术(如重新整理、动态或选择性重构等),已成为本领域诸多研究者的关注热点。对于柔性物体,除了需要考虑包围盒的紧凑性外,包围盒整理和重构的效率也至关重要。图1为AABB、8-D0P和OBB三种包围盒的示意图,对于简单的包围盒如Sphere、 AABB,其整理和构造十分快捷,但紧凑性较差;对于复杂的包围盒如0ΒΒ,虽然较为紧凑,但整理和构造的计算量较大;作为折中选择,k-DOP兼具紧凑性和高效性,因此常被用于柔性物体的包围盒层次结构。目前传统的k-DOP包围盒碰撞检测方法,都是采用串行的实现方式来完成碰撞检测,k-D0P包围盒在重构和整理过程中的指令数目过多,执行起来非常耗时,且实时性差,在机器人运动路径规划、物理仿真、视频游戏等实时性要求较高的应用中,无法满足相应的碰撞检测要求。

发明内容
本发明提供了一种基于SIMD的k-D0P包围盒碰撞检测方法,充分利用SIMD的指令级并行处理能力,加速了包围盒构造或重构、BVH(包围盒层次结构)建立或更新以及包围盒重叠测试的过程,大大提高了碰撞检测速度。一种基于SIMD的k-D0P包围盒碰撞检测方法,包括如下步骤(1)使用SIMD指令对待检测的三角形网格柔性场景模型中的每个三角形构造对应的k-D0P包围盒,进而建立所述的三角形网格柔性场景模型的包围盒层次结构;(2)根据所述的包围盒层次结构,构建包围盒测试树,使用SIMD指令对包围盒测试树进行包围盒重叠测试,输出存在包围盒重叠的叶节点;(3)对输出的叶节点对应的两个k-D0P包围盒内的三角形对进行精确碰撞检测。优选的技术方案中,所述的步骤(1)中,当进行第η次碰撞检测时,包围盒层次结构是根据第η次碰撞检测时刻每个三角形的空间位置,使用SIMD指令对上一次碰撞检测过程中的包围盒层次结构中最底层的k-D0P包围盒进行重构,进而使用SIMD指令自底向上对上一次碰撞检测过程中的包围盒层次结构进行整理更新而成的,η为大于1的自然数;相应的提高了碰撞检测速度。优选的技术方案中,所述的步骤O)中,当进行第η次碰撞检测时,所述的包围盒测试树为上一次碰撞检测过程中的包围盒测试树;相应的提高了碰撞检测速度。优选的技术方案中,所述的k-DOP包围盒为16-D0P包围盒,保证了碰撞检测过程的高效性。本发明的有益技术效果是通过利用SIMD的指令级并行处理能力,减少了碰撞检测操作过程中的指令数目,加速了包围盒构造或重构、BVH建立或更新以及包围盒重叠测试的过程,缩短了碰撞检测的时间,与传统的碰撞检测方法相比可获得约4倍的速度提升,具有良好的兼容性,可与任务级并行处理形成有效互补,从而提高了整体的并行加速比。


图1(a)为AABB包围盒的示意图,图1(b)为8-D0P包围盒的示意图,图1 (c)为 OBB包围盒的示意图。图2为本发明碰撞检测方法的步骤流程示意图。图3为16-D0P包围盒在浮点向量中的数据布局图。图4(a)为BVH的结构示意图,图4(b)为BVTT的结构示意图。
具体实施例方式为了更为具体地描述本发明,下面结合附图及具体实施方式
对本发明的碰撞检测方法进行详细说明。如图2所示,一种基于SIMD的16-D0P包围盒碰撞检测方法,包括如下步骤(1)使用SIMD指令构建BVH。使用SIMD指令对待检测的三角形网格柔性场景模型中的每个三角形构造对应的 16-D0P包围盒,进而建立三角形网格柔性场景模型的包围盒层次结构;当进行第η次碰撞检测时,包围盒层次结构是根据第η次碰撞检测时刻每个三角形的空间位置,使用SIMD指令对上一次碰撞检测过程中的包围盒层次结构中最底层的16-D0P包围盒进行重构,进而使用SIMD指令自底向上对上一次碰撞检测过程中的包围盒层次结构进行整理更新而成的,η为大于1的自然数。为每个三角形构造对应的16-D0P包围盒首先将被包围三角形的顶点分别在各个方向上进行投影,然后判断这些投影是否落在包围盒的外部,如果落在包围盒外部,需要对该方向上包围盒的范围进行调整,保证该投影恰好落在边界上;对于16-D0P包围盒,任何一个三角形顶点都需要做16次比较,判断这个点是否落在包围盒内部。本发明使用SIMD 指令并行地完成这个比较工作,共调用了 mm_min_ps、mm_max_ps、mm_setr_ps这三条SIMD 指令各2次,即可完成16-D0P包围盒的重构。其中,mm_setr_ps指令的作用是将4个浮点数送入1个浮点数向量数据中(如图3所示),mm_min_pS指令用来并行更新在4个方向上投影的最小值,mm_max_ps指令用来并行更新在4个方向上投影的最大值。将每个三角形对应的16-D0P包围盒,作为BVH中最底层的16-D0P包围盒。在第一次碰撞检测时,采用自顶向下的方法构建BVH,首先计算出这些三角形的中心,将这些三角形中心投影到直角坐标系的某个坐标轴上,依据投影的正负,可以把它们分成两部分,分别为它们构造包围盒。然后采用同样的方式,对这两个包围盒进行细分,直到包围盒中只包含一个三角形。如图4(a)所示,有一个由a、b、c、d四个三角形组成的场景Al,首先计算出这些三角形的中心,将这些三角形中心投影到某个坐标轴上,依据投影的正负,可以把它们分成两部分,一部分记为Bi,另一部分记为B2,分别为Bl和B2构造包围盒。然后采用同样的方式,对B1、B2进行细分,直到包围盒中只包含一个三角形。在随后的碰撞检测过程中,只需要对BVH中的非底层的包围盒大小进行重新计算。这是一个自底向上的计算过程,需要将每个非底层的两个子16-D0P包围盒合并为一个大的16-D0P包围盒。本发明使用SIMD指令并行地完成这个比较工作,共调用了 mm_min_ ps、mm_max_ps这2条SIMD指令各2次。其中,mm_min_ps用来并行更新在4个方向上投影的最小值,mm_max_ps用来并行更新在4个方向上投影的最大值。(2)构建BVTT,使用SIMD指令对BVTT进行包围盒重叠测试。根据包围盒层次结构,构建BVTT(包围盒测试树),使用SIMD指令对包围盒测试树进行包围盒重叠测试,输出存在包围盒重叠的叶节点;当进行第η次碰撞检测时,包围盒测试树为上一次碰撞检测过程中的包围盒测试树。首先,采用自顶向下的构建方法构造BVTT,如图4所示,在图4(a)中已经对整个场景构造了一个BVH;相应地,图4(b)就是针对图4(a)场景而构建的一个BVTT。BVTT的根节点(Al,Al)就是Al的自碰撞检测对,然后提取出Al的两个子包围盒 Bl和B2,分别对Bl和B2做自碰撞检测,另外还需要检测Bl和B2之间是否发生碰撞,即比较两个16-D0P包围盒之间是否有重叠。这个过程可以概括为在这16个方向上比较两个包围盒是否有交集;如果在某个方向上没有重叠,则停止比较并且判定两个包围盒没有重叠。如果在所有方向上都有重叠,并且Bl有子包围盒a和b,则采用与处理Bl和B2相同的方法,判断Bl的两个子包围盒a和b是否与B2发生碰撞;如果在所有方向上都有重叠,并且Bl没有子包围盒,但是B2有子包围盒c和d,则与处理Bl和B2相同的方法,判断B2的两个子包围盒c和d是否与Bl发生碰撞;如果在所有方向上都有重叠,并且Bl和B2都已经是最底层包围盒,没有子包围盒,输出Bl与B2对应的叶节点。本实施方式使用SIMD指令并行地完成16-D0P包围盒间的重叠测试。通过调用 mm_cmpgt_ps禾口 mm_cmplt_ps指令,同时可以进行4路比较操作,然后使用mm_movemask_ps 判别出如果任意一路重叠测试失败,则可以立即得出这两个16-D0P包围盒不可能发生碰
撞的结论。(3)对包围盒进行精确碰撞检测。对输出的叶节点对应的两个16-D0P包围盒内的三角形对进行精确碰撞检测。对两个16-D0P包围盒对应的两个三角形,使用元素测试进行精确计算,得到碰撞发生的第一碰撞时间。这个过程中,将两个三角形之间的碰撞检测问题,转化为顶点与三角形的碰撞检测以及边与边的碰撞检测。本实施方式通过使用SIMD指令,极大地减少了针对16-D0P包围盒碰撞检测操作过程中的指令数目,缩短了碰撞检测的时间。由于在任何支持SIMD指令的CPU上都可以使用,因此本发明具有很好的兼容性。
权利要求
1.一种基于SIMD的k-DOP包围盒碰撞检测方法,包括如下步骤(1)使用SIMD指令对待检测的三角形网格柔性场景模型中的每个三角形构造对应的 k-DOP包围盒,进而建立所述的三角形网格柔性场景模型的包围盒层次结构;(2)根据所述的包围盒层次结构,构建包围盒测试树,使用SIMD指令对包围盒测试树进行包围盒重叠测试,输出存在包围盒重叠的叶节点;(3)对输出的叶节点对应的两个k-DOP包围盒内的三角形对进行精确碰撞检测。
2.根据权利要求1所述的基于SIMD的k-DOP包围盒碰撞检测方法,其特征在于所述的步骤(1)中,当进行第η次碰撞检测时,包围盒层次结构是根据第η次碰撞检测时刻每个三角形的空间位置,使用SIMD指令对上一次碰撞检测过程中的包围盒层次结构中最底层的k-DOP包围盒进行重构,进而使用SIMD指令自底向上对上一次碰撞检测过程中的包围盒层次结构进行整理更新而成的,η为大于1的自然数。
3.根据权利要求1所述的基于SIMD的k-DOP包围盒碰撞检测方法,其特征在于所述的步骤⑵中,当进行第η次碰撞检测时,所述的包围盒测试树为上一次碰撞检测过程中的包围盒测试树。
4.根据权利要求1或2所述的基于SIMD的k-DOP包围盒碰撞检测方法,其特征在于 所述的k-DOP包围盒为16-D0P包围盒。
全文摘要
本发明公开了一种基于SIMD的k-DOP包围盒碰撞检测方法,包括(1)使用SIMD指令构建BVH;(2)构建BVTT,使用SIMD指令对BVTT进行包围盒重叠测试;(3)对包围盒进行精确碰撞检测。本发明通过利用SIMD的指令级并行处理能力,减少了碰撞检测操作过程中的指令数目,加速了包围盒构造或重构、BVH建立或更新以及包围盒重叠测试的过程,缩短了碰撞检测的时间,与传统的碰撞检测方法相比可获得约4倍的速度提升,具有良好的兼容性,可与任务级并行处理形成有效互补,从而提高了整体的并行加速比,尤其适应用于机器人运动路径规划、物理仿真、视频游戏等技术领域中。
文档编号G06F11/00GK102253862SQ20111010406
公开日2011年11月23日 申请日期2011年4月26日 优先权日2011年4月26日
发明者唐敏, 杜鹏, 童若锋, 赵杰伊 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1