This program demonstrates gluUnProject by reading the mouse position and determining the three-dimensional points at the near and far clipping planes from which it was transformed. The computed world coordinates are printed to standard output, but the rendered window itself is just black.

The example is ported from C examples in the OpenGL Programming Guide (known as the "red book").

-> Copyright and Permission Notice

 package glredbook11;

import java.awt.event.*;

import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import javax.swing.*;

/**
 * When the left mouse button is pressed, this program reads the mouse position
 * and determines two 3D points from which it was transformed. Very little is
 * displayed.
 * 
 * @author Kiet Le (Java port)
 */
public class unproject
  extends JFrame
    implements GLEventListener, KeyListener, MouseListener
{
  private GLU glu;
  private GLCapabilities caps;
  private GLCanvas canvas;
  private MouseEvent mouse;


  public unproject()
  {
    super("unproject");

    caps = new GLCapabilities();
    canvas = new GLCanvas(caps);
    canvas.addGLEventListener(this);
    canvas.addKeyListener(this);
    canvas.addMouseListener(this);

    getContentPane().add(canvas);
  }

  public void run()
  {
    setSize(500, 500);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    canvas.requestFocusInWindow();
  }

  public static void main(String[] args)
  {
    new unproject().run();
  }

  public void init(GLAutoDrawable drawable)
  {
    GL gl = drawable.getGL();
    glu = new GLU();    
  }

  public void display(GLAutoDrawable drawable)
  {
    GL gl = drawable.getGL();
   
    gl.glClear(GL.GL_COLOR_BUFFER_BIT);

    int viewport[] = new int[4];
    double mvmatrix[] = new double[16];
    double projmatrix[] = new double[16];
    int realy = 0;// GL y coord pos
    double wcoord[] = new double[4];// wx, wy, wz;// returned xyz coords
    
    if (mouse != null)
    {
      int x = mouse.getX(), y = mouse.getY();
      switch (mouse.getButton()) {
        case MouseEvent.BUTTON1:
          gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);
          gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvmatrix, 0);
          gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, projmatrix, 0);
          /* note viewport[3] is height of window in pixels */
          realy = viewport[3] - (int) y - 1;
          System.out.println("Coordinates at cursor are (" + x + ", " + realy);
          glu.gluUnProject((double) x, (double) realy, 0.0, //
              mvmatrix, 0,
              projmatrix, 0, 
              viewport, 0, 
              wcoord, 0);
          System.out.println("World coords at z=0.0 are ( " //
                             + wcoord[0] + ", " + wcoord[1] + ", " + wcoord[2]
                             + ")");
          glu.gluUnProject((double) x, (double) realy, 1.0, //
              mvmatrix, 0,
              projmatrix, 0,
              viewport, 0, 
              wcoord, 0);
          System.out.println("World coords at z=1.0 are (" //
                             + wcoord[0] + ", " + wcoord[1] + ", " + wcoord[2]
                             + ")");
          break;
        case MouseEvent.BUTTON2:
          break;
        default:
          break;
      }
    }

    gl.glFlush();
  }

  /* Change these values for a different transformation */
  public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h)
  {
    GL gl = drawable.getGL();
    
    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL.GL_PROJECTION);
    gl.glLoadIdentity();
    glu.gluPerspective(45.0, (float) w / (float) h, 1.0, 100.0);
    gl.glMatrixMode(GL.GL_MODELVIEW);
    gl.glLoadIdentity();
  }

  public void displayChanged(GLAutoDrawable drawable, boolean modeChanged,
      boolean deviceChanged)
  {
  }

  public void keyTyped(KeyEvent key)
  {
  }

  public void keyPressed(KeyEvent key)
  {

    switch (key.getKeyCode()) {
      case KeyEvent.VK_ESCAPE:
        System.exit(0);
        break;

      default:
        break;
    }

  }

  public void keyReleased(KeyEvent key)
  {
  }

  public void mouseClicked(MouseEvent e)
  {
  }

  public void mousePressed(MouseEvent e)
  {
    mouse = e;
    canvas.display();
  }

  public void mouseReleased(MouseEvent e)
  {
  }

  public void mouseEntered(MouseEvent e)
  {
  }

  public void mouseExited(MouseEvent e)
  {
  }

}

Source: Kiet Le's The Red Book Examples using JOGL