2012-09-10 82 views
0

我使用从讷河教程这段代码的坐标点击鼠标MFC使用OpenGL得到二维三维坐标在我的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, & 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

好吧,我想通了这个问题,以下面的情形

我使用的两种不同的HDC设置之间绘制函数生成因,因为我有两个mfc的不同图片控制窗口都有不同的绘图。这就是为什么在鼠标向下或鼠标点击事件时,当我使用上面的gl代码时,它始终用于通过s = glGetError()给出错误1282。

所以,使其工作我只是说内

wglMakeCurrent(hdc, hrc); 

//my code 

wglMakeCurrent(NULL, NULL); 

上面的代码和它的工作,现在所有的X,Y和Z值是屏幕

+0

你把代码之间吗? – manatttta