2013-03-24 3 views
0

마우스 포인터를 따라 쿼드를 가져 오려고합니다. 그래서 기본적으로 화면 좌표를 세계 좌표로 변환해야합니다. 나는 이것에 대한 많은 글과 NeHe와 다른 장소의 튜토리얼을 보았지만 그 중 아무 것도 나를 위해 제대로 작동하지는 않는다. 거의 모든 시간에 스케일링 문제가 발생합니다. 마우스 중심에서 마우스를 멀리 떨어 뜨릴수록 쿼드는 마우스에서 더 많이 벗어납니다.C++ OpenGL Quad가 마우스 포인터를 따라 가십시오. (Glut없이)

코드에서 현재 시도하고있는 코드는 http://www.3dbuzz.com/forum/threads/191296-OpenGL-gluUnProject-ScreenCoords-to-WorldCoords-problem 입니다. 링크에있는 사람이 코드가 작동한다고하더라도 확장 성 문제는 여전히 남아 있습니다.

쿼드는 마우스를 따라갈 수 있습니까?

는 Heres는 (렌더링 프레임 기능에서) 코드 :

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glTranslatef(0.0f,0.0f,-5.0f); 

POINT mouse; 
GetCursorPos(&mouse); 
ScreenToClient(WindowHandle, &mouse); 

GLdouble 
    posX1, 
    posY1, 
    posZ1, 
    posX2, 
    posY2, 
    posZ2, 
    modelview[16], 
    projection[16]; 
GLint 
    viewport[4]; 

glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
glGetDoublev(GL_PROJECTION_MATRIX, projection); 
glGetIntegerv(GL_VIEWPORT, viewport); 

gluUnProject(mouse.x, viewport[1] + viewport[3] - mouse.y, 0, modelview, projection, viewport, &posX1, &posY1, &posZ1); 
gluUnProject(mouse.x, viewport[1] + viewport[3] - mouse.y, 1, modelview, projection, viewport, &posX2, &posY2, &posZ2); 

GLfloat t = (posZ1 - 0)/(posZ1 - posZ2); 

GLfloat 
    fX = posX1 + (posX2 - posX1) * t, 
    fY = posY1 + (posY2 - posY1) * t; 

OutputDebugFloat(fX); 
OutputDebugString(", "); 
OutputDebugFloat(fY); 
OutputDebugString("\n"); 

glTranslatef(fX, fY, 0); 
DrawTile(test.Tex()); // Draws the quad with the specified texture 

SwapBuffers(hDC); 

답변

0

OK, 나는 그것을 알아 낸 것처럼 보였다. 문제는 배경 쿼드가 없다는 것입니다. (이것을 제거하는 동안 빈 화면을 가질 수 있도록 제거했습니다. 나쁜 생각입니다.) 실제로 시도한 자습서 중 대부분은 실제로 작동했는데, 그로 인해 깨졌습니다.

편집 : 'glReadPixels'이 FPS를 상당히 떨어 뜨리는 것을 발견했습니다. 필자는 FPS/60 프레임마다 쿼드 위치 만 업데이트하여이 문제를 해결했습니다.