Я только начинаю осваивать OGL, и в данном случае использую его для простой визуализации расчетной программы в режиме 2d. Я пытался сделать, чтобы можно было перемещать изображение при помощи левой кнопки мыши, и масштабировать при помощи правой(в конечном итоге я решил использовть только положительное масштабирование).
Вот мой код
Код:
void Display(void)
{
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3ub(255,0,0);
glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_TRIANGLES);
...
glEnd()
glFinish();
}
void Reshape(GLint w, GLint h)
{
Width = w;
Height = h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, 0, h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
bool LMB_Down = false;
bool RMB_Down = false;
point Pxy;
void
Mouse(int button, int state, int x, int y)
{
if( state == GLUT_DOWN ) {
switch( button ) {
case GLUT_LEFT_BUTTON:
LMB_Down = true;
Pxy.x = x;
Pxy.y = y;
break;
case GLUT_RIGHT_BUTTON:
RMB_Down = true;
Pxy.y = y;
break;
}
glutPostRedisplay();
}
if(state == GLUT_UP)
{switch(button)
{case GLUT_LEFT_BUTTON:
LMB_Down = false;
break;
case GLUT_RIGHT_BUTTON:
RMB_Down = false;
break;
}
glutPostRedisplay();
}
}
void
MouseMove( int x, int y)
{
if(LMB_Down){
glLoadIdentity();
glTranslated((x-Pxy.x),-(y-Pxy.y), 0); //перемещение
glutPostRedisplay();
}
if(RMB_Down){
if(Pxy.y > y && (Pxy.y-y)>20){
glLoadIdentity();
glScaled((Pxy.y-y)/15,(Pxy.y-y)/15, 0); //масштаб add
glutPostRedisplay();
}
}
}
int _tmain(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(Width, Height);
glMatrixMode(GL_MODELVIEW);
glutCreateWindow(" ");
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutKeyboardFunc(Keyboard);
glutMouseFunc(Mouse);
glutMotionFunc(MouseMove);
glutMainLoop();
return 0;
}
В итоге я могу перемещать и масштабировать изображение. Но при повторном начале операции масштабирования или перемещения, все сбрасывается на начальные позиции и следующее действие начинается снова оттуда же. Т.е. я перетаскиваю изображение в центр экрана и отпускаю ЛКМ. Изображение остается. Когда я нажимаю ЛКМ снова - ничего не происходит, но как только я начинаю движение - изображение сбрасывается в начальную позицию и перемещение начинается оттуда, а не из позиции, где было изображение после первого перемещения(середина экрана).
Как мне исправить код? Я думал, что надо, как-то, сохранять матрицу в стек матриц, но ничего не получилось.
И как вообще правильнее реализуются такие функции?