2

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

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

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

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

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

当然,如果我中间有尸体,这不起作用。

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

4

2 回答 2

3

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

从 Box2d 手册

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

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

...

bodyDef.linearDamping = 0.0f;

bodyDef.angularDamping = 0.01f;

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

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

于 2012-07-25T20:01:39.827 回答
0

设置 b2BodyDef::type = b2_kinematicBody。

Box2D 手册说:

运动体根据其速度在模拟下移动。运动学物体不响应力。它们可以由用户手动移动,但通常运动体通过设置其速度来移动。运动物体的行为就好像它具有无限质量,但是,Box2D 将质量和反质量存储为零。运动实体不会与其他静态或运动实体发生碰撞。

于 2012-07-29T09:46:17.577 回答