내 프로그램에서 보려는 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
이있는 항목이 없으므로 누구나 내게이 사실에 대한 통찰력을 줄 수 있습니까? 마찬가지로 계산할 때 multmatrix
및 glScalef
호출에 대해 프로젝트를 비우기는합니까?
감사합니다.
'gluLookAt()'의 앞이나 뒤에'glGetDoublev (GL_MODELVIEW_MATRIX, mvMatrix)'를 호출합니까? – genpfault
gluLookAt는 그리기 기능 자체 안에 있으며, 위에서 설명한 기능은 사용자가 창 내부에서 마우스를 클릭 할 때 호출됩니다. 그래서 gluLookAt가 먼저 호출됩니다. – confusedKid
카메라 위치가 (0,0,5)입니까? –