PMG
https://forum.pmg.org.ru/

glut перемещение и масштабирование
https://forum.pmg.org.ru/viewtopic.php?f=1&t=7251
Страница 1 из 1

Автор:  Patriotix-N [ 22 ноя 2009 00:20 ]
Заголовок сообщения:  glut перемещение и масштабирование

Я только начинаю осваивать 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;
}

В итоге я могу перемещать и масштабировать изображение. Но при повторном начале операции масштабирования или перемещения, все сбрасывается на начальные позиции и следующее действие начинается снова оттуда же. Т.е. я перетаскиваю изображение в центр экрана и отпускаю ЛКМ. Изображение остается. Когда я нажимаю ЛКМ снова - ничего не происходит, но как только я начинаю движение - изображение сбрасывается в начальную позицию и перемещение начинается оттуда, а не из позиции, где было изображение после первого перемещения(середина экрана).
Как мне исправить код? Я думал, что надо, как-то, сохранять матрицу в стек матриц, но ничего не получилось.
И как вообще правильнее реализуются такие функции?

Автор:  MagicWolf [ 24 ноя 2009 17:37 ]
Заголовок сообщения:  Re: glut перемещение и масштабирование

Вот здесь "void Display(void)" надо использовать Pxy. OGL не запоминает последние координаты объекта. Все стирается и начинается заново при обновлении кадра каждый раз.

Автор:  Patriotix-N [ 05 дек 2009 09:07 ]
Заголовок сообщения:  Re: glut перемещение и масштабирование

А можно на примере? Пусть будут координаты x и y, которые используются в рисовании, например, линии.

Автор:  MagicWolf [ 05 дек 2009 12:37 ]
Заголовок сообщения:  Re: glut перемещение и масштабирование

Перенеси содержимое MouseMove в Display.

В каком смысле пример? Какой?

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/