box2d 中的坑(版本2.2.1)
1.除圆之外的所有shape ,都会在外围有一圈薄薄的skin(貌似用来做碰撞检测,大约两厘米,可在b2setting修改b2_polygonRadius来配置)
因此显示的物件应该比实际shape大一圈,两个物体叠在一起的时候,才不会产生空隙
2.box2d中物体在速度比较快的情况下,可能会穿透另外一个物体,这个状况被作者叫做tunneling,设置物体为bullet可以在很大程度上避免。这一点大家都知道,
但bullet物体有个特点,它在碰撞时会忽略自身或者碰撞对象的joint,这就会造成joint连接的物体被暂时分开的情况:比如撞击跷跷板,板子和底座会被撞分开一段时间。这一点,可以通过将被撞的物体密度设置的很大来避免 -- 我重了你当然撞不动了!-_-
3.box2d中b2GearJoint需注意设置bodyA和bodyB
由于游戏中要实现对齿轮的模拟,于是用了box2d的b2GearJoint,在box2d中写好testbed,看着效果还行就兴冲冲的搬到自己项目中了,结果始终不起作用,两处代码对比也看不出所以然。只好去看box2d的源代码,折腾了几个小时,终于被我发现了---在b2world的createjoint方法中,创建一个joint后,会把该joint指针放入双方body的joint list 中,注意看代码,是放入bodyA和bodyB的joint list中

然后在b2world的step中,会遍历所有非静态body的joint处理连接关系,通常情况下,这没有问题,但是对于b2gearjoint不行---因为它自身包含着两个joint,涉及到4个body.而这4个body,是以这样奇葩的方式对应进来

明白了什么木有,在b2world的createjoint函数中,只会把生成的gearjoint放入bodyA和bodyB中,于是乎,但你创建的两个revolutejoint的bodyB都是静态物体时,b2world的step函数就会直接忽略掉这个gearjoint了。因此在使用现版本的b2gearjoint时,千万要注意连接的两个revlotutejoint的bodyB一定不能都为静态物体
浙公网安备 33010602011771号