How to convert Torque Stabilizer to RigidBody2D?

Can someone help me? I’m trying to translate this TorqueStabilizer concept to work with RigidBody2D.
http://wiki.unity3d.com/index.php/TorqueStabilizer

I only vaguely understand Quaternions, so it’s difficult to tell how to translate the quaternions used by RigidBody for AngularVelocity and Torque to the floats used by RigidBody2D. Could anyone here offer suggestions?

Thanks - Slapworth

It is a poor algorithm, but at least it’s simple.

You could try these changes which preserve the existing structure - I just removed the “magnitude” conversion from the angular velocity, and fixed it to be about Vector3.forward (the Z axis), and made the AddTorque call only pass through the Z component of the calculated torque (the other components ought to be zero anyway):

public class TorqueStabilizer2D : MonoBehaviour {
 
    public float stability = 0.3f;
    public float speed = 2.0f;
 
    void FixedUpdate () {
        Vector3 predictedUp = Quaternion.AngleAxis(
            rigidbody2D.angularVelocity * Mathf.Rad2Deg * stability / speed,
            Vector3.forward
        ) * transform.up;
 
        Vector3 torqueVector = Vector3.Cross(predictedUp, Vector3.up);
        rigidbody2D.AddTorque(torqueVector.z * speed);
    }
}

All the messing about with vectors is very indirect though, it’s essentially the same as this simpler code:

public class TorqueStabilizer2D : MonoBehaviour {

    public float stability = 0.3f;
    public float speed = 2.0f;

    void FixedUpdate () {
        float currentAngle = Mathf.Atan2(transform.up.x, transform.up.y);
        float predictedAngle = currentAngle - rigidbody2D.angularVelocity * stability / speed;
        float torque = Mathf.Sin(predictedAngle);
        rigidbody2D.AddTorque(torque * speed);
    }
}