2012-09-04 51 views
0

我一直在阅读“分离轴测试”以及所有帖子和文章的大量内容,我得到的想法是它们都是2D碰撞,而不是3D。我听说它更多的是3D空间的“分离平面定理”,但是在哪里可以找到有关这种方法与2D版本的区别的信息,我不清楚。三维空间中的轴对齐边界框和三角形碰撞

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

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

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

  1. 三个法线从AABB
  2. 一面正常从三角形来自两个

通过边缘的组合的横产品给出

  • 九轴I需要,如果SAT理解需要修改,并推动修改方向和原因。如果不需要修改,我会在哪里出错?谢谢!

  • 回答

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