html5游戏-包围盒检测算法

矩形包围盒算法:检测2个矩形是否重叠,在这样情况下要判断2个矩形是否碰撞只需要比较两个矩形顶点的坐标即可。假设矩形A用(x1,y1)表示左上角,(x2,y2)表示右下角,矩形B用(x3,y3)表示左上角,(x4,y4)表示右下角,则满足下列条件则表示没有碰撞,反之则碰撞。
没碰撞:x1>x4或者x2<x3。
没碰撞:y1>y4或者y2<y3

var ABBox = function(tBox1,tBox2){
    var x1 = tBox1.x,
          y1 = tBox1.y,
          x2 = tBox1.x + tBox1.w,
          y2 = tBox1.y + tBox1.h,
          x3 = tBox2.x,
          y3 = tBox2.y,
          x4 = tBox2.x + tBox2.w,
          y4 = tBox2.y + tBox2.h;
     if(x1>x4||x2<x3)return false;
     if(y1>y4||y2<y3)return false;
     return true;
};

圆形包围盒算法:检测圆形的碰撞比较容易,假设圆A的坐标(x1,y1),半径是r1,圆B的坐标(x2,y2),半径是r2,则如果满足不等式(y2-y1)2+(x2-x1)2<=(r1+r2)2则表示两个圆发生了碰撞,其实就是圆心之间的距离小于两个圆的半径之和即可,由于计算距离需要用到开方运算,效率较低,所以直接比较距离的平方。

var RBBox = function(tBox){
        var dx = x-tBox.x,
              dy = y-tBox.y,
              dr = r+tBox.r;
        return dx*dx+dy*dy<dr*dr;
 };

凸多边形包围盒算法:对于2个多边形来说,检测它们是否相交,我们所要做的是计算两个多边形的每条边在分离轴上的投影的距离。找出每条边形成的向量在轴上投影的最大值和最小值,这样在分离轴上的每个多边形就分别以这两个值形成线段,最后比较这两个线段是否重叠就可以判断这两个多边形是否相交了。

所以在做检测的时候只需要按照以下步骤进行即可。
(1) 产生所有的分离轴,选取一条测试。
(2) 计算图形在该分离轴上的投影。
(3) 检测投影是否相交,如果相交则选取下一条,重复步骤2和步骤3,如果不相交则返回不相交。
(4) 所有分离轴检测完毕,返回相交。

//x,y是多边形中心坐标,pArr是一个顶点数组,点的坐标采用相对中心点坐标,按顺时针存放各顶点
       init:function(x,y,pArr)
       {
           this.pArr = pArr;
           this._super(x,y);
       },
       //转换所有顶点坐标到绝对坐标系中
       mapToWorld:function()
       {
          var p = [];
          for(var i=0,len = this.pArr.length;i<len-1;i+=2)
          {
              p.push(this.pArr[i]+this.x,this.pArr[i+1]+this.y);
          }
          return p;
       },
       collided:function(tBox)
       {
           var p1 = this.mapToWorld(),
               p2 = tBox.mapToWorld();
           return MathUtil.isCollide(p1,p2);
       },
//判断两个多边形是否相交碰撞,p1,p2用于保存多边形点的数组
            isCollide:function(p1,p2){
                //定义法向量
                var e = {"x":0,"y":0};
                var p = p1,
                    idx=0,
                    len1=p1.length,
                    len2=p2.length;
                for(var i=0,len = len1+len2;i<len-1;i+=2){
                    idx = i;
                    //计算两个多边形每条边
                    if(i>len1){
                        p=p2;
                        idx=(i-len1);
                    }
                    if(i==p.length-2){
                        px=p[0]-p[idx];
                        py=p[1]-p[idx+1];
                    }
                    else{
                        px = p[idx+2]-p[idx],
                        py = p[idx+3]-p[idx+1];
                    }
                    //得到边的法向量
                    e.x = -py;
                    e.y = px;
                    //计算两个多边形在法向量上的投影
                    var pp1 = this.calcProj(e,p1);
                    var pp2 = this.calcProj(e,p2);
                    //计算两个线段在法向量上距离,如果大于0则可以退出,表示无相交
                    if(this.segDist(pp1[0],pp1[1],pp2[0],pp2[1])>0){
                        return false;
                    }
                }
                return true;
            }
//计算同一个轴上线段的距离s1(min1,max1),s2(min2,max2),如果距离小于0则表示两线段有相交;
            segDist:function(min1,max1,min2,max2){
                if(min1<min2){
                    return min2-max1;
                }
                else{
                    return min1-max2;
                }
            },
时间: 2024-08-21 23:07:32

html5游戏-包围盒检测算法的相关文章

