java - 3D 空间中的轴对齐边界框和三角形碰撞

标签 java collision-detection collision

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

我应该使用 SAT,因为我正在尝试计算三角形是否与轴对齐边界框 (AABB) 相交。我不需要知道交集发生在哪里,只需要知道交集发生或未发生的 boolean 结果。

我在实现 SAT 方面的主要尝试位于此处:Implementation attempt .

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

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

我需要了解 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/

相关文章:

swift - SpriteKit PhysicsBody 没有应用我的贝塞尔曲线

javascript - 碰撞检测问题还是我的逻辑

java - 为什么我收到异常 javax.net.ssl.SSLPeerUnverifiedException : peer not authenticated?

java - java中为什么byte类型可以用&0xff做无符号右移操作?

java - 谷歌Guice : use injected factory to instantiate multiple objects in a class?

java - Google Appengine 上的 GWT 上传 - 跨站点保护

math - 加速球体之间的碰撞检测

javascript - Canvas 中的多边形边缘处理和检测

physics - 从另一个圆反射一个圆

objective-c - cocoa 碰撞检测问题