2D凸多边形碰撞检测算法(二) - GJK(上)
原理
在 Narrow Phase 精细碰撞检测中,除了 SAT ,另外一个就是 GJK(Gilbert–Johnson–Keerthi)算法。它足够高效,且很容易了解它是如何进行碰撞检测的。同样的,它也只适用于 凸多边形 间的碰撞检测。
首先,重新回顾一下:当两个物体碰撞,发生部分重叠的时候,我们是怎样让计算机知道他们发生了碰撞呢?在上一篇中,SAT 告诉我们:
如果存在一条直线,能够将两个物体分隔开,则两个物体没有发生碰撞。
反之,如果两个物体发生碰撞,则找不到这一条直线,将两个物体分隔开。
SAT 让我们从 分离 的角度,去思考物体间的碰撞。
而 GJK ,则是从 重叠 的角度来探索物体之间的碰撞。
为了方便理解,我们先创建两个相互重叠的多边形,并标记两个多边形重叠的部分:
目光聚焦到红色的重叠部分,并想一想,它的几何意义究竟是什么?
我们在中学就已经学过,两个直线相交,会产生一个点。这个点都在这两条直线上,这意味着,反应在坐标系上,两条直线享有一个 共同的坐标 。而对于平面,就是无数条直线构成。两个图形产生了重叠,意味着他们有着一组共同的点, 共享一组坐标 。
而产生碰撞的条件是,两个图形必须 至少重合一个点 ,否则将不会产生碰撞。翻译成计算机能听懂的话:
“是否能从两个图形中,各自找到一个点,使得它们相减后为原点?”
这就是 GJK 算法的核心目的。当两个图形发生重叠时&#