加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

简单的距离碰撞与多物体碰撞检测方法

(2011-12-02 22:13:00)
标签:

杂谈

分类: 动画软件
通过hitTestObject和hitTestPoint进行hit都有不足,我们可以自己计算碰撞检测。

简单的距离碰撞检测:
我们从理想的状态开始,两个圆进行测试。
http://s11/middle/6c9d65a1hb31c32bb80fa&690
观察两个圆的碰撞,我们可以检测两个圆的距离,如果距离小于两个圆的半径,则表示碰撞上了。
如何求出两个圆的当前距离呢?
几何学中有:平面两点间距离公式,正好解决这个问题。
import flash.events.Event;

//有两个球a,b
a.radius = a.width/2;
b.radius = a.height/2;

a.startDrag(true);
//碰撞距离
var minDist:Number = a.radius+b.radius;

this.addEventListener(Event.ENTER_FRAME,testHit);
function testHit(e:Event):void
{
      var dx:Number = a.x - b.x;
      var dy:Number = a.y - b.y;
      
      var dist:Number = Math.sqrt(dx*dx+dy*dy);
      if(dist<minDist)
      {
            trace("hit");
      }
}

注意:圆的大小并不是一样大,所以距离是两个球的半径,而非一个球的半径*2



多物体碰撞检测:
如果有两个球碰撞很容易,如果有多个球则需要多次判断。
如果:
有两个球(a,b):判断a->b
有三个球(a,b,c):判断a->b, a->c, b->c
球越多可能性就越多。

根据组合公式:c(n,m)可以求出 20个球就需要判断190次。
注:c(n,m),有n个不同的元素,任意取出m个元素进行组合(m<=n)。
    c(n,m) = n!/(n-m)!*m!

我们最基本的做法是:用双重循环进行检测
var ball:Array=["a","b","c","d","e","f"];
var count:int=6;
for(var i:int=0;i<count;i++)
{
      var tmp:String="";
      for(var j:int=0;j<count;j++)
      {
            tmp += "["+ball[i]+","+ball[j]+"]  ";
      }
      trace(tmp);
}

[a,a]  [a,b]  [a,c]  [a,d]  [a,e]  [a,f]  
[b,a]  [b,b]  [b,c]  [b,d]  [b,e]  [b,f]  
[c,a]  [c,b]  [c,c]  [c,d]  [c,e]  [c,f]  
[d,a]  [d,b]  [d,c]  [d,d]  [d,e]  [d,f]  
[e,a]  [e,b]  [e,c]  [e,d]  [e,e]  [e,f]  
[f,a]  [f,b]  [f,c]  [f,d]  [f,e]  [f,f]  

观察:
[a,a]自己和自己碰撞,很不合理
[a,b]和[b,a]这两个检测是一样的,有冗余成份。
所以我们可以这样处理:
假设i=0, j=i+1就不出现重复的现像了。
修改如下:

var ball:Array=["a","b","c","d","e","f"];
var count:int=6;
for(var i:int=0;i<count-1;i++)
{
      var tmp:String="";
      for(var j:int=i+1;j<count;j++)
      {
            tmp += "["+ball[i]+","+ball[j]+"]  ";
      }
      trace(tmp);
}

[a,b]  [a,c]  [a,d]  [a,e]  [a,f]  
[b,c]  [b,d]  [b,e]  [b,f]  
[c,d]  [c,e]  [c,f]  
[d,e]  [d,f]  
[e,f]  

可以看出效率提升了一半。



0

阅读 收藏 喜欢 打印举报/Report
后一篇:vim
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有