# Thread: From Screen Coordinate to OpenGL coordinate

1. ## From Screen Coordinate to OpenGL coordinate

Can some one tell me how to transform from Screen Coordinate to OpenGL coordinate?
I want to draw a 3d line,so i obtain the mouse position in screen coordinate before i draw the line ,i have to transform the screen coordinate to the OpenGL coordinate. However , the line's position is not correct !why?

My transformation function
Vector3 GetOGLPos(int x, int y)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
Vector3 v;
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );

winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &amp;winZ );

gluUnProject( winX, winY, winZ, modelview, projection, viewport, &amp;posX, &amp;posY, &amp;posZ);

v.x=posX;
v.y=posY;
v.z=posZ;

return v;
}
My mouse message function: i found the position tranformed into OpenGL coordinate is not correct!!!why?
void MouseCallback(int button, int state, int x, int y)
{
Vector3 v;
v.x=GetOGLPos(x,y).x;
v.y=GetOGLPos(x,y).y;
switch ( button )
{
case GLUT_LEFT_BUTTON:
if ( state == GLUT_DOWN )
{
temp1.x = v.x;
temp1.y = v.y;
temp1.z=0;
}
else if ( state == GLUT_UP )
{
temp2.x = v.x;
temp2.y = v.y;
temp2.z=0;
glutPostRedisplay();
}
break;
}
}

2. ## Re: From Screen Coordinate to OpenGL coordinate

Hi,

Are u using orthographics projection or perspective. You should start with ortho first.

3. ## Re: From Screen Coordinate to OpenGL coordinate

i enabled depth test and use perspective. When i rotate the object in the scene ,the whole thing is not correct ! How can i get correct OpenGL coordinate from screen coordinate?

4. ## Re: From Screen Coordinate to OpenGL coordinate

Originally Posted by apapaxionga
My transformation function...

I've found the same function on some blog. Why don't you ask the poster?

Well, ensure the following:
- that you have a rendering context bound to the thread executing the particular code,
- if you are using double buffering, that you are reading from the adequate buffer (set appropriate buffer with glReadBuffer(), I think GL_FRONT is default)

5. ## Re: From Screen Coordinate to OpenGL coordinate

i found this code in GameDev.
if i change the code like this ,it works and return the correct screen coord.Why? But when i rotate the whole scene ,i still didn't work.Why?
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ,posXf, posYf, posZf;
Vector3 v;

glPushMatrix();
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
glPopMatrix();
winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &amp;winZ );

gluUnProject( winX, winY, 0, modelview, projection, viewport, &amp;posX, &amp;posY, &amp;posZ);
gluUnProject( winX, winY, .1, modelview, projection, viewport, &amp;posXf, &amp;posYf, &amp;posZf);

//v.x=posX;
//v.y=posY;
v.x=-posZf/(posZ-posZf)*(posX-posXf)+posXf;
v.y=-posZf/(posZ-posZf)*(posY-posYf)+posYf;

6. ## Re: From Screen Coordinate to OpenGL coordinate

You need to call glReadPixels at the right moment.
You need to glClear, render something and then use glReadPixels.

If you are swapping buffers and then calling glReadPixels, then you might end up with some random values.

7. ## Re: From Screen Coordinate to OpenGL coordinate

float matrix[16], inverse_matrix[16];
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);

8. ## Re: From Screen Coordinate to OpenGL coordinate

i found x,y is correct !but z is not correct! how can i get correct z ?