快速业务通道

数学建模-两球的高级碰撞检测

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-11


本篇虽然起源于国外一网站的教程,但绝非单纯翻译,包括文中图片也是自己所截,所以为本人和闪吧所有,如有转载,请通知本人,谢谢
数学建模 - 两球的高级碰撞检测
碰撞对于游戏来说是少不了的环节,碰撞的可能性也很多,圆形碰撞是其中一种,也是最经典之一.很多游 戏,比如桌球就是单纯的判断球和球之间的碰撞(假设无边界).下面我就讲一些球于球之间的碰撞(思路来 自一个游戏开发网站) 假设两个球中一个是不动的,并且两个球的MC的注册点都在中心 要判断球有没有碰到,只要算出球A和球B间的距离是否大于球A和球B的半径只和
var disX=ballB._x-ballA._x; // 球A和球B在x轴上的差距
var disy=ballB._y-ballA._y; // 球A和球B在y轴上的差距
var diss=Math.sqrt(disX*disX+disY*disY); // 球A和球B的距离
var sum_radii=ballA.radii+ballB.radii; // 球A和球B的半径之和
if(diss<=sum_radii){ // 判断距离和半径之和的大小
trace("两球碰到了");
} 上面就是判断碰撞的基本条件,我们可以稍微换一下,把Math.sqrt去掉,直接使用平方来做,也是一样的, 因为sqrt实在是浪费资源 // 红色为修改部分
var disX=ballB._x-ballA._x; // 球A和球B在x轴上的差距
var disy=ballB._y-ballA._y; // 球A和球B在y轴上的差距
var diss=disX*disX+disY*disY; // 球A和球B的距离
var sum_radii=ballA.radii+ballB.radii; // 球A和球B的半径之和
if(diss<=(sum_radii*sun_radii) ){ // 判断距离和半径之和的大小
trace("两球碰到了");
} ok,一般这么判断就很够用了,但是你会发现这么做很不好,因为会出现速度过大,而导致球A盖在球B的上 面,更可怕的是,球A一次性串过了球B 所以单单这么判断,是不够的,那么我们换一个想法...是不是可以根据球的速度(注意:速度是矢量,是有 方向的)来判断呢??比如球A的速度指在球B的直径范围内,球A就会碰到球B...不过马上一想这样也是不完 善的,因为出出现这种情况
按此在新窗口浏览图片
那是不是通过多做几条线呢??我看也是不行的,比如球B很小的情况下
按此在新窗口浏览图片
单看上面两点..但是是不够的,但是我们放在一起讨论就不一样了..现在我定义一个函数 detectCollision();他里面有4个方法来排除不可能碰撞的情况,并且是逐步缩小范围,如果这4个情况都 不成立,那么就是撞到了. 第一种不碰撞可能检测 : 判断移动速率(注意:速率是标量,没有方向只有大小)是否大于球表面距离
如图
按此在新窗口浏览图片
如果速率v小于两球表面距离,那么就说明这次检测中,两球没撞到,这个太好理解了吧^^" 第二种不碰撞可能检测 : 判断速度方向的夹角是否是钝角
如图
按此在新窗口浏览图片
v''''''''''''''''''''''''''''''''的速度夹角为钝角,显然不可能碰到,但是图中好像不用钝角也有可能不会碰到..呃..那是因为红球远 了点,如果红球足够近呢^^,其实夹角的临界是90度,大于90度就不会碰到,因为这样球A就不会向球B的方 向移动了,如果再不懂,去些数学论坛或者找些数学书看一下吧,我的数学只能解释到这里了^^! 接下来两个,多看看图,才好理解~_~ 第三种不碰撞可能检测 : 判断被撞球圆心到撞球速度方向上垂直一点是否大于两球半径和
按此在新窗口浏览图片
就如上图看到的,有可能球A的速度方向夹角没有大于90度,但是如果球A和球B且离的远了,球A还是不会碰 到球B,所以,这里的第三种判断就是判断,球A再离球B足够近了以后,图中紫红色线条F,即球B圆心到球A速 度方向上垂直一点的距离,是否大于球A和球B的半径之和,如果大于了,那么就是没有碰到(这句是废话了) 第四种不

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号