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

6d8ec3cab9a09cb3aa0d4badcf5ce681.png

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

回顾

再上篇中,我留下了一个小记号:

我们 幸运地 获得了一个包含原点的单纯形

这意味着,我们无法包含 不幸 的情况:有可能我们需要迭代更多次数,才能得到符合条件的单纯形。因此,我们需要改变 support 函数的方向,下面请看例子:

afe02cee45e1e9d0fc153c894bdb70e2.png

设 I 点为蓝色多边形的位置坐标, J 点为黄色多边形的位置坐标,

为 support 函数的起始方向。

前两个闵可夫斯基差依旧按照上篇的方法算出,得到构成一维单纯形的两个点:

画出两个点,并连线,并且做出这条线段的中垂线以及在线上的两个向量:

17bac4a99e83bab9344296da63a10012.png

我们可以看到,垂直于 AB 的两个向量,一个是 朝向原点

,另一个是
背离原点
。在上篇中也是同样的情况,需要我们计算后,排除掉不能构成包含原点的单纯形的向量。

因此,为了构成尽可能包含原点的单纯形,我们这一次选择朝向原点的

作为 support 函数新的方向。

cca95d4bf21f0ceacd9fdba5909fc4f4.png

得到黄色多边形在

方向上最大投影点为 C ,记录坐标

得到蓝色多边形在

方向上最大投影点为 E ,记录坐标

相减后得到

,并重新构建单纯形:

fd19ec4e49fe4bc2002b3769fc61beed.png

不幸的是,我们仍然没有能够获得包含原点的多边形。因此,我们需要找到最靠近原点的一条边,并计算出一个与这条边垂直的向量,重新构造二维单纯形。在上图,我们需要删除掉 A 点,留下 BC 边。这里,取垂直于 BC 的向量

作为下一轮迭代中 support 函数的搜索方向:

c2402999a3e06105c98cab0a430bbcac.png

得到黄色多边形在

方向上最大投影点为 C 或 B,这里为了方便运算,取数较小的 C 点,记录坐标

得到蓝色多边形在

方向上最大投影点为 F ,记录坐标

相减后得到

,并重新构建单纯形:

ddc4ed6dbf3b6fd2b1059d7157781b4d.png

这一次,我们成功地获得了包含原点的多边形。在考虑边界时,原点在单纯形的边上也满足 “单纯形包含原点” 的条件中。

退出迭代的条件

除此之外,在上一篇中,我们没能够详细探讨 GJK 退出迭代的条件,接下来请看例子:

1433517870bd707c20bac2b6b7e0dd24.png

同样的,重复上一篇的计算步骤,我们得到单纯形上的两个顶点:

画出这个一维单纯形,并且得到朝向原点且垂直于这个单纯形的向量:

cf7307fba0ef1c1c999a12604d4ac214.png

取这个向量作为下一轮迭代中 support 函数的搜寻方向:

ae68e1f7666b18736b0f863085a90bdc.png

得到黄色多边形在

方向上最大投影点为 A,记录坐标

得到蓝色多边形在

方向上最大投影点为 G ,记录坐标

相减后得到

,并重新构建单纯形:

c1a04a0820fc3c26c73299bda9472567.png

得到一个没有包含原点的单纯形,重复本文第一部分的步骤,得到新的单纯形顶点:

。重新构造单纯形:

78c19bc23c8ac1b4c43922fffecda2ec.png

我们再一次得到一个没有包含原点的单纯形,因此,去掉点 C ,取新方向

,再一次进行迭代:

2394567c669cce84945efb63418a4d1b.png

得到新的单纯形顶点:

注意,在此时,新的单纯形顶点与搜索方向点乘积为

除此之外,这个点也与原来的单纯形顶点发生重复,无法构成一个二维单纯形。因此,我们认为迭代时,在

这个方向上,找不到一个顶点,使得它与原来的单纯形构成一个包含原点的单纯形。所以,这就是 GJK 算法迭代中的退出条件。

在下一篇章中,我们来详细分析 EPA 算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值