Adding Torque To A Rigidbody Does Not Add It To Its Coordinate System (Unity)

Adding Torque To A Rigidbody Does Not Add It To Its Coordinate System (Unity)

Symptoms

  • I want to add torque to a Rigidbody that has a complex shape (different that simply a box primitive, or a Rigidbody that has its center of gravity perfectly aligned along one of the body’s local x,y,z axis.) and use AddRelativeTorque, but the Rigidbody is sent spinning around another unexpected axis.

Cause

AddRelativeTorque adds torque according to its Inertia Tensors. Therefore, the desired angular velocity must be transformed according to the Inertia Tensor, to get the required Torque.

Resolution

If you want to spin the object at a specific angular velocity, and you want it to rotate through the principal axes then you can use a code like this:

// Rotate about Y principal axis
Vector3 desiredAngularVelInY = new Vector3(0, Mathf.PI, 0); //  1/2 revs per second 
Vector3 torque = rigidbodyCached.inertiaTensorRotation * Vector3.Scale(rigidbodyCached.inertiaTensor, desiredAngularVelInY);
rigidbody.AddRelativeTorque(torque, ForceMode.Impulse);

Please note that this solution only works for single Rigidbodies, including GameObjects having multiple colliders in the same GameObject. It does not work for multiple Rigidbodies connected with Joints.

 

Was this article helpful?

Related Articles