踫撞检测 之一 — 关于分离轴理论的解释(Separating Axis Theorem (SAT) Explanation)(完整翻译)
因为有踫撞方面的活要干,所以顺便翻译一下这篇文章 — 关于分离轴理论的解释(Separating Axis Theorem (SAT) Explanation)(完整翻译)
有些意译的会放上原文参考,有错的地方留言指正,及时更改, 感谢
如果想转请评论留个言并注明原博 @Sclifftop https://blog.csdn.net/S_clifftop/article/details/108419095
我发现原文也不是很通顺,硬翻出来一看就是直男老外写的,我加亿点点细节,还有,这只是作者随笔,并没有在每一步下面列出相应代码进行更明白的解释(对程序员来说,代码比任何解释都要清楚),所以想要深入或是更具体的应用需要自行去查找相关资料,或者结合底部写的代码,有github链接,不想看解释直接拉到底
些篇为入门,可以看下更详细的(推荐哟):踫撞检测 之三 — 使用分离轴理论进行踫撞检测(Collision Detection Using the Separating Axis Theorem)
关于分离轴理论的解释
所谓分离轴理论,是为了检测凸多边形踫撞的理论,以下简称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,最好先复习下向量方面的内容(所以,只要你想彻底理解,你就不能成为那撮人,无论如何你都得跳楼)
(当然,上面的按钮不能点,这是我从原文截的图,这个运行你需要去原文查看)
使用你的鼠标拖动改变他们的大小和旋转角度,当两个多边形有接触,它们的颜色将会变红并且显示一个灰色的东东
简单说明
说白了,SAT的主要目的就检测两个物体之间的间隙(当然,其他检测踫撞的目的也一样),SAT使用的是特有的方法
为了更容易理解,关于SAT我举个比较恰当的栗子:
想象你拿着一个火把站在两个物体前,然后从不同的角度来看它他的投影,那他在后面墙上的的投影会是什么样的
(从这个角度来看,这两个物体莫有间隙)
(从这个角度看捏,这两个物体的间隙显而易见)
如果你从任何角度去照射,都没有发现间隙,那么就可以认为这两个物体有接触,反之,肯定是没有接触的
从编程的角度来看,这情况就太多了,导致我们没办法用代码去遍历完所有可能的角度,很不幸,人类总是有办法解决问题,由于多边形的特性,我们只需要检测一些主要的角度就完事
那么小爷就先说结论:所需要检测的角度的量与多边形边的数目相同,具体来说就是所需检测的最大角度数量就是两个物体含有的边的总和,举个栗子:两个五边形需要检测10个角度(因为有10个边嘛,你也可以说有100个边,随你)
(如果我们需要检测这边,标红的那边)
(那么我们就得按箭头方向去看过去)
(既然要从那个方向看过去,那就意味着标红线就是所需投影的“墙” )
有人问了,你逼逼这么多只是理论上的,该怎么应用到代码中?
观众们不要急哈,点个关注点个赞点个收藏再点个分享,且听维尼细细道来(最起码点个关注点个赞嘛,求求宁了,雷霆嘎巴)
找到需要检测的多边形的一边,然后画一个垂直向量,我们可以把它叫做“轴线”(就是‘SAT’中的‘A’)
(我们要测的这一边)(我们将要投影的轴线)遍历所有的点,然后投影到“轴线”上(寻找此多边形最高和最低的值)
(投影到轴线上的点子们)(为了更好看清楚,把那个轴线往下挪挪)对第二个多边形做同样的操作
(右边的多边形投到轴线上的点)检测是否两个多边形的投影有重叠
(两个多边形之间有间隙,所以没有接触)
如果你发现两个投射的影子之间有间隙,那么两个物体没有接触
事实上,如果一个方向有间隙并不能说明两个物体没没有接触,你需要检测所有的方向之后才能得出是否有接触的结论
以上。
另外咧,如果你能找出重叠(或重叠程度)最小的那部分投影,那你就可以利用这个最小的值更优地分离他们
那圆呢?
对于SAT来说,检测圆与多边形有点emmm……但还是能检测的
那你就会问了,为啥你会犹豫一下?因为圆没有边啊兄弟,所以就没有显而易见要检测的方向
说“还是能检测”是有一定的原因的,既然没有更好的投影可测,那就测离圆心最近的多边形的点
(这是离圆心最近的点)(这是你需要检测的轴线)
知道了怎么做,剩下你需要做的就是遍历每条轴线,然后找交叉的就行了
如果你不知道怎么把圆投影到轴线上,那我告诉你,把圆心投影然后减掉半径
利与弊
和其他检测踫撞的方法一样,SAT也有利有弊,如下:
利:
- 快 - 用到了向量,一旦检测到你想检测的,就不用再进行了,减少了非必要的计算
- 准 - 至少在我看来
弊:
- 只能用在多边形上面 - 复杂的形状就有点拉闸,除非你把这个形状拆成小的,一个个来检测
- 你不知道是哪一边有接触 - 只能得出他们有重叠或者把他们分开所需的最短距离(only how far they are overlapping and the shortest distance to separate them.)
以上我能想到的都写了,至于没有想到的利与弊我就不管了
结论
希望以上内容对你理解SAT有所帮助,在数学领域我并不是专家,所以如果有遗漏之处,还请见谅
下面是一些链接,你可以去看下,可以帮助你更好理解SAT踫撞检测
- harverycartel.org - 这个网站有更详细的解释,还有一些可以交互的程序,我之前就在这学了好多
- GPWiki.org - 里面有对SAT更好的解释还有代码样例,我解决问题的时候就复用了这里面的代码
- GameDev.net forum - 一位老哥做的SAT踫撞系统
下载
查看我用AS3写得SAT的接口:GITHUB
说下怎么用的:要检测两个物体,就调用Collision.test(obj1,obj2)
方法,如果两个物体有接触,会返回一个CollisionInfo
对象,否则返回null,CollisionInfo对象里面包含的东西balabalabala……没什么可译的,看源码吧,就是上面的地址
待我有时间,把评论也给你翻译了
踫撞检测 之一 — 关于分离轴理论的解释(Separating Axis Theorem (SAT) Explanation)(完整翻译)相关推荐
- 碰撞检测—分离轴理论
最近在用opengl写一个小游戏,动画和人机交互都很简单,逻辑控制,边界问题都是目前的一个难题,正好找了几篇碰撞检测的资料,看着挺不错的 http://www.cppblog.com/mybios/a ...
- 第6-8课:分离轴算法(SAT)与碰撞检测(图文篇)
物体的碰撞检测是游戏软件中的关键算法之一,两个角色是否能够对话.子弹是否击中了物体,以及是否出现人物穿墙的 bug,都依赖于一套可靠的碰撞检测算法.有很多算法可以实现碰撞检测,基于算法几何的方法有轴对 ...
- egret判断两个多边形是否相交(分离轴定律)
参考原文:原文 预备知识:向量的点积: 关于向量的知识这里不再赘述 分离轴定理(Separating Axis Theorem) 概念:通过判断任意两个 凸多边形 在任意角度下的投影是否均存在重叠, ...
- Box2D教程5-碰撞检测
Box2D教程1-创建碰撞世界 Box2D教程2-鼠标交互 Box2D教程3-刚体绑定外观 Box2D教程4-复杂刚体的复杂外观 Box2D教程5-碰撞检测 之前我们已经了解了如何通过Box2D创建一 ...
- python使用matplotlib可视化、自定义移除Y轴指定轴刻度标签(removing specific axis ticks in matplotlib y axis)
python使用matplotlib可视化.自定义移除Y轴指定轴刻度标签(removing specific axis ticks in matplotlib y axis) 目录 python使用m ...
- python使用matplotlib可视化、自定义移除X轴指定轴刻度标签(removing specific axis ticks in matplotlib x axis)
python使用matplotlib可视化.自定义移除X轴指定轴刻度标签(removing specific axis ticks in matplotlib x axis) 目录 python使用m ...
- matplotlib可视化去除轴标签、轴刻度线和轴刻度数值实战:Axis Text Ticks or Tick Labels
matplotlib可视化去除轴标签.轴刻度线和轴刻度数值实战:Axis Text Ticks or Tick Labels 目录
- R语言可视化包ggplot2包设置轴断点位置实战(Axis Breaks)、即自定义X轴和Y轴的数值标记位置
R语言可视化包ggplot2包设置轴断点位置实战(Axis Breaks).即自定义X轴和Y轴的数值标记位置 目录
- matlab 碗形状,付星020806-用matlab模拟小球撞碗的运行轨迹_理论力学
用MATLAB 模拟小球撞碗的运行轨迹 仪21 付星020806 关键词:斜抛,小球撞碗,MATLAB模拟 参考书目:彭芳麟. 理论力学计算机模拟. 清华大学出版社. 2002 <力学与实践&g ...
- 【目标检测】YOLOv5分离检测和识别
前言 YOLO作为单阶段检测方法,可以直接端到端的输出目标对象位置和类别,而在一些大型无人机遥感等目标检测任务中,使用单阶段检测往往会产生类别预测错误的问题. 正好,YOLOv5-6.2版本提供了一个 ...
最新文章
- Oracle:递归查询(树形结构数据)
- c语言宏嵌套和展开规则
- 模型部署到移动端_Pytorch1.4来了!定制移动端构建、支持分布式模型并行训练等...
- 【深度探讨】阿里巴巴万级规模 K8s 集群全局高可用体系之美
- 【连载】vSphere 4.0 问答之引子 ---《vSphere 4.0 Quick Start Guide》节选和粗译
- java作业不能运行_从Windows运行时,YARN作业失败
- 福师计算机应用基础期末,福师2015计算机应用基础》期末试卷A123
- c++ 使用未初始化的内存_C语言内存分布(内核区、堆栈区等)
- jlist动态添加元素后刷新_小米电视5再曝光:MEMC动态画质补偿技术
- 【elasticsearch】 基于_version进行乐观锁并发控制
- Linux中断子系统
- 分针网——每日推荐:PHTML解析原理
- 解决Lync 2013演示PPT提示证书问题的多种方法
- uploadify 上传文件出现HTTP 404错误
- win10系统svn服务器端安装步骤,win10系统安装svn服务器的操作方法
- [软件推荐]一款win7 x86 x64都能用的免费内存虚拟盘的小工具——ImDisk
- 知道PDF密码,想要移除如何操作?
- JavaWeb实现裁剪图片上传完整代码
- Drone SETTINGS 页面没有 Trusted
- MSN、QQ、阿里旺旺在线客服源代码