我想做一个场景,那里有一个“钟摆”不断振荡,没有停止。我上传了一张图片,以提高清晰度。所以我尝试使用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
最佳答案
我认为您不需要为此使用旋转接头,而需要使用绳索接头(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),但是方法应该是正确的,您只需要将“->”映射到“”即可。在需要的地方。
在我的示例中,它最终看起来像这样(图像从其他发布的答案中解放出来):
这个有帮助吗?