1

我想制作一个有“钟摆”不断摆动,不停歇的场景。为了更清晰,我上传了一张图片。所以我尝试使用 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);

但它不起作用。如果我注释限制和电机线,我得到的结果与未注释这些线时得到的结果相同。虽然启用了电机,但它似乎不起作用。

PS 当用户按下按钮释放盒子时,电机必须停止。所以盒子会因为重力而掉到地上。

有人能帮我吗?谢谢!!

场景图像

4

1 回答 1

1

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

您需要用一根绳索接头将摆锤连接到静止的物体上。然后当你想让绳子掉下来的时候剪断绳子。如果重力打开并且您没有任何减速力,则钟摆应该无限期地继续(或根据数字持续很长时间)。

看看刚刚为这样的事情完成的这篇文章。请注意,代码也发布在github上。在这种情况下,增加了两个额外的绳索接头来约束身体,使其无法移动超过初始挥杆的末端。我不认为你需要那些。

要自己创建钟摆,请使用以下内容:

   // 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),但方法应该是合理的,您只需将“->”映射到“。” 需要的地方。

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

在此处输入图像描述

这个有帮助吗?

于 2014-01-18T15:27:22.727 回答