繁体   English   中英

Box2D:绳索摆(不停)

[英]Box2D: Rope pendulum (no stop)

我想做一个场景,那里有一个“钟摆”不断振荡,没有停止。 我上传了一张图片,以提高清晰度。 所以我尝试使用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当用户按下按钮释放盒子时,电动机必须停止。 因此,箱子由于重力而掉落到地面上。

有人能帮我吗? 谢谢!!

场景图片

我认为您不需要为此使用旋转接头,而需要使用绳索接头(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),但是这种方法应该是正确的,您只需要将“->”映射到“”即可。 在需要的地方。

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

在此处输入图片说明

这个有帮助吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM