Box2D学习指南

6 篇文章 0 订阅

1.入门知识

1.0 下载代码并且运行。我尝试很久在iphone上运行Box2D的Testbed,失败。最后只能是在Mac上运行。但这个已经给人一个很直观的效果。

1.1 阅读官方文档,不好懂,读一遍知道一些概念就好了,以后就留着它用来参考好了。同时阅读源代码中带的HelloWorld。

1.2 一个不错的入门介绍,比官方文档好多了。http://www.iforce2d.net/b2dtut/introduction

1.3 需要弄懂一些物理知识,这个时候可以充分发挥wiki的作用,如冲量(Impulse),作用力(Force),加速度(Acceleration)等等。这些概念很重要,如果你想要更好的利用Box2D。譬如在http://www.iforce2d.net/b2dtut/forces这里讨论冲量和作用力的时候,提到如果对一个物体作用相同的冲量和作用力,会发现前者的速度要快。为什么呢?因为I=F*dt, F=m*a, 对于利用冲量ApplyImpulse来说考虑的是合力,而用力ApplyForce则是一个作用力,而综合的运动效果还需要考虑重力。如果ApplyForce的时候,把重力设置为0,就会发现冲量和作用力的效果是一致的。


2. 深入

2.1 需要阅读Testbed里面的源代码。

譬如在我的手机应用当中,考虑用鼠标拖动一个物体,然后对这个物体要跟着鼠标运动。显然这个物体的显示是一个图片,而背后才是一个看不见的Box2D world,因为Box2D是不负责渲染,也就是左图。在开始的时候,鼠标拖动物体,我就尝试着讲可见的图片移动到鼠标位置,同时将对应的Body也移动到相同位置,当然这个时候我不调用world->step,也就是不让world里面的东西发生任何物理改变。当松开鼠标的时候,再正常调用world->Step方法以促使发生物理变化。可以发现基本上还是正常的。但是问题在于当你移动物体的时候,没有办法做到物体本身绕着鼠标点击的位置进行绕动。而在看Testbed里面的例子会发现,在移动物体的时候会出现刚才说的绕动现象。为什么呢?问题就在于即便在鼠标移动状态,物理世界也是在发生变化,而在调用world的Step方法之后立即重绘图形界面,这样就可以实现绕动。

抛开细节最关键的一点就是,在运动过程中,图形界面的渲染是基于物理世界的变化,而不是由图形渲染影响物理世界。

2.2 很多图像不是方或者圆的,也不是一个简单的多边形,而可能是多个多边形的组合。这个时候你可能需要用到这个工具Box2DEditor。它可以根据你画的边界自动分解生成多个多边形。然后根据生成的文件解析加载到应用中。具体说来,生成文件最好是选择xml或json,然后自己实现解析代码(如果是java的话可以用源代码自带的)。譬如我用c++就是读入文件里面的多边形数据,利用每个多边形为Body创建一个Fixture(一个Body可以有很多Fixture),这样也就构成了我们想要的不规则的Body。

2.3 最后的一个问题是:不知道为什么我的应用中,物体可以嵌入到地面,譬如我的地面是这么个形状 \__/  ,在凹槽中间放置一个小车,拖动鼠标的时候,小车一部分可以越过斜边,这个时候小车就卡住不动了,然后界面出现闪烁。但是在Testbed里面是不能越过斜边的。这个问题解决起来居然很简单。我仔细比对了一下我的和Testbed里面Test.cpp的代码,发现Test.cpp的MouseDown里面,有下面的代码:

b2MouseJointDef md;

md.bodyA = m_groundBody;

md.bodyB = body

其中m_groundBody的创建为:

b2BodyDef bodyDef;

m_groundBody = m_world->CreateBody(&bodyDef);

而在我的代码里面,把m_groundBody理解为真正的groundBody,也就是四周的static ground,如上面描述的凹槽地面。但是你可以发现在MotorJoint.h中的ground实际上是另外i定义的,并不是这个m_groundBody。于是把代码改成跟Test.cpp里面的一致,问题就解决了。原因不明 :)


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值