使box2d对象的速度永远不会改变

时间:2012-07-25 19:53:57

标签: box2d

我在屏幕上有几个圆圈,放在不同的位置(所有动态的box2d主体)。

我想添加另一个圈子,初始速度为x, y。我希望这个身体自由移动,就好像没有引力一样。使它的所有碰撞100%弹性。

我尝试将弹性设置为1,但是如果我从顶部放下它,它就不会再次触及天花板。我希望它继续沿着它设置的方向移动,除非碰撞改变方向

为了进一步解释这一点,我想要的一个简单的实现是在方形容器中,带有圆形体。

when collides ->
  set body.velocityX to -body.velocityX
  set body.velocityY to -body.velocityY

当然,如果我介于两者之间,这不起作用。

使用box2d框架或伪代码的任何语言的建议将不胜感激。

2 个答案:

答案 0 :(得分:3)

除了设置弹性之外,还需要将体的阻尼设置为0,以消除您现在看到的速度降低效果。

From the Box2d manual

  

阻尼用于降低身体的世界速度。阻尼与摩擦不同,因为摩擦仅在接触时发生。   阻尼不是摩擦的替代品,两种效应应该是   一起使用。

     

阻尼参数应介于0和无穷大之间,0表示无阻尼,无穷大表示完全阻尼。

     

...

bodyDef.linearDamping = 0.0f;

bodyDef.angularDamping = 0.01f;
     

阻尼近似于稳定性和性能。在小阻尼值下,阻尼效应主要与时间无关   步。在较大的阻尼值下,阻尼效果会随着阻尼效应而变化   时间步。如果您使用固定时间步骤,这不是问题   (推荐)。

此外,如手册中所述,阻尼与摩擦力不同......因此您可能也希望将身体的摩擦力设置为0。

答案 1 :(得分:0)

设置b2BodyDef :: type = b2_kinematicBody。

Box2D手册说:

  

运动物体根据其速度在模拟下移动。运动机构不会对力量做出反应。它们可以由用户手动移动,但通常通过设置其速度来移动运动体。运动物体表现得好像它具有无限质量,然而,Box2D为质量和反质量存储零。运动物体不会与其他静态或运动物体碰撞。