openGL中取得屏幕坐标对应的三维场景坐标时出现的问题!无法取得当前视口,视图,投影矩阵!
小弟在做一个程序,需要鼠标点取屏幕上一点,得到此点在openGL场景坐标里的三维数据。
写了一个函数如下:
//由屏幕上鼠标坐标点取得对应的场景坐标点 放在object_x,object_y,object_z中
void getGlPos_ZBuffer(int mouse_x, int mouse_y, double object_x, double object_y, double object_z)
{
glClearDepth(1.0f); // 深度缓存设置
glEnable(GL_DEPTH_TEST); // 打开深度测试
glDepthFunc(GL_LEQUAL); // 设置深度测试类型
GLint t_viewport[4] = {0,0,0,0};
GLdouble t_modelview[16];
GLdouble t_projection[16];
GLfloat winX, winY, winZ;
glPushMatrix();
glGetIntegerv(GL_VIEWPORT, t_viewport);//视口
glGetDoublev(GL_MODELVIEW_MATRIX, t_modelview);//视图矩阵
glGetDoublev(GL_PROJECTION_MATRIX, t_projection);//投影矩阵
glPopMatrix();
winX=(float)mouse_x;//OGL中的窗口x坐标
winY=(float)t_viewport[3]-(float)mouse_y;//OGL中的窗口y坐标
glReadPixels(mouse_x,//x坐标
int(winY),//y坐标
1,1,//读取一个像素
GL_DEPTH_COMPONENT,//获得深度信息
GL_FLOAT,//数据类型为浮点型
&winZ);//获得的深度值保存在winZ中
gluUnProject((GLdouble)winX,(GLdouble)winY,(GLdouble)winZ,t_modelview,t_projection,t_viewport,&object_x,&object_y,&object_z);
}
但是
glGetIntegerv(GL_VIEWPORT, t_viewport);//视口
函数执行以后t_viewport的值没有变化,还是原来的值0。
glGetDoublev(GL_MODELVIEW_MATRIX, t_modelview);//视图矩阵
glGetDoublev(GL_PROJECTION_MATRIX, t_projection);//投影矩阵
两个函数的值也没有变化。
我已经开了深度缓存
glClearDepth(1.0f); // 深度缓存设置
glEnable(GL_DEPTH_TEST); // 打开深度测试
glDepthFunc(GL_LEQUAL); // 设置深度测试类型
请问上述问题是什么原因?
是由于深度缓存函数设置不对导致无法读深度缓存里的值?
还是与投影方式有关?(我用的是透视投影)
或者是我用的opengl库版本不对?(顺便问一下glGetIntegerv函数在哪个库里)?
多谢大家啦~
[解决办法]
// 释放OpenGL绘制描述表
//wglMakeCurrent(NULL,NULL);
大概是这个函数在作怪,我就是说,你的OpenGL上下文已经被释放掉了。把所有这样的一行注消除试试看
http://www.physdev.com/phpbb/cms_view_article.php?aid=22&sid=418cfc3915a4f469cb7d50db1c929160