0

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

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

我实施 SAT 的主要尝试位于此处:实施尝试

如果 SAT 需要修改,那么需要进行哪些修改才能在 3D 空间中成功实施?因为根据 Christer Ericson 的著作Real-Time Collision Detection中的说法,目前有 13 个轴需要测试。如果需要更改 SAT,那么我认为会有更多的轴要测试,因为涉及到第三个轴。

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

我需要了解 SAT 是否需要修改,并推动修改的方向和原因。如果不需要修改,我哪里出错了?谢谢!

4

1 回答 1

1

在阅读了许多不同的帖子、文章和论文(其中最好的资源是这篇文章)之后,我现在知道不需要对 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();

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

After that the SAT takes the projections of the AABB and the triangle and tests those on the AABB axes (normals) then this is repeated on the triangle axes (normals) and if any one of the tests detects a gap there is no collision.

于 2012-09-08T01:00:44.563 回答