2012-02-03 13 views
2

마찬가지로 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

+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

[내가 사용하는 오픈 GL에서 한 터치를 계산 어떻게의
1

, 원점 (0,0)은 왼쪽 상단에 있습니다 만, OpenGL을 세계의 창 원점 (0,0)은 왼쪽 하단에 있습니다. 그래서 당신은 y는 그러한 방법처럼 좌표로 변환해야합니다 ox, oy, oz이 출력 값입니다 new_y = window_height - y;

+0

알아요. 내 질문에서 묻습니다. 어떻게해야합니까? – Wallter