如何防止在Box2D中移动运动平台和动态物体之间的抖动?

时间:2012-05-03 22:26:30

标签: c++ box2d game-physics

我有一个移动平台(运动体),从它的初始位置上升。

b2BodyDef platformDef;
platformDef.type = b2_kinematicBody;
platformDef.linearVelocity = b2Vec2(0.f, 0.5f);

现在我有一个球(动态的身体),玩家控制,它可以乘坐上述平台从它的位置上升。这是球的数据:

b2BodyDef ballDef;
ballDef.type = b2_dynamicBody;
ballDef.fixedRotation = true;
b2Body *ball = b2dWorld.CreateBody(&ballDef);
b2FixtureDef fixDef;
fixDef.shape = &shapeCircle;  // a simple b2CircleShape with radius 0.6m
fixDef.density = 1.f;
fixDef.friction = 0.2f;
fixDef.restitution = 0.3f;
ball->CreateFixture(&fixDef);

现在球正好在移动平台的顶部移动,同时在整个行程中球的身体略微抖动,即它不断地与其移动的平台碰撞。我已经尝试将球的恢复原状设置为0,但无济于事。

如果需要这个细节,系统的像素与米的比率为0.02。

1 个答案:

答案 0 :(得分:1)

我相信最好的解决方案是两个机构之间的两个焊接接头之一。

如果主体在平台上是“静止的”(不是左右移动),那么当球在平台上时,在球和平台之间创建焊接接头。

如果球可以从一侧移动到另一侧,则在两者之间形成一个棱柱形接头,接头的方向平行于平台。

我使用了类似的技术让蜘蛛绕着小行星(here)行走。

真正的想法是,物理引擎中有一些工具可以用来真正增强幕后的体验,而这些体验并不总是在模拟中发挥作用。使用情境的逻辑来改变动态。

在这种情况下,开启或关闭平台意味着您必须连接或断开其他一些机制以提供更好的体验。

引擎可以处理它。在上面的例子中,用于在身体周围行走的关节在小行星的边界船体的每个顶点都会发生变化。