2014-09-16 1 views
0

OpenGL에서 객체가 4 가지 다른 객체를 드래그하는 방법을 궁금해합니다. 이 객체들을 그리는 아주 간단한 코드를 가지고 있습니다 :C++ OpenGL은 마우스로 여러 객체를 드래그

glPushMatrix(); 
glTranslatef(mouse_x, mouse_y, 0); 
glutSolidIcosahedron(); 
glPopMatrix(); 

glPushMatrix(); 
glTranslatef(mouse_x2, mouse_y2, 0); 
glutSolidIcosahedron(); 
glPopMatrix(); 

glPushMatrix(); 
glTranslatef(mouse_x3, mouse_y3, 0); 
glutSolidIcosahedron(); 
glPopMatrix(); 

glPushMatrix(); 
glTranslatef(mouse_x4, mouse_y4, 0); 
glutSolidIcosahedron(); 
glPopMatrix(); 

나는 객체를 움직이는 방법을 알고 있지만,이 객체들 중 하나를 드래그 앤 드롭하는 법을 배우고 싶습니다. 이름 스택 및 선택 모드에 대해 조사해 왔지만 혼란 스러웠습니다. 그리고 glutMouseFunc와 같은 일을해야한다는 것도 알고 있습니다. 내가 헷갈리는 각 모양을 선택하는 것입니다.

답변

1

먼저해야 할 일은 버튼을 클릭 할 때 화면에 마우스의 위치를 ​​캡처하는 것입니다. 그것을 할 수있는 방법이 많이 있지만이 질문의 범위를 벗어난다고 믿습니다. X, Y 좌표를 화면에 표시 할 때 어떤 물체가 선택되었는지, 어떤 물체가 있는지 감지해야합니다. 가능한 두 가지 방법이 있습니다. 각 객체의 경계 사각형 위치를 (화면 공간에서) 추적 할 수 있고 커서가 그 사각형 중 하나에 있으면 테스트가 매우 간단합니다. 또는 세계 공간에서 커서 위치를 통해 눈에서 광선을 캐스팅하고이 광선과 각 객체의 교차점을 검사 할 수 있습니다.

두 번째 접근법은 3D 그래픽에서보다 다목적이지만 X 및 Y 좌표 만 사용하는 것처럼 보이므로 개체의 Z 순서에 대해 걱정할 필요가 없습니다.

첫 번째 해결책의 경우 주요 문제는 화면에 개체의 크기가 얼마나 큰지 알 수있는 방법입니다. glutSolidIcosahedron()은 반경 1의 객체를 렌더링합니다. 화면 반경을 계산하려면 일부 행렬 수학을 사용하거나이 경우 간단한 삼각법을 사용할 수 있습니다. 카메라에서 드로잉 평면까지의 거리를 알아야합니다 (렌더링하기 전에 glTranslatef (0,0, X)를 사용하고 있다고 생각합니다 .X는 거리입니다) 또한 카메라의 시야각을 알아야합니다. 이것을 투영 행렬로 설정합니다. 이제 종이 한 장을 가져다가 각도 α의 원뿔을 그리고 거리 X에있는 평면을 교차 시키며 물체가 반경 1을 가졌다는 것을 알면 쉽게 점유 할 수있는 화면의 면적을 쉽게 계산할 수 있습니다. (이 계산을 남겨 둘 것입니다.)

이제 화면의 반경을 알고 있다면 클릭 위치에서 각 객체까지의 거리를 테스트하기 만하면됩니다. 거리가 반지름보다 작 으면 선택됩니다. 둘 이상의 객체가이 테스트를 통과하면 첫 번째 객체 만 선택하십시오.

+0

감사합니다. –

관련 문제