gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);
gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, proj, 0);
gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, model, 0);
FloatBuffer fb = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asFloatBuffer();
gl.glReadPixels(mouseX, height - mouseY, 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT, fb);
fb.rewind();
double[] mousePosArr = new double[4];
glu.gluUnProject((double) mouseX, height - (double) mouseY, (double) fb.get(0), model, 0, proj, 0, viewport, 0,
mousePosArr, 0);
((PGraphicsOpenGL) g).endGL();
return new float[] { (float) mousePosArr[0], (float) mousePosArr[1], (float) mousePosArr[2] };