3D空间中射线与轴向包围盒AABB的交叉检测算法

引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法.但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲述如何实现射线与轴向包围盒AABB的交叉检测.如果读者不明白什么是轴向包围盒,请看这篇文章. Ray-AABB交叉检测算法 现如今,有很多的Ray-A

3D空间中射线与轴向包围盒AABB的交叉检测算法【转】

引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法.但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲述如何实现射线与轴向包围盒AABB的交叉检测.如果读者不明白什么是轴向包围盒,请看这篇文章. Ray-AABB交叉检测算法 现如今,有很多的Ray-A

3D空间中射线与轴向包围盒AABB的交叉检测算法 【转】

http://blog.csdn.net/i_dovelemon/article/details/38342739 引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法. 但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高 效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲 述如何实现射线与轴向包围盒A

HTML5游戏开发-扫雷及其算法研究

吕蒙曰:士隔三月[1],当刮目相看.所以,在下在这三月中发奋图强,花了约莫8节信息课的时间研究扫雷.呜呼,由于在下才能尚且不足,所以也就只能勉强打过中级难度的吧.不过,一边玩的同时,我还一边对扫雷这个游戏的制做方法构思了一下.所以说,本文中的算法完全是凭借自己对扫雷游戏规则的总结而自行研发出来的,倘若和MS的扫雷玩法有些出入,还望各位看官见谅. [1]出自<孙权劝学>,原文为"士别三日",由于在下这三个月来都不曾发表博客,所以引申到"士隔三月",各位看官

Ray-AABB交叉检测算法

??最近在解决三维问题时,需要判断线段是否与立方体交叉,这个问题可以引申为:射线是否穿过立方体AABB. ??在3D游戏开发中碰撞检测普遍采用的算法是轴对齐矩形边界框(Axially Aligned Bounding Box, AABB)包装盒方法,其基本思想是用一个立方体或者球体完全包裹住3D物体对象,然后根据包装盒的距离.位置等相关信息来计算是否发生碰撞. slab的碰撞检测算法 ??本文接下来主要讨论射线与AABB的关系,主要对box2d碰撞检测使用的slab的碰撞检测算法(Slabs m

html5 游戏开发

近来想做html5游戏开发些小东西玩一下,因为手边就是笔记本,想怎么玩就怎么玩了,今年可以说是非常重要特殊的一年,感觉有些倒霉,不过,心态最重要,该怎么做的时候就去怎么做吧,日子的24小时是不会变的,不管能活多久. 游戏开发感觉不错,所以就刚看了一个碰撞检测canvas的来做,一段段代码弄下来试,成功运行了,原理也是一些很简单的,不过是 不停地检测 FPS,不停刷新每一帧来达到最终的探测目的: 每一帧里面都去检测范围,是否会碰撞: 有三种检测方法: 范围检测: 光线投影速度向量检测:分离轴定理:

HTML5游戏探讨,如何让微信游戏只能运行在微信中

大致文件布局如下,一个html文件,一个loading.js,在loading.js中加载其他需要的js和css. 至于具体的速度的话,建议cdn或者一个域中最多加载6个js文件.在loading.js中加载js和css之前,检测是不是微信游览器,是的话,go.不是则跳转到提示. function isWeiXin(){ var ua = window.navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i) == 'mi

2016年 最火的 15 款 HTML5 游戏引擎

HTML5游戏从2014年Egret引擎开发的神经猫引爆朋友圈之后,就开始一发不可收拾,今年<传奇世界>更是突破流水2000万!从两年多的发展来看,游戏开发变得越来越复杂,需要制作各种炫丽的效果,还要制作各种基于 2D 或者 3D 的场景.作为一名开发者,分析了当下最火爆,最热门的HTML5游戏引擎供大家参考,希望大家也能找到属于自己的那款游戏开发引擎. 我在github上面收集了四十多款的HTML5开源游戏引擎,从里面star.fork等等参数分析其流行度,最后综合各方面元素,筛选出靠前的十

HTML5游戏实战(3): 60行代码实现水平跑酷游戏

跑酷游戏无疑是目前最受欢迎的游戏类型之一,3D跑酷游戏可能比较难做一点(这个我不懂),2D跑酷却是非常容易的,只要有美术资源,做一个<天天酷跑>这类流行游戏也并非是什么难事. 这里通过一个松鼠跑酷的游戏介绍一下用Gamebuilder+CanTK开发游戏的方法,这个游戏的主场景仅用了60来行代码. CanTK(Canvas ToolKit)是一个开源的游戏引擎和APP框架,是开发HTML5游戏和APP的利器,如果你喜欢它,请在github上给它加星,您的支持是我们努力的动力:https://g