OBBs具有位置(x,y)、速度(x,y)和方向(矩阵)。给定周期性更新,OBBs必须相互碰撞,并返回被视为成功的移动部分的比例。我查看了GPWiki上的多边形测试-http://gpwiki.org/index.php/Polygon_Collision-但它没有考虑到移动物体或完全在OBB内的物体。书籍《实时碰撞检测》第4章涵盖了3D OBBs:包围体积,但在3维中进行测试的方法明显比2D更复杂。
另一个建议(涵盖包含,我认为更便宜):
检查#1的4个顶点是否在#2中,然后检查#2的4个顶点是否在#1中。以下是我的建议:
假设您正在检查的#1顶点是v,#2的4个顶点是v1 ... v4。通过#2的方向逆旋转五个顶点(称为#2'),使第二个盒子轴对齐 - 您可以立即检查v'是否包含在其中。
如果您发现任何#1顶点在#2内 - 停止,您有交集。否则继续。
有一些优化立即浮现在脑海中(也许您可以在每个盒子中存储未旋转的顶点副本?如果大小固定,也许您可以将它们与立即消除其中一种可能的容纳,从而节省3个潜在测试?),但是除非您将其应用于数以亿计的箱对,否则此测试应该足够便宜。
关于运动,您可以深入探讨 - 查找“连续碰撞”,并自行查看。(我特别记得Stephane Redon的一些不错的作品)。我由衷地相信,没有任何游戏做出这些花哨的东西:如果您确实移动得非常快,可以将时间步长细分,并在每个位置/方向子迭代上执行碰撞检查。
(编辑:)这里还有另一个讨论 链接,提供了很好的参考。
编辑:一个粗略的伪代码(结合了评论中讨论的内容)如下:
...test for intersections between the OBB edges...
if any intersections are found{
...run code for when OBBs are partially overlapping...
}else{
P = line segment whose endpoints are the OBB centers;
...test for intersections between P and OBB edges...
if P intersects edges of both OBBs{
...run code for when OBBs are not touching...
}else{
...run code for when one OBB is completely inside the other...
}
}
这个过程不仅可以应用于边界框,还可以应用于边界球或凸包、多边形或完整的3D对象。最终结果是,随着物体在空间和时间中的运动,它们的表面是否碰撞或者它们是否相互包含。如果你的粒度太粗,在你模拟的情况下它们应该碰撞,但它们最终却擦肩而过,那么你应该进行额外的射线边界相交测试,以查看一个物体中心加权点是否与其他物体的边界相交。