Перемещение рисунка в openGL с помощью мыши
Я пытаюсь переместить изображение в openGL, удерживая левую кнопку мыши. Я не пытаюсь перетащить объект, просто переместить всю картину. Это 2-й рисунок фрактала, и мне сказали, что я могу использовать gluortho2d, но я не могу найти какую-либо информацию или похожие попытки, как это сделать. Я предполагаю что-то вроде
void mouse_callback_func(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
gluOrtho2D(x-250.0, x+250.0, y-250.0,y+250.);
glutPostRedisplay();
}
для окна 500х500, но оно не работает. В тот момент, когда я щелкнул левой кнопкой мыши окно стало пустым. Есть идеи?
1 ответ
Решение
gluOrtho2D
изменяет текущую матрицу Он предназначен для использования с glMatrixMode(GL_PROJECTION)
, например:
glMatrixMode(GL_PROJECTION); //start editing the projection matrix
glLoadIdentity(); //remove current projection
gluOrtho2D(...); //create new one
glMatrixMode(GL_MODELVIEW); //back to editing the modelview matrix
Может быть проще настроить концепцию камеры...
float cameraX, cameraY;
int lastMouseX, lastMouseY;
void mouse_callback_func(int button, int state, int x, int y)
{
int dx = x - lastMouseX;
int dy = y - lastMouseY;
const float speed = 0.1f;
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
cameraX += dx * speed; //or -=, depending on which direction feels more natural to you
cameraY -= dy * speed; //-= as mouse origin is top left, so +y is moving down
glutPostRedisplay();
}
lastMouseX = x;
lastMouseX = y;
}
void display()
{
glLoadIdentity(); //remove transforms from previous display() call
glTranslatef(-cameraX, -cameraY, 0.0f); //move objects negative = move camera positive
...