【问题标题】:Axis-Aligned Bounding Box and Triangle collision in 3D space3D 空间中的轴对齐边界框和三角形碰撞
【发布时间】:2012-08-29 09:23:48
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java collision-detection collision


    【解决方案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 轴(法线)上的投影,然后在三角形轴(法线)上重复此操作,如果任何一项测试检测到间隙,则没有碰撞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 2011-04-21
      相关资源
      最近更新 更多