Vulkan

分离轴测试

 分离轴测试是空间碰撞检测中一个很常用、很有效的判断方法。它的原理来源于集合分析中的“分离超平面定理”(separating hyper-plane theorem):如果两个集合A和B不相交,那么必定存在一个分离超平面P,并使得A和B分别位于P的不相同的两侧。此定理对于空间数据中的凸集合和凹集合均适用。当数据集是凸集时这里的分离超平面就是一个空间的平面;当数据集是凹集时,这里的分离超平面则不再是一个空间的平面,而是一个空间的曲面。

sat1   

                                       用空间平面来分离两个凸集

 

sat2

     用空间曲面来分离一个凸集和一个凹集

 

在这里只讨论使用空间平面作为分离面的两个凸集合的分离测试,因为使用曲面的分离测试要比平面的分离测试复杂很多。对于分离两个凸集合的平面P,我们取平行于其法向量的一条直线作为这两个凸集合的分离轴。在这里,只是用分离面的法向量来限定了这条直线的方向,对于它的位置并末做限制,故而也可以将其看成是一个直线簇。

为了在分离轴上进行集合的相交测试,首先需要观察数据集合在分离轴上具有什么样的空间数学特性。如下图所示,设两个凸集的中心分别为CA、CB,分离它们的平面为P,相应的分离轴为L。首先计算得到两个集合中心之间的距离d,然后再分别求出两个凸集投影在在分离轴方向上的最大半径Ra、Rb(注意:这里的最大半径是向分离轴上投影而得到的,并非任意方向上的最大半径)。通过观察下图可以得到d、Ra、Rb之间的数学关系,即Ra + Rb < d。这即是两个凸集在分离轴上所具有的空间数学特性,也是下面我们利用分离轴进行相交性测试的依据。

sat3

 

对于两个凸集,我们要判断它们的空间关系,只需要寻找它们之间潜在的分离轴,然后判断在分离轴上是否满足分离条件,进而就可以得之。如果两个凸集不相交,那么必定存在能将它们分离开来的平面,也即必定存在满足分离条件的分离轴。这时,我们要做的就是找到所有潜在的分离平面,即潜在的分离轴。对于两个相交的由多面体组成的凸集,它们之间的相交方式可以归结为以下几种:面-面、面-边、面-点、边-边、边-点、点-点相交,而对于其中的点,又可以将它们处理为退化的边,这样一来就可以简化两个凸集间的相交方式为:面-面、面-边、边-边相交。对于上述三种简化的相交方式,我们就可以逐条考虑进而找到所有潜存的分离轴,这样我们就可以得到两个凸集之间潜在的分离平面可能存在于以下位置:

1.      凸集A中每个多边形所在的平面。

2.      凸集B中每个多边形所在的平面。

3.      凸集A中的每条边和凸集B中的每条边之间的公共垂面。

而对应的分离轴的方向为:

1.      凸集A中每个多边形的法向量。

2.      凸集B中每个多边形的法向量。

3.      凸集A中的每条边和凸集B中的每条边之间的公共垂面的法向量,即两条边方向向量的叉乘方向。

假设凸集A中含有FA个面、EA条边,凸集中含有FB个面、EB条边,这样就存在FA + FB + EA * EB条潜在的分离轴,某些情况下这个数量是巨大的,因而在实际情况中我们往往需要再根据具体几何体元的空间特征对其进行简化。比如,对于两个OBB之间的相交测试,由于OBB的六个面中两两相对的面是平行的,这样我们就可以将面-面之间的分离轴数目减少一半,同样也可以将边-边之间的分离轴数目减少一半,如此一来情况就简单了很多。

    总结上述内容,可以得到两个凸集之间用分离轴测试进行相交判断主要有以下几个步骤:

   1.      根据凸集的具体情况分析它们之间潜在的所有分离轴,并针对每条分离轴进行分离测试。

   2.      对于每条分离轴L,做投影计算得到d、RA、RB,并根据它们之间的关系得到分离关系。若d > RA +   RB则分离平面存在,即两个集合之间不相交,此时可以及时退出判断程序;反之,这两个集合在此分离轴下没有分离,但却也不能说明两个集合相交。

   3.      若对于所有潜在的分离轴判断的结果无法证实分离平面的存在,那么这两个凸集必定相交。

一般来说,在上述操作中代价最大的就是计算d、RA、RB的值,因为这些值对于每条待测试的分离轴都需要进行更新,而且也是数学计算最多的环节。最简单的方法就是对于每个集合,将集合中的所有顶点向分离轴上进行投影、比较并求最值而得到RA、RB,但是计算的复杂度与集合的规模是线性相关的,故而代价较大。因此,在实现中我们同样需要根据具体的几何集合的空间特性来进行相应的分析而简化这一步骤的操作。比如具体到特殊的AABB、OBB、Cyliner、Sphere等,我们均可以做出相应的简化进而提高相交测试的效率。

posted on 2012-01-05 21:43  Vulkan  阅读(370)  评论(0编辑  收藏  举报

导航