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 if (tecla == ‘A’) // muda posicao da janela { glutReshapeWindow(500,400); glutPositionWindow(100,100); } } Callback de Teclas Especiais // registro void glutSpecialFuc(Teclado); // interface void Teclado(int tecla, 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 Callback de Teclas com Modificadores Para verificar se asa teclas SHIFT, CTRL e ALT estão pressionadasa, pode-se usar a função De verificação de modificadores: void Teclado(int tecla, int x, int y) { int modificador = 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”); } Criação e Uso de Menus 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: • Int glutCreateMenu(void (*func) (int value)) // quando a opção value for selecionada, a função (*func) será chamada; • void glutAddmenuEntry(char *name, int value) // adiciona uma opção ao “menu corrente”. O primeiro parâmetro define o texto da opção, enquanto o segundo define o número a ser gerado quando a opção for selecionada; • void glutAddSubMenu(char *nome, int menu) // Adiciona uma opção ao “menu corrente” e coloca nessa opção o submenu, cujo número está sendo informado no segundo parâmetro. O primeiro parãmetro define o texto da opçãop. O submenu informado deve ter sido previamente criado com o uso da função glutCreateMenu() 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 valores válidos para o parãmetro button são as constantes GLUT_RIGHT_BUTTON, GLUT_LEFT_BUTTON e GLUT_MIDDLE_BUTTON, • void glutDetacjMenuEntry(int button) // Interrompe na “janela corrente” a ligação do “menu corrente” com um dos botôes do mouse, identificado pelo parâmetro passado, que deve ter a mesma constante passada para a função glutAttachMenu; Criação e Uso de Menus (Exemplo) // Função responsável por criar os menus, chamada da main.cpp void CriaMenu() { int menu,submenu1,submenu2; // Cria submenu para seleção de cor submenu1 = glutCreateMenu(MenuCor); glutAddMenuEntry("Vermelho",0); glutAddMenuEntry("Verde",1); glutAddMenuEntry("Azul",2); // Cria submenu para seleçã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 ao botão direito 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) Essa função é utilizada para definir a viewport. Os dois primeiros parâmetros servem para espeficicar o canto esquerdo superior da janela, enquanto os dois últimos definem, respectivamente, a largura e a altura da janela. Apesar da possibilidade de passar diferentes valores para esta função, principalmente quando se está trabalhando com duas viewports, em geral é atribuído o valor 0 para x e para y, e diferentes valores de largura e altura para a janela. void gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) Essa função é utilizada para definir a window quando se está trabalhando com desenhos 2D. Seus parâmetros correspondem, respectivamente, às coordenadas de cada borda da window, isto é, x mínimo (borda esquerda - left), x máximo (borda direita - right), y mínimo (borda inferior bottom) e y máximo (borda superior - top). Funções de Espaço de Trabalho (cont ..) A glViewport é chamada de dentro da função callback (ex: AlteraAspectojanela) registrada com a função glutReshapeFunc. Assim, sempre que o usuário altera o tamanho da janela GLUT, a viewport é redefinida. As variáveis largura e altura recebem, respectivamente, os valores de largura e altura da GLUT toda vez que o usuário altera o seu tamanho. Abaixo é dado um exemplo: // Função callback chamada quando o tamanho da janela é alterado void AlteraTamanhoJanela(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) else } gluOrtho2D (-40.0f, 40.0f, -40.0f*altura/largura, 40.0f*altura/largura); gluOrtho2D (-40.0f*largura/altura, 40.0f*largura/altura, -40.0f, 40.0f); Exercícios com Pontuação 1- [Nível Básico]: Construa um programa em OpenGL que faça interação com o teclado usando a função de callback do teclado. Crie interações com teclas especiais do tipo SHIFT, CTRL e ALT 2- [Nível Básico]: Construa um programa em OpenGL que faça interação com o mouse usando a função de callback do mouse. 3- [Nível Básico]: Construa um programa em OpenGL que faça interação de menu e submenus; 4- [Nível Básico]: Construa uma função para interações de reshape da ViewPort da GLUT que mantenha o aspecto da janela usando as funções gluOrtho2D e uma gluViewport. 5- [Nível Médio]: Construa um programa em OpenGL que, através do menu, construa diferentes primitivas como quadrado e vários tipos de triãngulos, permita a alteração da cor da primitiva e possa pintá-las com um spectro de cores, de acordo com o Exemplo Exerciciolab2.exe. O programa deve parar de executar quando for acionada a tecla ESC. 6- [Nível Médio]: Use a interação com o mouse para arrastar, ampliar e transladar a figura geométrica que aparece na Viewport.