示例#1
0
    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));
    }
示例#2
0
    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);
    }