Sphere-AABB Intersecting test

作者:i_dovelemon

来源:CSDN

日期:2014 / 10  / 23

主题:Collision detection


引言

              在游戏开发中。常常会用到碰撞检測的技术。而在当中,关于Sphere(球体)和AABB(轴向包围盒)的碰撞尤为常见。今天就来记录下,怎样进行这两个基本几何体的碰撞检測。


算法概要

               进行Sphere和AABB包围体的碰撞。实际上就是一下的两个步骤:

               1.在AABB盒上,找到距离Sphere的圆心距离近期的点 P(closetPtToAABB)

                2.计算出这个点P与Sphere的圆心Q之间的距离,为了节省开销,可保留平方,即距离的平方值(d2)

                3.比較距离的平方值d2与Sphere的半径平方值r2,假设d2 <= r2,则说明。这个点在Sphere中,即发生了碰撞,反之则没有发生碰撞

                思路十分的简单。剩下的问题就是怎样求AABB盒上距离Sphere的圆心近期的点是哪一个?

                我们在表示AABB盒的时候,一般使用的都是MIN-MAX这种表示方法。而AABB又是轴向平行的,所以。讨论一个2D平面上的情况,就能够推广到3D空间中去。

                来看下。以下的图:

            

               对于空间中的不论什么一个点P,要求在AABB盒B上距离P点近期的点,实际上就是将P点的坐标改裁剪到在AABB盒上去。

比方上图左边的图,P点坐标裁剪完毕之后,就是AABB盒上的Q点,也就是说,假设P点的x坐标小于AABB盒的MIN坐标的x坐标,那么就相应的Q点坐标就是MIN的X坐标。

                  所以,求近期点的代码例如以下:

<span style="font-family:Microsoft YaHei;">void clostPtToAABB(AABB a, POINT p, POINT&q)
{
       if(p.x < a.min.x)  q.x = a.min.x ;
       else if(p.x > a.max.x) q.x  = a.max.x ;
       
       if(p.y < a.min.y) q.y = a.min.y ;
       else if(p.y > a.max.y) q.y = a.max.y ;
}</span>
               再有了近期点之后。仅仅要求Sphere的圆心和q点的距离,然后与Sphere的半径进行比較就可以。

                好了,代码非常easy,为此我给出了一个Demo实例,以下是Demo的截图:

                                                  

                 好了。今天就到这里。

                        

posted @ 2017-08-04 11:39  jzdwajue  阅读(182)  评论(0编辑  收藏  举报