2012-02-03 139 views
2

Like this問題狀態 - 我想將點擊(2D)轉換爲與屏幕上的渲染相關的座標。我將函數glutMouseFunc綁定到我的函數(下面),但無法理解傳入的x和y - 它們似乎與距離左上角的像素距離有關。openGL 2D鼠標點擊位置

我想知道如何在X和Y轉換成世界座標:)

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 2012-02-03 09:14:46

+0

這是一個在目標C ...並沒有具體的答案 - 我認爲用C回答這個問題會幫助其他人解決問題呃他們正在使用的平臺:) – Wallter 2012-02-04 02:18:05

+0

@Walter:這裏的語言沒有任何區別。 OpenGL本身並不關心實際處理輸入事件,這是所用框架的任務。一個普遍的答案必須考慮到那裏的所有框架 - 或根本沒有。我以最一般的方式回答了這個問題。此外,問題本身的代碼(gluUnproject)也以純C工作。 – datenwolf 2012-02-04 12:49:01

回答

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(); 
} 

哪裏ox, oy, oz是你的輸出值

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

的[我如何計算使用OpenGL的觸摸
1

在視窗系統,原點(0,0)是在左上角,但世界上的OpenGL窗口原點(0,0)位於左下角。 所以你需要轉換y座標只喜歡這樣的方式: new_y = window_height - y;

+0

我知道,這就是我的問題所在 - 我該怎麼做? – Wallter 2012-02-03 19:04:47