public static Vector3 GetScale(this Matrix4x4 m) { float x = Mathf.Sqrt(m.m00 * m.m00 + m.m01 * m.m01 + m.m02 * m.m02); float y = Mathf.Sqrt(m.m10 * m.m10 + m.m11 * m.m11 + m.m12 * m.m12); float z = Mathf.Sqrt(m.m20 * m.m20 + m.m21 * m.m21 + m.m22 * m.m22); return(new Vector3(x, y, z)); }
public static Quaternion GetRotation(this Matrix4x4 matrix) { Quaternion quaternion = default(Quaternion); quaternion.w = Mathf.Sqrt(Mathf.Max(0f, 1f + matrix.m00 + matrix.m11 + matrix.m22)) / 2f; quaternion.x = Mathf.Sqrt(Mathf.Max(0f, 1f + matrix.m00 - matrix.m11 - matrix.m22)) / 2f; quaternion.y = Mathf.Sqrt(Mathf.Max(0f, 1f - matrix.m00 + matrix.m11 - matrix.m22)) / 2f; quaternion.z = Mathf.Sqrt(Mathf.Max(0f, 1f - matrix.m00 - matrix.m11 + matrix.m22)) / 2f; quaternion.x = SteamVR_Utils._copysign(quaternion.x, matrix.m21 - matrix.m12); quaternion.y = SteamVR_Utils._copysign(quaternion.y, matrix.m02 - matrix.m20); quaternion.z = SteamVR_Utils._copysign(quaternion.z, matrix.m10 - matrix.m01); return(quaternion); }