JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法
本文实例讲述了JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法。分享给大家供大家参考,具体如下
矩形包围盒,顾名思义,就是使用一个矩形来包围住图像,矩形的大小以刚好包围住图像为最佳,这种包围盒最适用的场景是刚好物体的形状接近于矩形。
在具体的应用中,描述矩形包围盒的的常用方式有以下两种,
一采用最小最大顶点法描述AABB包围盒
上图中使用了最小最大顶点法来描述包围盒信息,由于是在屏幕坐标系中,y轴是向下延伸的,所以只需要保留矩形中坐标的最小值和最大值即可,即矩形的左上角和右下角的顶点,其他的点都在这两个点范围内。
在这种情况下要判断两个矩形是否碰撞只需要比较两个矩形顶点的坐标即可,假设矩形 A用(x1, y1)表示左上角,(x2, y2)表示右下角,矩形B用(x3, y3)表示左上角,(x4, y4)表示右下角,则满足下列条件则表示没有碰撞,反之则碰撞。
- 没碰撞x1>x4 或者x2
- 没碰撞y1>y4 或者y2
- 没碰撞y1>y4 或者y2
关键代码如下
function hitTest(source, target) { return !( ( ( source.y + source.r ) < ( target.y ) ) || ( source.y > ( target.y + target.r ) ) || ( ( source.x + source.r ) < target.x ) || ( source.x > ( target.x + target.r ) ) ); }
DEMO代码
盒包围碰撞算法-矩形 #stage { border: 1px solid lightgray; } 是否碰撞否
这里使用在线HTML/CSS/Javascript代码运行工具http://tools.jb51./code/HtmlJsRun 测试上述代码运行效果如下
二采用点和半径描述AABB包围盒
在上图中使用了中心点和对应两个轴的半径来描述包围盒信息,假设有两个矩形A和B,矩形A 的中心坐标为A(x1, y1),宽度和高度分别为rx1、ry1,矩形B 的中心坐标为B(x2, y2),宽度和高度分别为rx1、ry1,矩形B 的中心坐标为B(x2, y2),宽度和高度分别是rx2、ry2,则采用这种包围盒检测方式如下。
如果满足两个矩形在x方向的距离小于两个矩形宽度和的一半,并且在y方向上的距离小于两个矩形高度和的一半则表示两个矩形有重叠,即表示发生碰撞,换成公式如下
X方向满足|x2-x1|<=rx1+rx2并且Y方向满足|y2-y1|<=ry1+ry2
,也可以把这种形式换算成第一种形式演算,这两种方式很显然第一种的效率比较高效一点,毕竟第二种算法需要使用
Math.abs获取绝对值,第一种只是单纯使用了坐标比较。
以上所描述的矩形包围盒也称为 AABB(轴对齐)包围盒,轴对齐包围盒中的矩形的四条边分别和坐标轴平行,实际上也就是表示该矩形没有进行过旋转操作,使用轴对齐包围盒检测算法比较简单高效,精度上也能满足大多数条件,实际应用中也比较多。
有兴趣的可以搜索下OBB(定向接线)包围盒。
github地址https://github./krapnikkk/JS-gameMathematics
更多关于Javascript相关内容感兴趣的读者可查看本站专题《Javascript数学运算用法》、《Javascript数据结构与算法技巧》、《Javascript数组操作技巧》、《Javascript排序算法》、《Javascript遍历算法与技巧》、《Javascript查找算法技巧》及《Javascript错误与调试技巧》
电脑维修网希望本文所述对大家Javascript程序设计有所帮助。