踫撞检测 之三 — 使用分离轴理论进行踫撞检测(Collision Detection Using the Separating Axis Theorem)

因为有踫撞的活要干,所以找了点资料,顺便译完之前一篇“入门文章”,再译一下这个详细一点的 — 使用分离轴理论进行踫撞检测(Collision Detection Using the Separating Axis Theorem)

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


分离轴理论(SAT,以下都简称SAT)经常被用于检测两个简单的多边形或者一个多边形和一个圆形,当然,他也会有利弊,接下来,我们会深究此理论所用到的数学知识,然后用一些代码示例和小demo去演示如何应用于游戏中

注意:尽管demo和一些代码示例用的是flash和AS3语言,但原理都是一样的,语言并不重要,看原理就完事了

这个理论讲了什么?

说白了,SAT讲的是:如果你能用一条线把两个多边形分开,那这两个多边形就没有接触(他的总结与第一篇有出入,但是相差不大)

在这里插入图片描述
从上图可以看出,第二行的多边形都有接触,因为你很难在两个物体之间画一条不与任何物体接触的线,但是第一行就很容易了,别说一条,你画一万条都没人管你,看下面:
在这里插入图片描述
好了,小爷不跟你开玩笑了(鸡叫),还是上面那个总结:如果你可以轻松地在两个物体之间画一条线,那两者之间一定有间隙

沿任意一个轴线进行投影

在这里插入图片描述
看上图,假设两个多边形为正方形:左边是box1,右边是box2,显而易见,两个正方形没有接触

从代码角度来分析:计算两个正方形之间的水平距离,然后减去box1和box2宽度的一半,与0比较就能得出是否接触

//伪代码,其实也不伪了
var length:Number = box2.x - box1.x;
var half_width_box1:Number = box1.width*0.5;
var half_width_box2:Number = box2.width*0.5;
 
var gap_between_boxes:Number = length - half_width_box1 - half_width_box2;
if(gap_between_boxes > 0) trace("It's a big gap between boxes")
else if(gap_between_boxes == 0) trace("Boxes are touching each other")
else if(gap_between_boxes < 0) trace("Boxes are penetrating each other")

待续……(2020.09.07)

猜你喜欢

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