3D分离轴定理,要测试的轴是什么?

时间:2011-08-09 06:30:33

标签: c++ algorithm math vector collision-detection

我知道我需要在一堆轴上投影我的多面体的顶点,我读过这些轴是一个多面体的每个面的法线(或者它们都是?)。我还读过,我使用一个可碰撞的每个边缘的交叉积与另一个可碰撞的每个边缘。所以假设我有2个多面体,每个有8个面和12个边。因此会有8 +(12 * 12)= 152轴进行投影,然后进行测试?这是对的吗?

此外,因为我不知道我的脸是CW还是CCW,我的法线可能指向内部或外部,这有关系吗?例如,假设我投影到一个轴上,该轴是面向内部的一个形状的法线,只要两个多面体都使用相同的法线投影,这会影响算法吗?

感谢您的任何意见!

2 个答案:

答案 0 :(得分:3)

该定理说您将多面体投影到2D平面,如果找到一个它们不重叠的轴,它们就不会发生碰撞。问题是以最少的尝试找到正确的平面/轴。因此,如果它们在边缘碰撞,则使用多面体面的法线作为分离测试轴以及它们的交叉积进行测试。

在您的示例中,如果您有2个多面体,每个面对8个面和12个边,则首先测试每个多面体的8个法线作为分离轴。如果它们中的每一个都是分离轴,则可以假设多面体不会发生碰撞。然后,您可以检查法线的叉积作为分离轴,以消除边缘边缘的非碰撞情况。

我希望这会有所帮助。

答案 1 :(得分:1)

简而言之,您需要检查的唯一平面是由物体的面定义的平面;也就是说,面的法线是要检查的平面的法线。法线的方向无关紧要,因为无论如何你只是投射顶点。

另请注意,这仅适用于凸网格,并不一定是进行这些检查的最快方法。您可能希望查看XenoCollide或GJK;那些正在成为标准。