Я работаю над средством просмотра 2D-изображений, я хочу получить положение мыши openGL на текстуре, но я не могу заставить его работать, если вызовы glTranslatef () или glScalef () сделаны в матрице вида модели.
Я использую QGLWidget из известной библиотеки Qt.
Вот важные звонки:
Функция изменения размера:
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;)
Во-вторых, неважно, я нашел решение: я обнулял z в glScalef (x, y, z)
поэтому он сделал матрицу необратимой …
Других решений пока нет …