【问题标题】:Achieve joint break when more than certain force is applied当施加超过一定的力时实现关节断裂
【发布时间】:2013-02-25 11:39:33
【问题描述】:

我有两个动态主体通过一个旋转关节连接在一起。两个主体还连接到另一端的静态主体。当施加超过一定量的力时,我需要两个动态体之间的关节断裂,也就是说,当质量超过关节能够抵抗时。这是如何在 Box2d 中完成的?我猜这不是由 Box2d 自动处理的。这是我想要实现的图形概览。

【问题讨论】:

    标签: box2d revolute-joints


    【解决方案1】:

    使用 b2Joint::GetReactionForce。

    在每个时间步检查中,如果关节的反作用力小于某个临界值。当力量变得更大时,破坏关节。

    void update(float timeStep)
    {
        b2Vec2 reactionForce = joint->GetReactionForce(1/timeStep);
        float forceModuleSq = reactionForce.LengthSquared();
        if(forceModuleSq > maxForceSq)
        {
            world->DestroyJoint(joint);
        }
    }
    

    world - 指向 b2World 的指针,joint - 指向 b2RevoluteJoint 的指针,maxForceSq - 最大力的平方。

    看,这里计算LengthSquared,并与平方maxForce进行比较。这将提高性能,因为不需要计算平方根。

    最大力可以计算为重力:maxMass*9.8。

    【讨论】:

    • 感谢您的回答。我也一直在排练 GetReactionForce,但我不明白它所需要的论点的作用。我刚刚通过 1.0 没有任何线索。你能告诉我这个论点是为了什么吗?
    • 它是倒置的时间步长,即 1/timeStep(如您在我的代码中所见)。 timeStep 是作为第一个参数传递给 b2World::Step 的值。
    • 我从哪里获得最大质量?
    • 这是您问题中“具有一定质量的物体”的质量。尝试并找到所需的价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2018-12-05
    相关资源
    最近更新 更多