b2RopeJoint如何使用DampingRatio

时间:2014-01-19 14:43:41

标签: box2d cocos2d-x

我做绳子的事实。使用b2RopeJoint。但它没有DampingRatio,例如在b2DistanceJoint。我怎样才能为我的绳子添加小阻尼。请帮忙)) 我创造绳索:

void GameScene::createRope(b2Body *bodyA, b2Body *bodyB, b2Vec2 anchorA, b2Vec2 anchorB, float sag)
{
      b2RopeJointDef jd;
    jd.bodyA = bodyA;
    jd.bodyB = bodyB;

    jd.localAnchorA = anchorA;
    jd.localAnchorB = anchorB;
    jd.collideConnected = true;
    // Max length of joint = current distance between bodies * sag
    float32 ropeLength = (bodyA->GetWorldPoint(anchorA)- bodyB->GetWorldPoint(anchorB)).Length()*sag;
    jd.maxLength = ropeLength;
    // Create joint
    b2RopeJoint* ropeJoint=(b2RopeJoint*) world->CreateJoint(&jd);

   VRope *newRope = new VRope(ropeJoint, _ropeSpriteSheet);
_ropes.push_back(newRope);
}

1 个答案:

答案 0 :(得分:2)

对于绳子的阻尼,你的意思并不是很清楚,但我认为你希望绳子看起来有点有弹性。

您可以使用距离关节和绳索关节的组合。如果你使距离接头比绳索接头短一点,那么当绳子接近完全伸展时,它会倾向于使牵引物体减慢一点,并将其返回到比绳索接头极限更近的“休息”位置。您还需要检查关节锚是否比距离关节的长度更近,如果是,则将距离关节的阻尼设置为零,以防止它将连接体推开。

例如,假设绳索的自然长度应为1,但是当它被重物拉动时,你想让它伸展到1.1。在这种情况下,距离接头的长度为1,并且绳索接头的长度为1.1

要检查距离关节阻尼何时应设置为零,您可以执行以下操作:

//b2DistanceJoint dj;

float distBetweenAnchors = ( dj.getAnchorA() - dj.getAnchorB() ).Length();
if ( distBetweenAnchors < dj.GetLength() )
    dj.SetDampingRatio( 0 );
else
    dj.SetDampingRatio( NORMALDAMPING );