MFC с OpenGL получить 3D-координату от 2-й координаты мыши

Я использую этот код из учебника NEHE в приложении на основе MFC для мыши

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);

}

Но проблема в том, что я получаю неправильные значения каждый раз, когда posX, &Пози, &posZ … и значения всегда входят в -9.25555, -9.255555, -9.255555. Не только эта, но и матрица вида модели каждый раз возвращает одно и то же значение -9,555.

Если я инициализирую все как 0, то posX, posY и PosZ возвращают мне только 0 вместо правильных координат. Значения мыши x и y совершенно нормальны, поэтому со стороны мыши проблем нет.

Что я делаю не так?

мой код инициализации opengl следующий

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

Решение

Хорошо, я разобрался с проблемой, возникающей из-за сценария ниже

Я использую функцию рисования между настройками двух разных HDC, потому что у меня есть два разных окна управления изображениями MFC, и оба имеют разные рисунки. Вот почему внутри события мыши или нажатия кнопки мыши, когда я использовал код gl выше, он всегда использовался, чтобы выдать ошибку 1282 с помощью s = glGetError ().

Поэтому, чтобы заставить его работать, я просто добавил приведенный выше код в

wglMakeCurrent(hdc, hrc);

//my code

wglMakeCurrent(NULL, NULL);

и это сработало, и все значения x y и z теперь на экране

0

Другие решения

Других решений пока нет …