100 likes | 210 Views
Callback de Teclado. // registro void glutKeyboardFuc ( Teclado ); // interface void Teclado (unsigned char tecla , int x, int y) { // algumas teclas if ( tecla == 27) exit(0); // sai do programa if ( tecla == ‘a’) glutFullScreen (); // tela cheia
E N D
Callback de Teclado // registro void glutKeyboardFuc(Teclado); // interface void Teclado(unsigned char tecla, int x, int y) { // algumasteclas if (tecla == 27) exit(0); // sai do programa if (tecla == ‘a’) glutFullScreen(); // telacheia if (tecla == ‘A’) // mudaposicao da janela { glutReshapeWindow(500,400); glutPositionWindow(100,100); } }
Callback de TeclasEspeciais // registro void glutSpecialFuc(Teclado); // interface void Teclado(inttecla, int x, int y) { switch(tecla) { case GLUT_KEY_F1: printf(“F1 pressionada\n”); case GLUT_KEY_HOME: printf(“home pressionada\n”); case GLUT_KEY_INSERT: printf(“insert pressionada\n”); }; } Um quadro completo de Funções especiais de teclado pode ser encontrado no Manual da Glut
Para verificar se asa teclas SHIFT, CTRL e ALT estão pressionadasa, pode-se usar a função De verificação de modificadores: Callback de Teclas com Modificadores void Teclado(inttecla, int x, int y) { intmodificador = glutGetModifiers(); if (modificador & GLUT_ACTIVE_SHIFT) printf(“SHIFT pressionado\n\n”); if (modificador & GLUT_ACTIVE_CTRL) printf(“CTRL pressionado\n\n”); if (modificador & GLUT_ACTIVE_ALT) printf(“ALT pressionado\n\n”); }
A biblioteca Glut possui algumas ferramentas para criação e gerenciamento de menus pop-up. A idéia geral é que cada menu possua a sua callback separada. Para criar menus, estão disponíveis as seguintes bibliotecas: Criação e Uso de Menus IntglutCreateMenu(void (*func) (int value)) // quando a opção value for selecionada, a função (*func) seráchamada; void glutAddmenuEntry(char *name, int value) // adicionaumaopçãoao “menu corrente”. O primeiroparâmetro define o texto da opção, enquanto o segundo define o número a ser geradoquando a opção for selecionada; void glutAddSubMenu(char *nome, int menu) // Adicionaumaopçãoao “menu corrente” e colocanessaopção o submenu, cujonúmeroestásendoinformado no segundoparâmetro. O primeiroparãmetro define o texto da opçãop. O submenu informadodevetersidopreviamentecriado com o uso da funçãoglutCreateMenu()
Criação e Uso de Menus (cont…) void glutAttachMenu(int button) // faz a ligação do menu corrente com um dos botões do mouse. Os valoresválidospara o parãmetro button são as constantes GLUT_RIGHT_BUTTON, GLUT_LEFT_BUTTON e GLUT_MIDDLE_BUTTON, void glutDetacjMenuEntry(int button) // Interrompena “janelacorrente” a ligação do “menu corrente” com um dos botôes do mouse, identificadopeloparâmetropassado, quedeveter a mesmaconstantepassadapara a funçãoglutAttachMenu;
Criação e Uso de Menus (Exemplo) // Funçãoresponsávelporcriaros menus, chamada da main.cpp void CriaMenu() { int menu,submenu1,submenu2; // Cria submenu paraseleção de cor submenu1 = glutCreateMenu(MenuCor); glutAddMenuEntry("Vermelho",0); glutAddMenuEntry("Verde",1); glutAddMenuEntry("Azul",2); // Cria submenu paraseleção de primitiva submenu2 = glutCreateMenu(MenuPrimitiva); glutAddMenuEntry("Quadrado",0); glutAddMenuEntry("Triângulo",1); glutAddMenuEntry("Losango",2); // Cria menu principal... menu = glutCreateMenu(MenuPrincipal); // ... e adiciona ambos submenus a ele glutAddSubMenu("Cor",submenu1); glutAddSubMenu("Primitivas",submenu2); // Associa o menu aobotãodireito do mouse glutAttachMenu(GLUT_RIGHT_BUTTON); }
Funções de Espaço de Trabalho Para realizar o mapeamento do SRU para o SRT em OpenGL é necessário apenas especificar a viewport e a window, utilizando as funções descritas a seguir:
Funções de Espaço de Trabalho (cont ..) void glViewport(GLint x, GLint y, GLsizei width, GLsizei height) Essafunção é utilizadaparadefinir a viewport. Os doisprimeirosparâmetrosservemparaespeficicar o canto esquerdo superior da janela, enquantoosdoisúltimosdefinem, respectivamente, a largura e a altura da janela. Apesar da possibilidade de passardiferentesvaloresparaestafunção, principalmentequando se estátrabalhando com duas viewports, emgeral é atribuído o valor 0 para x e para y, e diferentesvalores de largura e alturapara a janela. void gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) Essafunção é utilizadaparadefinir a windowquando se estátrabalhando com desenhos 2D. Seusparâmetroscorrespondem, respectivamente, àscoordenadas de cadaborda da window, isto é, x mínimo (bordaesquerda - left), x máximo (bordadireita - right), y mínimo (borda inferior bottom) e y máximo (borda superior - top).
// Função callback chamada quando o tamanho da janela é alterado voidAlteraTamanhoJanela(GLsizei w, GLsizei h) { GLsizei largura, altura; // Evita a divisao por zero if(h == 0) h = 1; // Atualiza as variáveis largura = w; altura = h; // Especifica as dimensões da Viewport glViewport(0, 0, largura, altura); // Inicializa o sistema de coordenadas glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Estabelece a janela de seleção (esquerda, direita, inferior, superior) mantendo a proporção com a janela de visualização if (largura <= altura) gluOrtho2D (-40.0f, 40.0f, -40.0f*altura/largura, 40.0f*altura/largura); else gluOrtho2D (-40.0f*largura/altura, 40.0f*largura/altura, -40.0f, 40.0f); } Funções de Espaço de Trabalho (cont ..) A glViewport é chamada de dentro da função callback (ex: AlteraAspectojanela) registrada com a funçãoglutReshapeFunc. Assim, sempreque o usuárioaltera o tamanho da janela GLUT, a viewport é redefinida. As variáveislargura e alturarecebem, respectivamente, osvalores de largura e altura da GLUT todavezque o usuárioaltera o seutamanho. Abaixo é dado um exemplo:
Exercícios com Pontuação 1- [NívelBásico]: Construa um programaem OpenGL quefaçainteração com o tecladousando a função de callback do teclado. Crieinterações com teclasespeciais do tipo SHIFT, CTRL e ALT 2- [NívelBásico]: Construa um programaem OpenGL quefaçainteração com o mouse usando a função de callback do mouse. 3- [NívelBásico]: Construa um programaem OpenGL quefaçainteração de menu e submenus; 4- [NívelBásico]: Construaumafunçãoparainterações de reshape da ViewPort da GLUT quemantenha o aspecto da janelausando as funçõesgluOrtho2D e umagluViewport. 5- [NívelMédio]: Construa um programaem OpenGL que, através do menu, construadiferentesprimitivascomoquadrado e váriostipos de triãngulos, permita a alteração da cor da primitiva e possapintá-las com um spectro de cores, de acordo com o Exemplo Exerciciolab2.exe. O programadeveparar de executarquando for acionada a tecla ESC. 6- [NívelMédio]: Use a interação com o mouse paraarrastar, ampliar e transladar a figurageométricaqueaparecena Viewport.