code: public Vector2d unprojectInv(double winX, double winY, int[] viewport, Vector2d dest) {
          double ndcX = (winX-viewport[0])/viewport[2]*2.0-1.0;
          double ndcY = (winY-viewport[1])/viewport[3]*2.0-1.0;
          dest.x = m00 * ndcX + m10 * ndcY + m20;
          dest.y = m01 * ndcX + m11 * ndcY + m21;
          return dest;
      }
docs: Unproject the given window coordinates <code>(winX, winY)</code> by <code>this</code> matrix using the specified viewport.
  <p>
  This method differs from {@link #unproject(double, double, int[], Vector2d) unproject()}
  in that it assumes that <code>this</code> is already the inverse matrix of the original projection matrix.
  It exists to avoid recomputing the matrix inverse with every invocation.
  
  @see #unproject(double, double, int[], Vector2d)
  
  @param winX
  the x-coordinate in window coordinates (pixels)
  @param winY
  the y-coordinate in window coordinates (pixels)
  @param viewport
  the viewport described by <code>[x, y, width, height]</code>
  @param dest
  will hold the unprojected position
  @return dest