2012-02-03 19 views
2

ようにthis質問状態 - 私は、画面上のレンダリングに関連する座標にクリック(2D)を変換したい。私は関数glutMouseFunc(下)私の関数にバインドされているが、渡されるxとyの意味をすることはできません - 彼らは左上隅からピクセルの距離に関連しているようです。私は世界にxとyを変換する方法を知っていただきたいと思いopenGL 2Dマウスのクリック位置

座標:)

ウィンドウシステムで
void mouse(int button, int state, int x, int y) { 
    switch(button) { 
    case GLUT_LEFT_BUTTON: 
    printf(" LEFT "); 
    if (state == GLUT_DOWN) { 
     printf("DOWN\n"); 
     printf("(%d, %d)\n", x, y); 
    } 
    else 
     if (state == GLUT_UP) { 
     printf("UP\n"); 
     } 
    break; 

    default: 
    break; 
    } 
    fflush(stdout);        // Force output to stdout 
} 
+0

可能重複glUnProject](http://stackoverflow.com/questions/6464232/how-do-i-calculate-the-touch-on-opengl-using-glunproject) – datenwolf

+0

これはObjective Cのものです...そして具体的な答えはありません - 私はこれをC言語で回答することは、彼らが使用しているプラ​​ットフォーム: – Wallter

+0

@Walter:言語はここで違いはありません。 OpenGL自体は、実際に入力イベントを処理することには関係しません。それは、使用されるフレームワークのタスクです。一般化された答えはそこにあるすべてのフレームワークを考慮に入れなければならなかった。私はそれを可能な最も一般的な方法で答えました。また、質問自体のコード(gluUnproject)もC言語で動作します。 – datenwolf

答えて

4
GLdouble ox=0.0,oy=0.0,oz=0.0; 
void Mouse(int button,int state,int x,int y) { 
    GLint viewport[4]; 
    GLdouble modelview[16],projection[16]; 
    GLfloat wx=x,wy,wz; 

    if(state!=GLUT_DOWN) 
    return; 
    if(button==GLUT_RIGHT_BUTTON) 
    exit(0); 
    glGetIntegerv(GL_VIEWPORT,viewport); 
    y=viewport[3]-y; 
    wy=y; 
    glGetDoublev(GL_MODELVIEW_MATRIX,modelview); 
    glGetDoublev(GL_PROJECTION_MATRIX,projection); 
    glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&wz); 
    gluUnProject(wx,wy,wz,modelview,projection,viewport,&ox,&oy,&oz); 
    glutPostRedisplay(); 
} 

http://hamala.se/forums/viewtopic.php?t=20

1

、原点(0,0)が左上隅にありますが、OpenGLの世界の窓原点(0,0)は左下隅にあります。 ですから、yが唯一、このような方法のように座標変換する必要があります:[どのように私が使用してOpenGLの上のタッチを計算しないの ox, oy, ozがあなたの出力値でありnew_y = window_height - y;

+0

私は知っている、それは私の質問が尋ねているものです - どうすればいいですか? – Wallter

関連する問題