私は 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 ソリューションを使用して、このいまいましいズーム機能を機能させるためにあなたの助けを求めています;)