2010-12-03 4 views
4

내 프로그램에서 보려는 3D 메쉬로로드 중입니다. 사용자는보기를 회전하고 비율을 조정할 수 있습니다. 회전을 위해 회전 행렬을 사용하고 multmatrix을 호출하여 뷰를 회전시키고 glScalef을 사용하여 크기를 조정합니다. 사용자는 메쉬를 페인트 할 수도 있습니다. 따라서 메쉬와 교차하는지 확인하기 위해 마우스 좌표를 변환해야합니다.마우스 클릭과 3D 메쉬의 교차점을 어떻게 찾습니까?

나는 가까운 평면과 먼 평면에서 gluUnproject를 사용하고 빼내는 방법을 읽었으며, gluLookAt의 위치가 (0, 0, z) 인 경우에만 z를 사용할 수 있습니다. 어떤 합리적인 숫자. 내가 (0, 1, z)라고 말하면서 위치를 움직일 때, 그것은 비어있는 방향으로 가고 빈 공간 만있는 교차점을 반환하고, 그 메시가 마우스 아래에 분명히있는 교차점을 반환하지 않습니다. 그 어떤 차이가 경우가 glFrustum을 사용하고

float hx, hy; 
hx = mouse_x; 
hy = mouse_y; 

GLdouble m1x,m1y,m1z,m2x,m2y,m2z; 
GLint viewport[4]; 
GLdouble projMatrix[16], mvMatrix[16]; 
glGetIntegerv(GL_VIEWPORT,viewport); 
glGetDoublev(GL_MODELVIEW_MATRIX,mvMatrix); 
glGetDoublev(GL_PROJECTION_MATRIX,projMatrix); 

//unproject to find actual coordinates 
gluUnProject(hx,scrHeight-hy,2.0,mvMatrix,projMatrix,viewport,&m1x,&m1y,&m1z); 
gluUnProject(hx,scrHeight-hy,10.0,mvMatrix,projMatrix,viewport,&m2x,&m2y,&m2z); 

gmVector3 dir = gmVector3(m2x,m2y,m2z) - gmVector3(m1x,m1y,m1z); 
dir.normalize(); 

gmVector3 point; 
bool intersected = findIntersection(gmVector3(0,0,5), dir, point); 

: 나는 장면에 마우스 클릭에서 광선을 만들고있어 방법이있다

.

findIntersection 코드는 실제로 길기 때문에 코드가 작동한다고 확신하므로 다른 사람이보고 싶지 않으면 게시하지 않습니다. 그것의 요지는 메쉬의 모든면에 대해 광선과 평면 사이의 교차점을 찾은 다음 교차점이면 안에 있는지 확인하는 것입니다.

저는 카메라의 위치와 관련이 있고 벡터를 봐야한다고 생각합니다. 그러나 마우스가 메쉬를 제대로 클릭 할 수 있도록 어떻게, 어떻게해야할지 모르겠습니다. 아무도 이것으로 나를 도울 수 있습니까?

아직 회전 행렬 또는 glScalef이있는 항목이 없으므로 누구나 내게이 사실에 대한 통찰력을 줄 수 있습니까? 마찬가지로 계산할 때 multmatrixglScalef 호출에 대해 프로젝트를 비우기는합니까?

감사합니다.

+0

'gluLookAt()'의 앞이나 뒤에'glGetDoublev (GL_MODELVIEW_MATRIX, mvMatrix)'를 호출합니까? – genpfault

+0

gluLookAt는 그리기 기능 자체 안에 있으며, 위에서 설명한 기능은 사용자가 창 내부에서 마우스를 클릭 할 때 호출됩니다. 그래서 gluLookAt가 먼저 호출됩니다. – confusedKid

+0

카메라 위치가 (0,0,5)입니까? –

답변

0

에 충돌 한 지점입니다, 내가 사용했습니다해야합니다

bool intersected = findIntersection(gmVector3(m1x,m1y,m1z), dir, point); 

(다른 벡터가 함수로 전달됨을 주목하라). 이게 내 문제를 해결하고 결국 gluLookAt와 아무 관련이 없습니다!

또한 질문의 두 번째 부분에 대해서는 예, unproject는 glScale 및 glmultmatrix 함수를 고려합니다.

0

해결책은 레이 트레이싱입니다. 촬영하는 광선은 두 지점을 통해 정의됩니다. 첫 번째 것은 카메라의 원점이고, 두 번째는 장면의 뷰 평면에 투영 된 마우스 위치입니다 (glFrustum으로 설명하는 평면). 당신이 모델이 광선의 교차점은 마우스 클릭이 광선 dir를 사용하여 장면의 카메라에서 광선을 모델

+0

나는 카메라 위치를 움직이면 화면의 중앙에 볼이 그려지기 때문에 카메라의 lookAt가 중요하다는 것을 알았지 만, 교차점은 옆으로 튀어 나온다. – confusedKid

관련 문제