让Box2D刚体无阻尼匀速运动

作者: ladeng6666 分类: Box2D 发布时间: 2012-11-11 22:55 阅读: 10,497

Box2D物理引擎默认情况下,对世界b2World里的刚体都是模拟自由落体运动,并且因为摩擦力的影响,刚体会慢慢的停下来(在物理学上也叫做有阻尼运动)。今天我们来学习一下,让刚体不受摩擦力影响,无阻尼匀速运动下去。

首先我们要消除重力,让刚体不做自由落体运动。我们曾在Box2D自定义重力中,学习了如何消除重力。因为本节示例中的所有刚体都不受重力影响,所以直接在创建的b2World对象时,直接设置重力为零向量new b2Vec2(0,0)就可以了。

现在刚体可以老老实实的停在舞台上了,接下来我们要让它动起来。让刚体动起来,就是要让它有速度,可以通过b2Body的SetLinearVelocity()方法设置刚体的运动速度。这个用一个b2Vec2向量作为参数,这个向量包含了刚体速度的方向和大小。

现在问题也来了,刚体运动起来后,由于摩擦力的作用,速度会渐渐慢下来。你可以修改Box2D的源代码,取消摩擦力模拟,不过这是一个相当复杂的工作,因为一般人是很难弄懂Box2D里的底层算法的,也没有这必要。另外一个方法就是实时调整刚体的速度大小,注意这里指的的是大小,不包括方向,我们还是希望Box2D能帮忙的准确的完成反弹的。

调整向量的大小而不影响它的速度,可以将向量单位化,然后用Multiply()方法设置它的长度,Multiply()的参数即为要设置的向量长度。代码如下:

下面的示例中,有5个圆形不停的在Box2D中无阻尼匀速运动。

Sorry, either Adobe flash is not installed or you do not have it enabled

完整的代码和注释如下:

 源文件下载

 

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

6条评论
  • siyao

    2012 年 11 月 20 日 下午 2:53

    如果我想要这个运动是匀加速运动呢?再给上一个加速度就可以了?

    1. ladeng6666

      2012 年 11 月 22 日 下午 10:38

      在ENTER_FRAME事件处理函数中,不停的给刚体施加一个不变的力就好了,但是在碰撞后,记得要把力的方向,改成速度的方向

      1. siyao

        2013 年 1 月 7 日 下午 4:32

        非常感谢你的回答 给我很大启发

  • siyao

    2013 年 1 月 7 日 下午 3:53

    我使用ApplyImpulse不停的给一个物体一个冲量 那么碰撞后,我要给这个冲量改变方向,我理解的对么?
    我需要用 b2ContactListener 侦听碰撞,并在 BeginContact 方法里 调整冲量方向。
    我还以为我要在碰撞后,撤销冲量就好了,结果它粘上头就是不碰撞。。。

    1. siyao

      2013 年 1 月 8 日 上午 10:37

      我觉得这么处理:在碰撞开始时,我给物体一个和它速度相符的冲量
      var velocity = playerRoleBody.GetLinearVelocity();
      var m = playerRoleBody.GetMass();
      velocity.Multiply(m);
      我疑惑的是,冲量impluse = ft = m(v1-v2),根据这个公式,我是否需要 对速度 velocity 做出处理

  • waffie

    2013 年 12 月 12 日 下午 5:26

    拉登哥怎么让每个球的速度都不同呢?

发表评论

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