Link to home
Start Free TrialLog in
Avatar of ctuffli
ctuffli

asked on

unexpected depth value returned by gluUnProject

I've found the resources on the net to use gluUnProject() to get the world (x,y,z) values given a screen coordinate. The code seems to work, but I'm a little confused by the z value returned. The application renders a triangle strip in which all z values are -3.0f, but the z value returned from gluUnProject is -1.0f.

The application sets the viewport with

    gluPerspective(37.0, (GLfloat)w/(GLfloat)h, 1, 20.0);

The vertices get setup with
    glBegin(GL_TRIANGLE_STRIP);
    glVertex3f( xstep, ystep, -3.0f);
    ...

Any idea why the z value isn't -3.0f?
Avatar of davebytes
davebytes
Flag of United States of America image

From :
>>>>
gluUnProject() does the opposite. It takes an XYZ window coordinate and returns the back-transformed XYZ object coordinate equivalent.

The concept of window space Z is often confusing. It's the depth buffer value expressed as a GLdouble in the range 0.0 to 1.0. Assuming a default glDepthRange(), a window coordinate with a Z value of 0.0 corresponds to an eye coordinate located on the zNear clipping plane. Similarly, a window space Z value of 1.0 corresponds to an eye space coordinate located on the zFar plane. You can obtain any window space Z value by reading the depth buffer with glReadPixels().
<<<<

So, basically depending upon the screen [z] value, you'll get back different world [z] values.  If you have a particular x,y on the screen that you want to get the world coordinates for the pixel, you need to do a readpixels and get that pixel's actual z-buffer value, and pass that into UnProject.

That help?

-d
Sorry, clicked submit and didn't mean to...

That was from http://www.opengl.org/resources/faq/technical/glu.htm 

Also look at http://www.gamedev.net/community/forums/topic.asp?topic_id=268798 for another discussion of the topic.

-d
Avatar of ctuffli
ctuffli

ASKER

I had found the description about how window Z is confusing and added a glReadPixels call to the application to get the depth value. The depth is coming back zero which causes the UnProject to generate a -1 for Z (if I understand the above). So does this mean that the Z value will always come back either zNear or zFar? Does the application need to use the depth value to scale between zNear and zFar?
ASKER CERTIFIED SOLUTION
Avatar of davebytes
davebytes
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial