C ++ OpenGL Пусть Quad следует за указателем мыши (без Glut)

Я пытаюсь заставить квадроцикл следовать за указателем мыши. Поэтому в основном мне нужно преобразовать экранные координаты в мировые координаты. Я видел много постов по этому поводу, а также учебники из NeHe и других мест, но ни один из них не работает для меня должным образом. Почти каждый раз у меня возникает какая-то проблема с масштабированием, когда чем дальше я перемещаю мышь от центра окна, тем больше смещение получает квад от моей мыши.

Код, который я сейчас пытаюсь найти, взят из
http://www.3dbuzz.com/forum/threads/191296-OpenGL-gluUnProject-ScreenCoords-to-WorldCoords-problem
но у него все еще есть проблема масштабирования, хотя человек в той ссылке говорит, что код работал для него.

Как мне заставить квад следовать за мышью?

Вот код (из функции рендеринга фрейма):

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

Решение

ОК, я, кажется, понял это. Проблема была в том, что у меня не было фонового квадрата. (Я удалил его, чтобы при тестировании я мог видеть пустой экран. Плохая идея.) Большинство обучающих программ, которые я пробовал, действительно работали, но из-за этого они просто сломались.

Изменить: я обнаружил, что «glReadPixels» значительно снижает FPS. Я исправил это, обновляя только положение квадрата каждые FPS / 60 кадров.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]