读书人

openGL中取得屏幕坐标对应的三维场景坐

发布时间: 2012-02-24 16:30:38 作者: rapoo

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

读书人网 >网络游戏

热点推荐