A couple of questions:
If the camera is set at (0,0,0) and the negative z-axis points into the screen and the zNear and zFar planes are set to 1 and 1,000 using gluPerspective() then how can an object be viewed as we are looking down the -z axis with the near/far planes behind the viewer?
What is the relationship between the near and far z values set with glDepthRange() and those using gluPerspective()? I’m using the method described by opengl.org to develop a picking-ray using gluUnProject() with z=0 for the near plane and z=1 for the far-plane. Do I have to map the values returned by gluUnProject() to the near-far z clip planes set by gluPerspective()?
public Ray3D mouseRayWorldCoordinates()
GL2 gl2 = gl;
// mouse coordinates int mouseX = xCoord; int mouseY = yCoord; int viewport = GLUtilities.viewportArray(gl2); float mvMatrix = GLUtilities.modelViewMatrixAsFloatArray(gl2); float projMatrix = GLUtilities.projectionMatrixAsFloatArray(gl2); int glY = viewport - (int)mouseY - 1; // GL y coord pos - note viewport is height of window in pixels // world near - the gluUnProject z value is the screen depth value which goes from 0.0 -> 1.0 System.out.println("Coordinates at cursor are (" + mouseX + ", " + mouseY); float wcoordNear = new float; boolean ok = glu.gluUnProject((float) mouseX, (float)glY, 0.0f,mvMatrix, 0,projMatrix, 0,viewport, 0,wcoordNear, 0); System.out.println("World coords at z=0.0 are ( " // + wcoordNear + ", " + wcoordNear + ", " + wcoordNear + "); ok: " + ok); // world far float wcoordFar = new float; ok = glu.gluUnProject((float) mouseX, (float) glY, 1.0f,mvMatrix, 0,projMatrix, 0,viewport, 0,wcoordFar, 0); System.out.println("World coords at z=1.0 are (" // + wcoordFar + ", " + wcoordFar + ", " + wcoordFar + "); ok: " + ok); // direction vector is far point - near point Vector3D dirVector = new Vector3D(wcoordFar-wcoordNear,wcoordFar-wcoordNear,wcoordFar-wcoordNear); dirVector.normalise(); Point3D viewerLocation = GLUtilities.cameraLocation(gl2); Ray3D mouseRay = new Ray3D(viewerLocation,dirVector); //Ray3D mouseRay = new Ray3D(new Point3D(wcoordNear,wcoordNear,wcoordNear),dirVector); return mouseRay;