PMG

Форумы по созданию игр
Текущее время: 28 сен 2021 07:45

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: glut перемещение и масштабирование
СообщениеДобавлено: 22 ноя 2009 00:20 
Не в сети
Любитель

Зарегистрирован: 17 май 2007 21:17
Сообщения: 13
Я только начинаю осваивать 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;
}

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glut перемещение и масштабирование
СообщениеДобавлено: 24 ноя 2009 17:37 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Вот здесь "void Display(void)" надо использовать Pxy. OGL не запоминает последние координаты объекта. Все стирается и начинается заново при обновлении кадра каждый раз.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glut перемещение и масштабирование
СообщениеДобавлено: 05 дек 2009 09:07 
Не в сети
Любитель

Зарегистрирован: 17 май 2007 21:17
Сообщения: 13
А можно на примере? Пусть будут координаты x и y, которые используются в рисовании, например, линии.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glut перемещение и масштабирование
СообщениеДобавлено: 05 дек 2009 12:37 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Перенеси содержимое MouseMove в Display.

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

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB