public static double Determinant(Matrix3 matrix)
 {
     float[,] m = matrix.matrix;
     double deter = 0;
     deter = m[0, 0] * m[1, 1] * m[2, 2] + m[0, 1] * m[1, 2] * m[2, 1] +
         m[0, 2] * m[1, 0] * m[2, 1] - m[0, 0] * m[1, 2] * m[2, 1]
         - m[0, 1] * m[1, 0] * m[2, 2] - m[0, 2] * m[1, 1] * m[2, 0];
     return deter;
 }
        /// <summary>
        /// Calculate hip angle
        /// [0]: calculates the (x,y) angle
        /// [1]: calculates the (y,z) angle
        /// [2]: calculates the (x,z) angle
        /// </summary>
        /// <returns>double[]</returns>
        public double[] rotationAngles(JointType currentJoint)
        {
            double[] angles = new double[4];
            if (currentJoint == JointType.ElbowLeft || currentJoint == JointType.ElbowRight
                || currentJoint == JointType.KneeLeft || currentJoint == JointType.KneeRight)
            {
                angles[1] = Vector3.GetAngle(vectNext, vectPrevious);
                return angles;
            }

            SkeletonPoint[] _obj = (SkeletonPoint[])jointLinks[currentJoint];
            SkeletonPoint zAxis = new SkeletonPoint();

            if (_obj.Length == 5)
            {
                zAxis = (SkeletonPoint)(_obj[4]);//the axis for measuring the rotation around the y-axis
            }

            double angle;
            Matrix3 rotationMatrixY = new Matrix3();
            if (_obj.Length == 5)
            {
                angle = angles[3] = Vector2.signedAngle(new Vector2(0, 1), new Vector2(zAxis.X, zAxis.Z));
                rotationMatrixY = RotationMatrix.GetRotationMatrix3Y(angle * Math.PI / 180);
            }
            //find the rotation according to the vertical axis
            angle = Vector2.signedAngle(new Vector2(1, 0), new Vector2(vectPrevious.Y, vectPrevious.Z));
            Matrix3 rotationMatrixX = RotationMatrix.GetRotationMatrix3X(angle * Math.PI / 180);

            angle = Vector2.signedAngle(new Vector2(0, 1), new Vector2(vectPrevious.X, vectPrevious.Y));
            Matrix3 rotationMatrixZ = RotationMatrix.GetRotationMatrix3Z(angle * Math.PI / 180);

            if (_obj.Length == 5)
            {
                vectNext = rotationMatrixY * vectNext;
            }
            vectNext = (rotationMatrixZ * (rotationMatrixX * vectNext));

            angles[0] = Vector2.signedAngle(new Vector2(0, 1), new Vector2(vectNext.X, vectNext.Y));
            angles[1] = Vector2.signedAngle(new Vector2(1, 0), new Vector2(vectNext.Y, vectNext.Z));
            angles[2] = Vector2.signedAngle(new Vector2(0, 1), new Vector2(vectNext.X, vectNext.Z));

            counter++;

            return angles;
        }