0

私は 2D 画像ビューアーに取り組んでいます。テクスチャ上の openGL マウスの位置を取得したいのですが、モデルビュー マトリックスで glTranslatef() または glScalef() 呼び出しが行われると機能しません。有名な Qt ライブラリの QGLWidget を使用しています。

重要な呼び出しは次のとおりです。 Resize 関数:

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) を返し、gluUnproject から GLU_FALSE が返されます。モデルビュー行列が原因である可能性があることをフォーラムのどこかで読んだので、代わりに恒等行列を入れましたが、そうすると、ウィンドウ内のマウスの座標が正確に得られます...

以前は、正投影を使用してズームを処理しましたが、完全に機能させることができなかったため、簡単にするために、openGL の位置を取得し、代わりに glTranslatef/glScalef を使用することにしました。

paintGL関数のすべての変換/スケーリングを削除すると、すべてが機能します...しかし、ズームは機能しません:x)

gluUnProject ソリューションを使用して、このいまいましいズーム機能を機能させるためにあなたの助けを求めています;)

4

1 に答える 1

1

Aigth 、気にしないで、私は解決策を見つけました:私は glScalef(x,y,z) の z をゼロにしていたので、行列を非可逆にしました...

于 2013-02-02T16:41:30.787 に答える