public static Matrix3f createNormalMatrix(Matrix4f viewMatrix, Matrix4f modelMatrix)
        {
            Matrix3f result;

            result = MatrixTransforms.Transpose(MatrixTransforms.Inverse(viewMatrix * modelMatrix)).toMatrix3();
            return(result);
        }
        /// <summary>
        /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates.
        /// </summary>
        /// <param name="win">The win.</param>
        /// <param name="model">The model.</param>
        /// <param name="proj">The proj.</param>
        /// <param name="viewport">The viewport.</param>
        /// <returns></returns>
        public static Vector3f unProject(Vector3f win, Matrix4f model, Matrix4f proj, Vector4f viewport)
        {
            Matrix4f Inverse = MatrixTransforms.Inverse(proj * model);

            Vector4f tmp = new Vector4f(win, (1f));

            tmp.x = (tmp.x - (viewport[0])) / (viewport[2]);
            tmp.y = (tmp.y - (viewport[1])) / (viewport[3]);
            tmp   = tmp * (2f) - (1f);

            Vector4f obj = Inverse * tmp;

            obj /= obj.w;

            return(new Vector3f(obj));
        }