PDA

View Full Version : From Screen Coordinate to OpenGL coordinate



apapaxionga
10-10-2011, 07:51 AM
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, &winZ );

gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &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;
}
}

mobeen
10-11-2011, 01:10 AM
Hi,
Is your depth test enabled?

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

apapaxionga
10-11-2011, 10:01 AM
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?

Aleksandar
10-11-2011, 11:47 AM
My transformation function...
Is it really your 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)

apapaxionga
10-11-2011, 07:23 PM
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, &winZ );

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

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

V-man
10-12-2011, 04:36 AM
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.

apapaxionga
10-12-2011, 05:47 AM
Could you please explain in detail about your fellowing code?i can not understand it very well.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);

apapaxionga
10-12-2011, 06:53 AM
i found x,y is correct !but z is not correct! how can i get correct z ?

Alfonse Reinheart
10-12-2011, 11:39 AM
Could you please explain in detail about your fellowing code?

That's his (distractingly long) signature, not a reply to your post.