GJK算法三角面试验

时间:2011-07-13 04:08:06

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

我正在重建我的GJK算法但是我的四面体的三角形面部测试存在问题。然而,我的观点和边缘测试已经完成。

我想测试原点是否在四面体之外并且最接近特定的三角形面。

到目前为止,我的方法是计算三角形面的法线并进行一系列点积测试,以确定原点是否在外面并且最接近该面。我的方法有一个主要问题:我无法保证我的法线面向外。请参阅我为更好的描述而制作的图:

正如你可以看到相同的三角形,根据顶点的顺序,需要不同的交叉积“排序”来产生面向外的法线。我有什么方法可以确保他们面向外面吗?如果没有,是否有更好的方法来测试这些面孔?以下是我的流程示例:

if (dot(ABC, AO) > 0) {
        if (dot(ACD, AO) <= 0) {
            if (dot(ADB, AO) <= 0) {
                if (dot(DCB, DO) <= 0) {
                    // closest to face of ABC

                }
            }
        }
    }
}

参考:

  

ABC,ACD,ADB,DCB =三角面法线(如你所见,我假设图中的'左'三角形)

     

AO =从A到原点的矢量

     

DO =从A到原点的矢量

1 个答案:

答案 0 :(得分:3)

让我们使用面部ABC。使用N = cross(B-A, C-A)形成法线。如果dot(N, D-A) > 0,则N向内指向,需要反转。最后,如果需要,将N标准化以获得正常单位。