如何让 libGDX box2D 中的绳子更有弹性?

How to make a rope in libGDX box2D more springy?

我在 libGDX 中创建了几个 Box2D 绳索接头。绳子感觉有点太软了。你怎样才能使绳索更硬?主要 Box2D project 在他们的测试台演示中显示了刚度选项: 右侧的绳索显示了所需的刚度:

libGDX Box2D中是否存在这样的选项?

这就是我在 libGDX 中制作绳索的方式:

private void initRopeJoints() {
    Array<Body> bodies = new Array<Body>();
    bodies.add(BodyBuilder.createBox(world,250,360,32,32,true,true));
    for(int i = 1; i < 5; ++i) {
        bodies.add(BodyBuilder.createBox(world, 250, -i * 32 +300, 4, 32, false, false));
        RopeJointDef rDef = new RopeJointDef();
        rDef.bodyA = bodies.get(i - 1);
        rDef.bodyB = bodies.get(i);
        rDef.collideConnected = true;
        rDef.maxLength = 1f; // meters because box2d works in meters
        rDef.localAnchorA.set(0, -0.5f);
        rDef.localAnchorB.set(0, .5f);
        world.createJoint(rDef);
    }
}

// makes stronger rope - e.g. will not break
private void initRopeJointsSecondApproach() {
    Array<Body> bodies = new Array<Body>();
    bodies.add(BodyBuilder.createBox(world,250,60 +270,32,4,true,true));
    for(int i = 1; i < 20; ++i) {
        bodies.add(BodyBuilder.createBox(world, 250, -i * 4 +270, 4, 4, false, false));
        RopeJointDef rDef = new RopeJointDef();
        rDef.bodyA = bodies.get(0);
        rDef.bodyB = bodies.get(i);
        rDef.collideConnected = true;
        rDef.maxLength = i * .25f;
        rDef.localAnchorA.set(0, -.125f);
        rDef.localAnchorB.set(0, .125f);

        world.createJoint(rDef);

        RevoluteJointDef jDef = new RevoluteJointDef();
        jDef.bodyA = bodies.get(i - 1);
        jDef.bodyB = bodies.get(i);
        jDef.localAnchorA.set(0, -.125f);
        jDef.localAnchorB.set(0, .125f);

        world.createJoint(jDef);
    }
}

如果我没理解错的话,你不喜欢你的绳子像橡胶或 spring。这与 box2d 约束求解器的工作方式有关。对于每个连接,它都会尝试更正物体的位置。总的来说,效果很好。但是当有很多连接时,求解器需要时间才能将物体放在正确的位置。为此,出现了spring效应。要减少它,您可以减少模拟时间步长。这将使连接的行为更加准确,但会增加 CPU 利用率。但在您的情况下,最好添加另一个 RopeJoint,它将连接绳索的第一个和最后一个主体,并且长度等于绳索的长度。这种连接将防止绳索的起点和终点移动超过绳索的长度。

哦,我明白了。关节 (RopeJoint/RevoluteJoint) 不会为您提供预期的效果,因为它们不会限制身体围绕彼此旋转。使用调整参数频率和阻尼比的 WeldJoint。

setDampingRatio(浮动比率); 设置频率(浮动赫兹);

很难说您需要哪些频率和阻尼比参数。更改它们,直到获得所需的灵活性。