In Box2D, how can I get the compression force on a specific body?

| | August 5, 2015

enter image description here

I’m using Box2D. As you can see, there are three dynamic bodies connected to each other (think of it as a table from front view). LEG1 and LEG2 are connected to the static body (it’s the ground body). Another dynamic body is falling onto the table.

I need to get the compression in the LEG1 and LEG2 separately.

Joints have a GetReactionForce() function which returns a b2Vec, which in turn has Length() and LengthSqd() functions. This will give the total sum of the forces in any taken joint. But what I need is forces in individual bodies that are connected with joints. Once you connect several bodies with a single joint it again will show the sum of forces which is not useful. Here’s the case I’m talking about:

enter image description here

One Response to “In Box2D, how can I get the compression force on a specific body?”

  1. Both the distance joint and weld joints have local anchors within them. Each anchor is relative to one of the bodies connected by the joint. You can find your compression of an individual joint by finding the distance between the two anchor points in world space.

    You can use these functions to retrieve them:

    joint->GetLocalAnchorA( );
    joint->GetLocalAnchorB( );
    

    To transform these points to world space you can use the function on each body called:

    body->GetWorldPoint( v ); // Get the world coordinates of a vector given the local coordinates.
    

    The weld joints (or distance joints) should be using soft constraints, otherwise the error will mostly be negligible anyway.

Leave a Reply