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.
Download

1- [Nível Básico]