b2_velocityThreshold 一个困扰了我很久的问题终于解决了

最近工作室在开发一款台球游戏,cocos2d-x + box2d。开发还算顺利,但是有一个问题困扰了我很久,当球体跟球台的边缘碰撞的时候,如果速度比较小的情况下,球体没有反弹,好像被边缘吸住了一样,如果用白球击打一个已经跟边缘接触的花球,不管力度有多大,花球始终沿着边缘走,不会被反弹,最终导致只要击打靠边的花球,不管力度和角度都能滚动到四个角落的球袋里,整个物理世界模拟严重失真。后来我尝试用老版本的box2d,这个问题竟然解决了,由此让我一度怀疑新版的box2d在模拟弹性碰撞上有先天不足,所以我果断把老版本的box2d移植到了新版的cocos2d-x中,问题虽然解决,但是心中总有个节,就是新老版本的box2d到底差在哪里,会导致这个问题? 最近稍微有点闲,于是又把这个问题发出来研究一下,最后终于找到了问题的根源----b2_velocityThreshold,在b2settings.h里定义的一个常量。先看一下这个常量的注释:A velocity threshold for elastic collisions. Any collision with a relative linear velocity below this threshold will be treated as inelastic. 意思就是这是一个弹性碰撞相关的速度阈值,任何碰撞的速度如果低于这个阈值将会认为是非弹性碰撞,看了这个注释秒懂了 -_-#  赶快拿新老两个版本的box2d比较,果不其然,老版本这个值默认是0,不知什么原因在新版就变成了1,困扰我很久的问题终于彻底解决了。心情不错,附上我们工作室的一张游戏截图:)

转载请注明出处:http://www.cnblogs.com/soap1984/p/3417558.html

原文地址:https://www.cnblogs.com/soap1984/p/elastic-collisions-box2d.html