三维空间中的轴对齐边界框和三角形碰撞



我读了很多关于"分离轴测试"的文章,从所有的帖子和文章中,我都认为它们都是针对2D碰撞的,而不是3D碰撞。我听说这更像是3D空间的"分离平面定理",但我不清楚在哪里可以找到关于这种方法与2D版本有何不同的信息

我应该使用SAT吗,因为我正在尝试计算三角形是否与轴对齐边界框(AABB)相交。我不需要知道交叉点发生在哪里,只要一个布尔结果,如果它发生或没有发生。

我实现SAT的主要尝试位于这里:实现尝试。

如果SAT需要修改,那么需要改变什么才能在3D空间中成功实现?根据Christer Ericson在《实时碰撞检测》一书中的说法,目前有13个轴需要测试。如果SAT需要更改,那么我认为会有更多的轴需要测试,因为涉及到第三个轴。

  1. AABB的三个面法线
  2. 三角形的一个面法线
  3. 由两个边组合的叉积给出的九个轴

我需要了解SAT是否需要修改,以及在哪里修改以及为什么修改。如果不需要修改,我哪里会出错?谢谢

在阅读了许多不同的帖子、文章和论文(其中最好的资源是本文)后,我现在知道无需对SAT进行修改即可进行3D碰撞检测。

尽管我的实现仍然存在一些问题,但我可以说,对于AABB(立方体),您必须测试3个曲面法线,对应于x、y和z轴。对于三角形,看起来需要有4条法线,每条边一条,曲面一条(我不完全确定三角形的法线,因为我还需要测试。我尝试了一条法线,80%都能工作)。

对于AABB(立方体),法线是通过获得曲面的两条垂直边并获得这两条边的叉积来计算的。

// Surface 1/3 (x, y, z - one surface for each)
Vector3d edge1 = new Vector3d();
Vector3d edge2 = new Vector3d();
Vector3d normal1 = new Vector3d();
// Get the edges, the two edges must be perpendicular to one another.
edge1.sub( point0, point1 );
edge2.sub( point0, point4 );
normal1.cross( edge1, edge2 );
normal1.normalize();

三角形曲面法线的计算方法相同。

之后,SAT获取AABB和三角形的投影,并测试AABB轴(法线)上的投影,然后在三角形轴(法线(normals))上重复此操作,如果任何一个测试检测到间隙,则不存在碰撞。

最新更新