java计算一个多边形的重心_2D凸多边形碰撞检测算法(二) - GJK(上)

本文介绍了2D凸多边形碰撞检测中的GJK(Gilbert–Johnson–Keerthi)算法。GJK算法从重叠的角度探索碰撞,寻找两个多边形的Minkowski差是否包含原点来判断碰撞。文章通过实例详细解释了算法的迭代过程和构造单纯形的方法。
摘要由CSDN通过智能技术生成

670b8fd8b18b297fbc960a4c62a96a35.png

2D凸多边形碰撞检测算法(二) - GJK(上)

原理

在 Narrow Phase 精细碰撞检测中,除了 SAT ,另外一个就是 GJK(Gilbert–Johnson–Keerthi)算法。它足够高效,且很容易了解它是如何进行碰撞检测的。同样的,它也只适用于 凸多边形 间的碰撞检测。

首先,重新回顾一下:当两个物体碰撞,发生部分重叠的时候,我们是怎样让计算机知道他们发生了碰撞呢?在上一篇中,SAT 告诉我们:

如果存在一条直线,能够将两个物体分隔开,则两个物体没有发生碰撞。
反之,如果两个物体发生碰撞,则找不到这一条直线,将两个物体分隔开。

SAT 让我们从 分离 的角度,去思考物体间的碰撞。

而 GJK ,则是从 重叠 的角度来探索物体之间的碰撞。

为了方便理解,我们先创建两个相互重叠的多边形,并标记两个多边形重叠的部分:

8a6e9ac35de17a754826d79f6a80caf4.png

目光聚焦到红色的重叠部分,并想一想,它的几何意义究竟是什么?

我们在中学就已经学过,两个直线相交,会产生一个点。这个点都在这两条直线上,这意味着,反应在坐标系上,两条直线享有一个 共同的坐标 。而对于平面,就是无数条直线构成。两个图形产生了重叠,意味着他们有着一组共同的点, 共享一组坐标

而产生碰撞的条件是,两个图形必须 至少重合一个点 ,否则将不会产生碰撞。翻译成计算机能听懂的话:

“是否能从两个图形中,各自找到一个点,使得它们相减后为原点?”

这就是 GJK 算法的核心目的。当两个图形发生重叠时&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值