javascript canvas 碰撞检测
来源:互联网 发布:淘宝客服是怎么做的 编辑:程序博客网 时间:2024/05/22 10:31
1.外接图形判别法
1.外接矩形判别法
//先算出小球底部的位置,然后根据它现在的移动速度与当前动画的帧速率,估算出小球在下一帧动画中的位置ballWillHitLedge:function(ledge){ var ballRight = ball.left + ball.width, ledgeRight = ledge.left + ledge.width, ballBottom = ball.top + ball.height, nextBallBottomEstimate = ballBottom + ball.velocityY / fps; return ballRight > ledge.left && ball.left < ledgeRight && ballBottom < ledge.top && nextBallBottomEstimate > ledge.top;}
2.外接圆判别法
检测两个圆是否发生碰撞:两个圆心之间的距离是否小于两圆半径之和,小于:碰撞,否则没碰撞
isBallInBucket:function(){ var ballCenter = { x:ball.left + BALL_RADIUS, y:ball.top + BALL_RADIUS }, distance = Math.sqrt( Math.pow(bucketHitCenter.x - ballCenter.x,2) + Math.pow(bucketHitCenter.y - ballCenter.y,2) ); return distance < BALL_RADIUS + bucketHitRadius;}
2.碰到墙壁即被弹回的小球
handleEdgeCollisions:function(){ var bbox = getBoundingBox(ball), right = bbox.left + bbox.width, bottom = bbox.top + bbox.height; if(right > canvas.width || bbox.left < 0){ velocityX = -velocityX; if(right > canvas.width){ ball.left -= right - canvas.width; } if(bbox.left < 0){ ball.left -= bbox.left; } } if(bottom > canvas.height || bbox.top < 0){ velocityY = -velocityY; if(bottom > canvas.height){ ball.top -= bottom-canvas.height; } if(bbox.top < 0){ ball.top -= bbox.top; } } }
3.光线投影法
画一条与物体的速度向量(velocity vector)相重合的线,然后再从另一个待检测的物体出发,绘制第二条线,根据两条线的交点位置来判定是否发生碰撞 。
在小球的飞行过程中,程序不断的擦除并重绘从小球到1,2号交点处的连线。
4.分离轴定理(SAT)与最小平移向量(MTV)
4.1 分离轴定理只适用于凸多边形
数学模型:把受测的两个多边形置于一堵墙前面,用光线照射它们,然后根据其阴影部分是否相交来判断二者有没有相撞。
阴影部分:投影
墙:轴
只要能在任何一条轴上找到互相分离的投影,就说明两个多边形没有发生碰撞,一旦发生了碰撞,肯定在所有的轴上都找不到互相分离的投影。
投影轴的数量等同于多边形的总边数,如三角形和四边形,就要有7个投影轴。
伪代码:
//returns true if the polygon1 and polygon2 have collidedfunction polygonsCollide(polygon1,polygon2){ var axes,projection1,projection2;//projection:投射所用 axes = polygon1.getAxes(); axes.push(polygon2.getAxes());//axes is an axis array for(each axis in axes){ projection1 = polygon1.project(axis); projection2 = polygon2.project(axis); if(!projection1.overlaps(projection2)) return false;//Separation means no collision } return true;//no separation on any axis means collision}
问题:
- 如何确定多边形的各个投影轴
- 如何将多边形投射到某条分离轴上
如何检测两段投影是否发生重叠
4.2 圆形与多边形之间的碰撞检测
只需将圆形投射到一条投影轴上即可,这条轴就是圆心与距其最近的多边形顶点之间的连线。
还需要将这两个受测物体投射到多边形的各条投影轴上才行。
0 0
- javascript canvas 碰撞检测
- canvas碰撞检测1
- canvas碰撞检测2
- canvas碰撞检测3
- canvas碰撞检测4
- 使用JavaScript和canvas做精确的像素碰撞检测
- canvas中的碰撞检测笔记
- javascript判断碰撞检测
- javascript碰撞检测
- HTML5 Canvas 碰撞检测的简单实现
- Canvas绘制小球运动,检测碰撞变色
- javascript碰撞检测的方法
- canvas 记录绘画对象实现交互能力 简单碰撞检测
- 用canvas绘制“具有碰撞检测效果的运动五角星”
- 基于 HTML5 Canvas 的 3D 碰撞检测
- 基于 HTML5 Canvas 的 3D 碰撞检测
- JavaScript碰撞检测原理及其实现
- 碰撞检测
- 调试方法
- DOS命令
- 生产消费模式
- iOS运行时场合一 category中添加(连接)对象(fake机制)
- 使用open方式的文件锁
- javascript canvas 碰撞检测
- cvFitLine直线拟合函数的应用
- Android百分比布局使用小坑一个
- JS----拖拽图层,面向过程,面向对象
- Snail—iOS开发学习博客及网站
- 百度地图的封装
- git入门
- Running Maven Defaults and Overriding with TestNG
- C++实现Windows下的Daemon,监控多个进程