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/ |