Box2D自定义重力

作者: ladeng6666 分类: Box2D 发布时间: 2012-09-06 21:42 阅读: 16,038

今天我们一起来学习自定义刚体重力(修改重力方向或消除重力)。

在Box2D中创建的非静态刚体,默认情况下都会受到重力作用,自然下落。这是我们希望的。不过有些特殊情况,重力反而是我们不想要的,比如在太空环境中,所有的物体都是处于失重状态,这时候就不需要重力了。这种情况应该怎么用Box2D实现呢?

在此要特别感谢Emanuele的Managing multiple gravities with Box2D,我也是从中学习到了接下来要讲的方法。

实现方法有两种:一、加减法抵消重力;二、重置重力。下面我们来详细一下这两种方法。

一、加减法抵消重力

重力也是里的以一种,也有大小和方向。它的方向与y轴一致,所以可以用一个正数表示重力,如:G。那么要消除重力,即受力为0,只要G-G=0就可以了。也就是说,再给刚体施加一个-G的力,负数表示力的方向与y轴相反。

关于对刚体施加里的方法,请参考让刚体听到的——ApplyForce一文。

值得注意的是,重力等于刚体的质量乘以重力加速度,所以在施加外力时,不要忘了乘以刚体的质量b2Body.GetMass()。在下面的效果中,点击鼠标创建一个不受重力影响的刚体:

完整的代码即注释如下:

效果看起来不错哦。不知道你注意到没有,所有的刚体都是醒着的(Box2D中对于停止运动的刚体,会自动将其设置为睡眠sleep状态,并显示灰色,并且不对其进行物理模拟,以节省CPU开支)。这样CPU的负担并没有降低。

二、重置重力

Box2D中的Dynamics包下有一个b2Island类,类中有一个Solve方法,这方法通过gravity形参对刚体进行重力模拟,代码如下:

所谓重置重力,就是在这里动手脚了。要怎么做呢?把这个gravity形参改成我们想要的重力,比如可以像下面的代码,设置为0.

或者我们用了一个更便于重用的方法,在b2Body类添加一个b2Vec2类型的公共属性m_customGravity,然后在b2Island.Solve()方法中,判断是否设置了刚体的m_customGravity属性,如果有,则用m_customGravity进行重力模拟计算。然后我们在创建刚体时,只要设置一下m_customGravity属性就可以轻松重置重力了。

在下面的效果中,点击鼠标创建一个不受重力影响的刚体(当然你可以随意设置customer_gravity属性,让重力向上、向左、向右)。按下键盘空格键,创建一个向上”掉”的矩形刚体。点击刚体,可以进行拖动

完整的代码和注释如下:

代码重点是在45,61行,看到没有customer_gravity按照我们希望的样子自定义了重力,是不是很好用?

自定义重力可以实现的效果很多,如失重、上升的气球等等,发挥你的想象力,没有什么做不到的。Fighting!

代码中用到了我写的静态类LDEasyBox2D,可以有效的简化代码,具体请参考这里

源代码下载

 

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

12条评论
  • lanzhipeng

    2012 年 9 月 7 日 上午 8:58

    ladeng少年不容易啊,坚持了这么久,每篇写的都很认真,继续加油,向上吧少年!哈哈哈!!!!

    -bylanzhipeng

    1. ladeng6666

      2012 年 9 月 7 日 下午 9:11

      没错的,坚持就是胜利!

  • 李杰

    2012 年 9 月 7 日 下午 10:14

    支持一个!

    1. ladeng6666

      2012 年 9 月 8 日 上午 8:54

      谢谢,欢迎常来支持!

  • xingkong33

    2012 年 9 月 8 日 上午 11:20

    顶 拉登哥,教程写的真好,简单易懂,毫不装B

    1. ladeng6666

      2012 年 9 月 8 日 上午 11:49

      谢谢你的支持,我会努力写出更多教程的!

  • dbsource

    2012 年 9 月 11 日 上午 8:57

    拉登兄弟,能不能讲讲http://www.17yy.com/f/play/78239.html中老鼠的尾巴效果是怎么实现的

    1. ladeng6666

      2012 年 9 月 11 日 下午 8:43

      兄弟,我知道了,稍后会针对你的要求写个教程,稍安勿躁!

      1. dbsource

        2012 年 9 月 12 日 上午 8:53

        大神就是大神!谢了

  • wssmrw

    2012 年 9 月 14 日 下午 4:04

    果然还是登哥牛b

  • zzzz

    2012 年 9 月 16 日 下午 3:37

    这个酷~~

  • chennick

    2012 年 10 月 17 日 下午 4:26

    能不能解释下getWorldCenter与getWorldPoint的区别

发表评论

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