2008-09-22 5 views
8

에 투사 마우스 클릭 나는이보기 설정 :의 OpenGL : 기하

glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective 
glLoadIdentity(); //Reset the drawing perspective 

을 나는 마우스 클릭에서 화면 위치 (SX, SY)을 얻는다.

주어진 z 값을 사용하면 xx와 y를 sx와 sy의 3d 공간에서 어떻게 계산할 수 있습니까? 즉 이것은 투영 행렬이 아닌 모델 뷰 행렬에 실제로 의존 당신이

답변

11

당신은 gluUnProject 사용해야

첫째, 가까운면에 "unprojection을"계산 :

GLdouble modelMatrix[16]; 
GLdouble projMatrix[16]; 
GLint viewport[4]; 

glGetIntegerv(GL_VIEWPORT, viewport); 
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); 
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); 

GLdouble x, y, z; 
gluUnProject(sx, viewport[1] + viewport[3] - sy, 0, modelMatrix, projMatrix, viewport, &x, &y, &z); 

후까지면 :

// replace the above gluUnProject call with 
gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z); 

이제했습니다 세계 좌표계에서 가능한 모든 점을 찾아내는 선이 있습니다. 을 클릭합니다. 자 이제 z 좌표를 입력했다고 가정 해 보겠습니다.

GLfloat nearv[3], farv[3]; // already computed as above 

if(nearv[2] == farv[2])  // this means we have no solutions 
    return; 

GLfloat t = (nearv[2] - z)/(nearv[2] - farv[2]); 

// so here are the desired (x, y) coordinates 
GLfloat x = nearv[0] + (farv[0] - nearv[0]) * t, 
     y = nearv[1] + (farv[1] - nearv[1]) * t; 
+0

멍청한 탓에 죄송합니다. gluPerspective를 사용하여 투영 행렬을 설정할 때 gluUnproject 호출의 세 번째 매개 변수가 항상 동일 (0 및 1)합니까? 아니면 zNear 및 zFar 값에 의존합니까? – rgngl

0

libqglviewer 좋은 선택 프레임 워크를 가지고있다. http://www.toymaker.info/Games/html/picking.html 당신을 도울 것입니다 - 그것은 D3D 중심이지만 이론은 같습니다.

마우스 기반 피킹을 수행하려는 경우 선택 렌더링 모드를 사용하는 것이 좋습니다.

편집 : 모델 - 뷰 매트릭스가 작동하지만, 귀하의 신원은 신원이므로주의해야합니다.

2

을 찾고 있다면

3

가장 신뢰할 수있는 출처 인 OpenGL's web site이 가장 잘 대답합니다.

+0

알아두기 위해 링크를 클릭하는 대신 대답의 소스 이름을 넣는 것이 도움이 될 것입니다. – danio

관련 문제