2D凸多边形碰撞检测算法(二) - GJK(下)
回顾
再上篇中,我留下了一个小记号:
我们 幸运地 获得了一个包含原点的单纯形
这意味着,我们无法包含 不幸 的情况:有可能我们需要迭代更多次数,才能得到符合条件的单纯形。因此,我们需要改变 support 函数的方向,下面请看例子:
设 I 点为蓝色多边形的位置坐标, J 点为黄色多边形的位置坐标,
前两个闵可夫斯基差依旧按照上篇的方法算出,得到构成一维单纯形的两个点:
画出两个点,并连线,并且做出这条线段的中垂线以及在线上的两个向量:
我们可以看到,垂直于 AB 的两个向量,一个是 朝向原点 的
因此,为了构成尽可能包含原点的单纯形,我们这一次选择朝向原点的
得到黄色多边形在
得到蓝色多边形在
相减后得到
不幸的是,我们仍然没有能够获得包含原点的多边形。因此,我们需要找到最靠近原点的一条边,并计算出一个与这条边垂直的向量,重新构造二维单纯形。在上图,我们需要删除掉 A 点,留下 BC 边。这里,取垂直于 BC 的向量
得到黄色多边形在
得到蓝色多边形在
相减后得到
这一次,我们成功地获得了包含原点的多边形。在考虑边界时,原点在单纯形的边上也满足 “单纯形包含原点” 的条件中。
退出迭代的条件
除此之外,在上一篇中,我们没能够详细探讨 GJK 退出迭代的条件,接下来请看例子:
同样的,重复上一篇的计算步骤,我们得到单纯形上的两个顶点:
画出这个一维单纯形,并且得到朝向原点且垂直于这个单纯形的向量:
取这个向量作为下一轮迭代中 support 函数的搜寻方向:
得到黄色多边形在
得到蓝色多边形在
相减后得到
得到一个没有包含原点的单纯形,重复本文第一部分的步骤,得到新的单纯形顶点:
我们再一次得到一个没有包含原点的单纯形,因此,去掉点 C ,取新方向
得到新的单纯形顶点:
注意,在此时,新的单纯形顶点与搜索方向点乘积为
除此之外,这个点也与原来的单纯形顶点发生重复,无法构成一个二维单纯形。因此,我们认为迭代时,在
在下一篇章中,我们来详细分析 EPA 算法。