I use this code from the NEHE tutorial in my MFC-based application on mouseclick
void CRightOGL::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default GLint viewport[4]; GLdouble modelview[16]={0}; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; GLfloat mv[16]; glGetFloatv( GL_MODELVIEW_MATRIX, mv ); glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); glGetIntegerv( GL_VIEWPORT, viewport ); winX = (float)point.x; winY = (float)viewport[3] - (float)point.y; glReadPixels(point.x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); COpenGLControl::OnLButtonDown(nFlags, point); }
But the problem is that I get the wrong values every time posX, & posY, & posZ ... and the values always go in -9.25555, -9.255555, -9.255555. Not only that, but also a model matrix, it returns -9.555 every time.
If I initialize everything as 0, then posX, posY and PosZ will return me only 0 instead of the correct coordinates. The x and y mouse values are great, so there is no problem with the mouse.
What am I doing wrong?
my opengl initialization code is as follows
void COpenGLControl::oglInitialize(void) { // Initial Setup: // static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, // bit depth 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, // z-buffer depth 0, 0, 0, 0, 0, 0, 0, }; // Get device context only once. hdc = GetDC()->m_hDC; // Pixel format. m_nPixelFormat = ChoosePixelFormat(hdc, &pfd); SetPixelFormat(hdc, m_nPixelFormat, &pfd); // Create the OpenGL Rendering Context. hrc = wglCreateContext(hdc); wglMakeCurrent(hdc, hrc); // Basic Setup: // // Set color to use when clearing the background. glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearDepth(1.0f); // Turn on backface culling glFrontFace(GL_CCW); glCullFace(GL_BACK); // Turn on depth testing glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH); //glEnable(GL_TEXTURE_2D); // Enable 2D textures // Send draw request GLenum a = glGetError(); OnDraw(NULL); }