多边形踫撞检测 - 关于分离轴理论的解释(Separating Axis Theorem (SAT) Explanation)

因为有踫撞方面的活要干,所以顺便翻译一下这篇文章 — 关于分离轴理论的解释(Separating Axis Theorem (SAT) Explanation)

有些意译的会放上原文参考,有错的地方留言指正,及时更改, 感谢
如果想转请评论留个言并注明原博 @Sclifftop https://blog.csdn.net/S_clifftop/article/details/108419095

我发现原文也不是很通顺,硬翻出来一看就是直男老外写的,我加亿点点细节,但懂我的人都知道,意思是不会变的句号


关于分离轴理论的解释

所谓分离轴理论,是为了检测凸多边形踫撞的理论,以下简称SAT

我对此理论也不是非常深入,但是因为有检测踫撞的需求,所以做了一些相关的研究,最终实现了这个功能(使用AS3),emmmm……所以我写个“攻略”,希望对你有所帮助(wouldn’t suffer so much)

当我用flash做踫撞检测时,我偶然发现了SAT,但有个问题那就是老子不能深入理解!!(struggled to get a grasp on it)

在小爷找了一堆与踫撞检测相关资料的阅读,看了一些源码后,呵,终于,爷悟了

为了帮助那些数学白痴(non-maths minded people,其实是“不能用数学思想来思考的那一撮轮类”),我想我应该写个简单的说明让你们大体了解一下它的原理,我也会结合SAT写个踫撞检测的小demo,还有一些接口,你可以下载并使用哈(完美)

注意:SAT需要亿点点数学向量方面的东西,所以你想要深入理解SAT,最好先复习下向量方面的内容

在这里插入图片描述
(当然,按钮不能点,这是我截的一张图,这个运行你需要去原文查看)

使用你的鼠标拖动改变他们的大小和旋转角度,当两个多边形有接触,它们的颜色将会变红并且显示一个灰色的东东

扫描二维码关注公众号,回复: 11596623 查看本文章

简单说明

说白了,SAT的主要目的就检测两个物体之间的间隙(当然,其他检测踫撞的目的也一样),SAT使用的是特有的方法

为了更容易理解,关于SAT我举个比较恰当的栗子:

想象你拿着一个火把站在两个物体前,然后从不同的角度来看它他的投影,那他在后面墙上的的投影会是什么样的

在这里插入图片描述
(从这个角度来看,这两个物体莫有间隙)
在这里插入图片描述
(从这个角度看捏,这两个物体的间隙显而易见)

如果你从任何角度去照射,都没有发现间隙,那么就可以认为这两个物体有接触,反之,肯定是没有插入 接触的

从编程的角度来看,这情况就太多了,导致我们没办法用代码去寻找完每个可能的角度,but呢,很不幸,人类总是有办法解决问题,科科,由于多边形的特性,我们只需要检测一些主要的角度就完事

那么那么的那么,小爷就先说结论:所需要检测的角度的量与多边形边的数目相同,具体来说就是所需检测的最大角度数量就是两个物体含有的边的总和,举个栗子:两个五边形需要检测10个角度(因为有10个边嘛,你也可以说有100个边,随你)

在这里插入图片描述
(如果我们需要检测这边,标红的那边)
在这里插入图片描述
(那么我们就得按箭头方向去看过去)

在这里插入图片描述
(既然要从那个方向看过去,那就得在后面建堵墙意味着标红线就是所需投影的“墙” )


有人问了,你逼逼这么多只是理论上的,代码怎么写?

观众们不要急哈,点个关注点个赞点个收藏再点个分享,且听爷细细分解(最起码点个关注点个赞嘛,求求宁了,雷霆嘎巴)

第一步:把冰箱门打开
第二步:把大象放进去
第三步:关冰箱门
第四步:完成

  1. 找到需要检测的多边形的一边,然后画一个垂直向量,我们可以把它叫做“轴线”
    在这里插入图片描述
    (我们要测的这一边)(我们将要投影的轴线)

  2. 遍历所有的点,然后投影到“轴线”上(寻找此多边形最高和最低的值)
    在这里插入图片描述
    (投影到轴线上的点子们)(为了更好看清楚,把那个轴线往下挪挪)

  3. 对第二个多边形做同样的操作
    在这里插入图片描述
    (右边的多边形投到轴线上的点)

  4. 检测是否两个多边形的投影有重叠
    在这里插入图片描述
    (两个多边形之间有间隙,所以没有接触)

如果你发现两个投射的影子之间有间隙,那么两个物体没有交叉感染

事实上,如果一个方向有间隙并不能说明两个物体没没有接触,你需要检测所有的方向之后才能得出是否有接触的结论

以上。

另外咧,如果你能找出重叠(或重叠程度)最小的那部分投影,那你就可以用这个值分离他们(他的意思是交叉的部分比较小,插得不够深,可以更好去分开)


那圆呢?

对于SAT来说,检测圆与多边形有点emmm……但还是能检测的

那你就会问了,为啥“emmm”?因为圆没有边,哟呵,所以就没有显而易见要检测的方向

说“还是能检测”是有一定的原因的,既然没有更好的投影可测,那就测离圆心最近的多边形的点

在这里插入图片描述
(这是离圆心最近的点)(这是你需要检测的轴线)

知道了怎么做,剩下你需要做的就是遍历每条轴线,然后找交叉的就行了

如果你不知道怎么把圆投影到轴线上,那我告诉你,把圆心投影然后减掉半径

利与弊

和其他检测踫撞的方法一样,SAT也有利有弊,如下:

利:
  • 快 — 用到了向量,一旦检测到你想检测的,就不用再进行了,减少了非必要的计算
  • 准 — 至少在我看来
弊:
  • 只能用在多边形上面 — 复杂的形状就有点拉闸,除非你把这个形状拆成小的,一个个来检测
  • 你不知道是哪一边有接触 — 只能得出他插进她(他)有多深或者把他们分开所需的最短距离(only how far they are overlapping and the shortest distance to separate them.)

我能想到的都写了,没有想到的利弊我就不写,爱咋咋地

结论

……等爷有时间再续(2020.09.07)……

下载

……等爷有时间再续(2020.09.07)……

待我有时间,把评论也给你翻译了

……等爷有时间再续(2020.09.07)……

维尼聚合工具

猜你喜欢

转载自blog.csdn.net/S_clifftop/article/details/108419095
今日推荐