2012-02-03 140 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