我在屏幕上有几个圆圈,放在不同的位置(所有动态的box2d主体)。
我想添加另一个圈子,初始速度为x, y
。我希望这个身体自由移动,就好像没有引力一样。使它的所有碰撞100%弹性。
我尝试将弹性设置为1,但是如果我从顶部放下它,它就不会再次触及天花板。我希望它继续沿着它设置的方向移动,除非碰撞改变方向。
为了进一步解释这一点,我想要的一个简单的实现是在方形容器中,带有圆形体。
when collides ->
set body.velocityX to -body.velocityX
set body.velocityY to -body.velocityY
当然,如果我介于两者之间,这不起作用。
使用box2d框架或伪代码的任何语言的建议将不胜感激。
答案 0 :(得分:3)
除了设置弹性之外,还需要将体的阻尼设置为0,以消除您现在看到的速度降低效果。
阻尼用于降低身体的世界速度。阻尼与摩擦不同,因为摩擦仅在接触时发生。 阻尼不是摩擦的替代品,两种效应应该是 一起使用。
阻尼参数应介于0和无穷大之间,0表示无阻尼,无穷大表示完全阻尼。
...
bodyDef.linearDamping = 0.0f; bodyDef.angularDamping = 0.01f;
阻尼近似于稳定性和性能。在小阻尼值下,阻尼效应主要与时间无关 步。在较大的阻尼值下,阻尼效果会随着阻尼效应而变化 时间步。如果您使用固定时间步骤,这不是问题 (推荐)。
此外,如手册中所述,阻尼与摩擦力不同......因此您可能也希望将身体的摩擦力设置为0。
答案 1 :(得分:0)
设置b2BodyDef :: type = b2_kinematicBody。
Box2D手册说:
运动物体根据其速度在模拟下移动。运动机构不会对力量做出反应。它们可以由用户手动移动,但通常通过设置其速度来移动运动体。运动物体表现得好像它具有无限质量,然而,Box2D为质量和反质量存储零。运动物体不会与其他静态或运动物体碰撞。