我阅读了大量有关“分离轴测试”的内容,从所有帖子和文章中我了解到它们都是针对 2D 碰撞,而不是 3D。我听说它更像是 3D 空间的“分离平面定理”,但我不清楚在哪里可以找到有关此方法与 2D 版本有何不同的信息。
我应该使用 SAT,因为我正在尝试计算三角形是否与轴对齐边界框 (AABB) 相交。我不需要知道交集发生在哪里,只需要知道交集发生或未发生的 boolean 结果。
我在实现 SAT 方面的主要尝试位于此处:Implementation attempt .
如果 SAT 需要修改,那么需要修改什么才能在 3D 空间中成功实现?根据 Christer Ericson 在他的《实时碰撞检测》一书中的说法,目前有 13 个轴需要测试。如果SAT需要改变,那么我认为会有更多的轴需要测试,因为涉及到第三个轴。
- 来自 AABB 的三个面法线
- 一个面与三角形垂直
- 由两个边组合的叉积给出的九个轴
我需要了解 SAT 是否需要修改,以及修改的方向和原因。如果不需要修改,我错在哪里?谢谢!
最佳答案
在阅读了许多不同的帖子、文章和论文(其中最好的资源是 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 轴(法线)上的投影,然后在三角形轴(法线)上重复此操作,如果任何一项测试检测到间隙,则不存在间隙碰撞。
关于java - 3D 空间中的轴对齐边界框和三角形碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12268200/