OpenFC MFC gets 3d coordinate from 2d mouse coordinates

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); } 
0
source share
1 answer

Ok, I found out the problem due to the scenario described below

I use the draw function between setting two different hdc, because I have two different mfc image control windows, and both have a different picture. That's why inside a mouse or mouse click event, when I used the above gl code, it always used to give me error 1282 with s = glGetError ().

So for it to work, I just added the code above to

 wglMakeCurrent(hdc, hrc); //my code wglMakeCurrent(NULL, NULL); 

and it worked, and all xy and z values ​​are now displayed on the screen

0
source

Source: https://habr.com/ru/post/986111/


All Articles