Bullet Physics: How to change body mass

By , last updated September 29, 2019

We’ve run into a problem with updates of a mass of the body in our game Burnt Islands. We had some flying robots on the platforms of their factory. These robots were static objects in the beginning with no mass (mass = 0).

Rotor monster factory with monsters

After the factory was destroyed the robots would have to fly up and begin to attack. In order to do that they got mass set so that static objects became dynamic. According to Bullet Physics specification it should work with just this code:

btVector3 inertia;
body->getCollisionShape()->calculateLocalInertia( mass, inertia );
body->setMassProps(mass, inertia);

But that just didn’t work. Robots were “hanging” in the air. They wanted to attack, but couldn’t move.

The result was many robots “hanging” in the air. They wanted to attack, but couldn’t move.
Rotor robots hang in the air

The solution was to reactivate the body: remove the rigid body from the dynamics world, make the changes to the mass, and re-add the body to the dynamics world.

//Remove the rigid body from the dynamics world
m_PhysicsWorld->removeRigidBody( bt->body() );

btVector3 inertia;
body->getCollisionShape()->calculateLocalInertia( mass, inertia );
body->setMassProps(mass, inertia);

//Add the rigid body to the dynamics world
m_PhysicsWorld->addRigidBody( bt->body() );

Here is how the robots should have behaved:
Rotor robots attack the player

Senior Software Engineer developing all kinds of stuff.