【问题标题】:Box2D: Rope pendulum (no stop)Box2D:绳摆(不停)
【发布时间】:2014-01-18 14:42:44
【问题描述】:

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

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

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

有人可以帮助我吗? 谢谢!!

Scene image

【问题讨论】:

  • 也可以使用FloatSpring查看example

标签: java libgdx box2d jbox2d


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

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

这有帮助吗?

【讨论】:

  • 感谢@FuzzyBunnySlippers!这是我在 jBox2D 上工作的第二天......我应该“有信心”了。
  • @fpellegrino 祝你好运。随意查看我网站上的其他一些帖子(nlideas.com)。另外,在 iForce2d 网站 (iforce2d.net/b2dtut) 上有很多很好的教程。
  • 如何在我的游戏中绘制绳索关节?显然,如果我删除 DebugRender 绳索和其他身体模型被隐藏。所以对于游戏的某些元素,我使用图像(精灵)而不是绳索?精灵应该是相同的位置和关节的倾角...
  • 为此,您可以使用“verlet”方法,该方法允许松弛的线条(例如“割绳子”游戏),或者您可以使用“快速而肮脏”的方法:创建一个“绳子精灵”图像(带有一些颜色的小圆圈),然后沿着绳子的长度以均匀的间隔复制它,通常它们会重叠。如果绳索在移动(每帧),您必须重新计算精灵的位置。我在这里有一个例子(见主页上的视频):nonlinearideas.com.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多