public static Quaternion QuaternionFromMatrix(Matrix4x4 m)
{
Quaternion q = new Quaternion {
w = Mathf.Sqrt(Mathf.Max((float) 0f, (float) (((1f + m[0, 0]) + m[1, 1]) + m[2, 2]))) / 2f,
x = Mathf.Sqrt(Mathf.Max((float) 0f, (float) (((1f + m[0, 0]) - m[1, 1]) - m[2, 2]))) / 2f,
y = Mathf.Sqrt(Mathf.Max((float) 0f, (float) (((1f - m[0, 0]) + m[1, 1]) - m[2, 2]))) / 2f,
z = Mathf.Sqrt(Mathf.Max((float) 0f, (float) (((1f - m[0, 0]) - m[1, 1]) + m[2, 2]))) / 2f
};
q.x *= Mathf.Sign(q.x * (m[2, 1] - m[1, 2]));
q.y *= Mathf.Sign(q.y * (m[0, 2] - m[2, 0]));
q.z *= Mathf.Sign(q.z * (m[1, 0] - m[0, 1]));
QuaternionNormalize(ref q);
return q;
}