关于Flash版Box2D Raycast返回fraction计算错误

作者: ladeng6666 分类: Box2D 发布时间: 2014-08-11 10:30 阅读: 3,814

之前在学习emanueleferonato的Box2D刚体切割时,文中提到了Raycast函数,但是并没有对其Callback回调函数返回值进行讲解。看过API之后有了一个大概的了解,每个返回值的作用时这样的:

  • 0:立即停止Raycast的查找
  • 1:Raycast持续查找,直到达到线段的终点
  • fraction:查找最近的碰撞刚体

前两个返回值都调试成功,正如API中所说的,callback返回值为0时,Raycast只找到了1个碰撞点。返回值为1时,Raycast把线段上所有的碰撞点都标示了出来。但是当返回值为fraction,Raycast并没有按照期望的那样找到最近的碰撞点,而是找出了多个,而且没有规律的点。在下面的示例中,Raycast找到的刚体被标示成了蓝色,同时交互点也用蓝色的圆圈表示。按下空格键,查看不同返回值的效果,你会发现返回值为fraction时,虽然查找结果大部分都时离鼠标最近的刚体,但是还是有一部分与红线发生重叠的刚体未被标示出来。点击图片查看Flash。
DemoRaycast_original 后来比对了C++版Box2D的源代码之后,发现了Flash版Box2D的代码有些问题,具体在collision.b2DynamicTree.as中,按照C++版源码修改了它的Raycast()函数的部分代码如下:

修改之后再调试,当Raycast的Callback函数返回值为fraction,距离最近的刚体和碰撞点都被准确的标示出来了。在下面的示例中,按下空格键,查看修改后的效果。点击图片查看Flash。
DemoRaycast

点击下载源文件

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

2条评论
  • 羔羊引擎

    2018 年 2 月 16 日 上午 12:45

    看了源码,问题是callback是有可能返回负数?

    1. ladeng6666

      2018 年 2 月 20 日 下午 9:56

      不是,我记得是maxfraction的问题,我加了第62行的代码

发表评论

电子邮件地址不会被公开。 必填项已用*标注