gluUnproject 返回 0,似乎与模型视图矩阵有关
Posted
技术标签:
【中文标题】gluUnproject 返回 0,似乎与模型视图矩阵有关【英文标题】:gluUnproject returning 0, seems to be related to modelview matrix 【发布时间】:2013-02-02 15:49:42 【问题描述】:我正在使用 2D 图像查看器,我想检索纹理上的 openGL 鼠标位置,但如果在模型视图矩阵上进行 glTranslatef() 或 glScalef() 调用,我无法让它工作。 我正在使用著名的 Qt 库的 QGLWidget 。
以下是重要的调用: 调整大小功能:
void ViewerGL::resizeGL(int width, int height)
glViewport (0, 0, width, height);
显示功能:
void ViewerGL::paintGL()
int w = width();
int h = height();
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
//transX,transY are for panning around the image in the viewer
float left = (0.f+transX) ;
float right = (w+transX) ;
float bottom = (h-transY);
float top = (0.f-transY) ;
glOrtho(left, right, top, bottom, -1, 1);
...稍后在paintGL中:
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
//padx,pady are used to translate the image from the bottom left corner
// to the center of the viewer
float padx,pady;
padx= ((float)width() - _dw.w()*zoomFactor)/2.f; // _dw.w is the width of the texture
pady =((float)height() - _dw.h()*zoomFactor)/2.f ;// _dw.h is the height of the texture
glTranslatef( padx , pady, 0);
//zoomX,zoomY are the position at which the user required a zoom
glTranslatef(-zoomX,-zoomY, 0.f);
glScalef(zoomFactor, zoomFactor,0.f);
glTranslatef(zoomX ,zoomY, 0.f);
现在这是我检索 openGL 坐标的函数:
QPoint ViewerGL::openGLpos(int x,int y)
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX=0, winY=0, winZ=0;
GLdouble posX=0, posY=0, posZ=0;
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
winX = (float)x;
winY = height()- y;
if(winY == 0) winY =1.f;
glReadPixels( x, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
return QPoint(posX,posY);
到目前为止,这是我注意到的: 像这样的代码总是返回 (0,0) 并且 GLU_FALSE 从 gluUnproject 返回。我在论坛的某个地方读到这可能是因为模型视图矩阵,所以我把单位矩阵改为,但是,如果我这样做,我会得到鼠标在窗口中的坐标......
之前,我使用正交投影处理缩放,但我无法让它完美地工作,所以为了更简单,我决定检索 openGL 位置,并改用 glTranslatef/glScalef。
如果我删除了 paintGL 函数中的所有平移/缩放内容,一切正常……但缩放不起作用:x)
我正在请求您的帮助,以使用 gluUnProject 解决方案使这个该死的缩放到点工作;)
【问题讨论】:
【参考方案1】:Aigth,没关系,我找到了解决方案:我将 glScalef(x,y,z) 中的 z 归零 所以它使矩阵不可逆...
【讨论】:
以上是关于gluUnproject 返回 0,似乎与模型视图矩阵有关的主要内容,如果未能解决你的问题,请参考以下文章
gluUnProject 尝试将鼠标坐标转换为 opengl 坐标的奇怪行为
视图集中视图的 Django Rest Framework 自定义模式