首页 > 代码库 > Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)

Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)

关节在Box2D的对象组织结构中,与b2Body(刚体)并列。因此两种对象都是由b2World创建并直接管理。

然而Joint有依赖于b2Body的地方,就是它的销毁:当关节所涉及到的刚体被销毁,关节也会被销毁。此时再访问关节指针,将得到一个错误,因此,在销毁body的时候应该遍历其涉及到的Joint并销毁之。

除此之外,可算是并列于b2Body的b2World另一大组成成分。我们就得到了这么一个物理世界:有一堆刚体,也有一堆关节。这一堆刚体根据物理定律运行,这一堆关节限制或驱动某些刚体的运动。

旋转关节(b2RevoluteJoint)的注意点:

1 旋转关节的创建,需要两个刚体(废话),如果需求是一个刚体绕着一个点作有最大最小角度约束的运动,也可以选择用旋转关节,另一个物体选择一个没fiction的刚体,并设为b2_kinematicBody

2 旋转关节创建的时候需要把两个物体放到各自应该在的位置,然后给一个世界坐标作为轴。则工厂方法会按照世界坐标计算出两个物体各自的轴点,并使之符合当前的位置关系。

3 关节的角度控制。关节在创建的时候,会把当二者的相对角度记录下来成为0角度。逆时针旋转为正角度,反时针为逆角度。

4 关节的马达。关节马达有两个设置:速度和最大扭矩。速度表示马达的目标速度,未必能够达到,取决于扭矩,如果最大扭矩无法满足这个速度,就以最大扭矩来运算得到当前速度。而最大扭矩则是马达能够施加的最大扭矩。这个扭矩未必需要达到,取决于当前物体所受的力阻碍马达目标速度的程度。因此,速度和最大扭矩,都不是一设就立刻达到的东西,只是两个标准值。

然而,这里有一个坑,如果你的扭矩不够大,物体的重力可能导致设置的速度更本无法达到,我出现这个问题以后,一开始还以为速度没设上去,后来修改了扭矩才发现,是扭矩不够对抗重力的原因,因此,你希望设置速度,必须考虑设置一个足够的扭矩。

5 不管是马达还是关节限制,Joint的额外属性需要生效,几乎都需要设一个enableXXX,如果这个是false,设置的东西不会生效,没有效果

Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)