【问题标题】:How to make a rope in libGDX box2D more springy?如何使 libGDX box2D 中的绳索更有弹性?
【发布时间】:2021-11-29 22:00:07
【问题描述】:

我在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);
    }
}

【问题讨论】:

    标签: libgdx box2d


    【解决方案1】:

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

    setDampingRatio(浮动比率); setFrequency(float hz);

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

    【讨论】:

    • 太棒了!这对 WeldJoints 非常有效。 “绳子”现在有足够的弹性。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 我的目标是拥有一根更有弹性、更不松软的绳索。我添加了一个显示所需行为的 gif。我还意识到之前的屏幕截图突出显示了错误的刚度字段。抱歉,我指的是弯曲模型(而不是拉伸模型)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多