Box2D:绳摆(不停)

时间:2014-01-18 14:42:44

标签: java libgdx box2d jbox2d

我想制作一个场景,其中有一个“钟摆”不断振荡,没有停止。我上传了一张图片以便更清晰。所以我尝试使用Box2D关节。例如:

   RevoluteJointDef revDef = new RevoluteJointDef();
     revDef.initialize(ball, box, ball.getWorldCenter());
     revDef.lowerAngle = 0 * MathUtils.degreesToRadians;
     revDef.upperAngle = 180 * MathUtils.degreesToRadians;
     revDef.enableLimit = true;
     revDef.maxMotorTorque = 10.0f;
     revDef.motorSpeed = 2.0f;
     revDef.enableMotor = true;

  revoluteJoint = (RevoluteJoint)world.createJoint(revDef);

但它不起作用。如果我评论限制和电机线路,我获得的结果与取消注释这些线路时获得的结果相同。虽然电机已启用,但似乎无效。

P.S。当用户通过按下按钮释放盒子时,电动机必须停止。因此,由于重力,箱子会掉到地上。

有人能帮助我吗? 谢谢!

Scene image

1 个答案:

答案 0 :(得分:1)

我不认为你需要一个旋转关节,而是绳索关节(b2RopeJoint)。旋转关节将使两个对象围绕单个点旋转。绳索接头将像摆锤一样从另一个摆动。

你需要用一根绳索将摆锤连接到一个静止的身体上。然后在你希望它坠落时切断绳索。如果重力打开并且你没有任何减速力,钟摆应该无限期地持续(或者根据数字而持续很长时间)。

Take a look at this post就是这样做的。请注意,代码也发布在github here上。在这种情况下,增加了两个额外的绳索关节来约束身体,使其无法移动到初始挥杆的末端。我认为你不需要那些。

要自己制作摆锤,请使用以下内容:

   // Calculate the local position of the
   // top of screen in the local space
   // of the ground box.
   CCSize scrSize = CCDirector::sharedDirector()->getWinSize();
   b2Vec2 groundWorldPos = b2Vec2((scrSize.width/2)/PTM_RATIO,(scrSize.height)/PTM_RATIO);
   b2Vec2 groundLocalPos = m_pGround->GetLocalPoint(groundWorldPos);

   // Now create the main swinging joint.
   b2RopeJointDef jointDef;
   jointDef.bodyA = m_pGround;
   jointDef.bodyB = body;
   jointDef.localAnchorA = groundLocalPos;
   jointDef.localAnchorB = b2Vec2(0.0f,0.0f);
   jointDef.maxLength = (groundWorldPos-body->GetWorldCenter()).Length();
   jointDef.collideConnected = true;
   world->CreateJoint(&jointDef);

注意 这是在C ++中,而不是java(对于libgdx),但方法应该是合理的,你只需要映射“ - >”到“。”在需要的地方。

在我的例子中,它看起来像这样(图像从其他发布的答案中解放出来):

enter image description here

这有用吗?