天天看点

碰撞检测入门

在3D游戏开发、虚拟现实应用开发中,碰撞检测问题是最常见,也是最基本的。很傻很天真的办法就是遍历场景中所有的物体,每两个物体之间做相交测试,相交即发生碰撞,然后对碰撞的问题做出相应的反应,比如用动量守恒、能量守恒、甚至包括K/d的诡异搞法。这是这个问题的大致流程。

物体多了,怎么办?普遍常用的一种方法是,对场景空间进行划分,对场景的物体构建包围盒的二叉树结构,比如AABB.OBB树等。这次,主要针对这两种方法做一个简单的介绍,为毕业设计提供文字素材,方便ctrl c + ctrl v。

AABB包围盒(Aligned Ax is Bounding Box)

其实就是沿着坐标轴的包围盒,它是包含几何对象且各边平行于坐标轴的最小六面体。构造时根据物体的形状和状态取得坐标X , Y , Z 方向上的最大最小值就能确定包围体最高和最低的边界点。AABB 包围体的边界总是与坐标轴平行, 它的平面与其相应的坐标平面相平行。一个AABB 包围体通常可以用物体中心点和三个方向上的跨度来表示, 还可以用其向三个坐标轴的投影的最大最小值来表示。但是前一种表示方法在两包围体进行相交测试时比第二种的运算量要多一些。两种表示法分别如下:

包围体AABB1 { ( x0, y0, z0 ) , ( length, width,height) } ;

包围体AABB2{  ( min x1, min y1, min z1) , ( maxx1, max y1, max z1) } ;

检测两个AABB 包围体是否相交非常简单, 只要利用投影法: 当且仅当三个坐标轴上的投影均重叠, 两个AABB 包围体才相交。只要存在一个方向上的投影不重叠, 那么它们就不相交。所以检测两个AABB 包围体是否相交最多只需要6次比较运算。

特点:从这个流程看,没有复杂的构造和相交测试,特别是和OBB做比较后,其效率的优势很明显。但是其缺点是,由于包围盒的三个方向轴必须是坐标轴的三个方向轴,导致其包围盒对于有些物体仍然没有紧密的包围。那么,怎么样才能更加紧密的包围呢?改变方向轴,缩小包围盒的体积。就这样,obb就诞生了。。。

OBB( Oriented Bounding Box )

obb的构造相对较复杂,其关键在于包围盒最佳方向的确定,即确定三个方向轴,使其包围盒的体积最小。其构造的方法如下(自顶向下):

1、计算物体的所有定点的平均值

碰撞检测入门

2、计算协方差矩阵C

碰撞检测入门

3、由协方差矩阵的三个特征向量进行单位化后,作为包围盒的三个方向轴,物体在三个方向的最大和最小投影值作为包围盒的大小,同时可以求出三个方向轴包围盒的中心值。

OBB在做相交测试时,对于任意的两个OBB,每个OBB有三个方向轴,任意两个轴组成一个面,求出这个面的法向量,计算这两个OBB在这个法向量上的投影,判断是否有重合部分。这样两个obb一共要进行C62 = 15次计算。

特点:方向任意,紧密性好,精度高,但是效率很低。