我在mouseclick上使用基于MFC的应用程序中的NEHE教程中的代码
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,& posY,& posZ ...时,我的值都会变得不正确。值总是在-9.25555,-9.255555,-9.255555中。不仅这个而且还有modelview矩阵每次返回相同的-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 :(得分:0)
好的,我想出了由于以下情况而产生的问题
我在两个不同的hdc设置之间使用绘图功能,因为我有两个不同的mfc图像控制窗口,两者都有不同的图形。这就是为什么当我使用上面的gl代码时,在鼠标按下或鼠标单击事件中它总是用s = glGetError()来给我错误1282。
为了使其正常工作,我只是在
中添加了上述代码wglMakeCurrent(hdc, hrc);
//my code
wglMakeCurrent(NULL, NULL);
并且它起作用,所有x y和z值现在都在屏幕上