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

时间:2012-09-04 17:04:57

标签: java collision-detection collision

我一直在阅读“分离轴测试”,并且从所有帖子和文章中我都知道它们都是2D碰撞,而不是3D。我听说它更像是3D空间的“分离平面定理”,但在哪里可以找到有关这种方法与2D版本有何不同的信息,我不清楚。

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

我实施SAT的主要尝试位于:Implementation attempt

如果需要修改SAT,那么需要更改哪些内容才能在3D空间中成功实施?根据Christer Ericson的书实时碰撞检测,目前有13个轴需要测试。如果需要更改SAT,那么我认为会有更多的轴要测试,因为涉及第三轴。

  1. AABB的三面法线
  2. 三角形的一面法线
  3. 由两个边缘组合的叉积给出的九个轴
  4. 我需要了解是否需要修改SAT,以及推动修改方向和原因。如果不需要修改,我哪里错了?谢谢!

1 个答案:

答案 0 :(得分:1)

在阅读了许多不同的帖子,文章和论文(其中最好的资源是this文章)之后,我现在知道不需要对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轴(法线)上的那些,然后在三角轴(法线)上重复这一过程,如果任何一个测试检测到间隙,则没有碰撞。