|
Introdução à OpenGL Professora Isabel Harb Manssour |
|
12. Gerenciamento de Eventos (teclado e mouse)A biblioteca GLUT também contém funções para gerenciar eventos de entrada de teclado e mouse. De acordo com [Woo 1999] e [Wright 2000], estas funções foram descritas a seguir glutKeyboardFunc glutSpecialFunc glutMouseFunc O programa abaixo exemplifica a utilização das funções acima especificadas. Neste caso, foram implementadas as seguintes interações: sempre que o usuário pressiona a tecla "R" ou "r", o retângulo é exibido com a cor vermelha; ao pressionar a tecla "G" ou "g" o retângulo é exibido com a cor verde; pressionar a tecla "B" ou "b" o retângulo é exibido com a cor azul; cada vez que o usuário clica com o botão esquerdo do mouse, o tamanho do retângulo é alterado (vai do centro da janela até a posição onde houve o click do mouse); e cada vez que as teclas KEY_UP e KEY_DOWN são pressionadas ocorre zoom-in e zoom-out, respectivamente.
// Interacao.c - Isabel H. Manssour
// Um programa OpenGL simples que desenha um quadrado em
// uma janela GLUT de acordo com interações do usuário.
// Este código está baseado nos exemplos
// disponíveis no livro "OpenGL SuperBible",
// 2nd Edition, de Richard S. e Wright Jr.
#include <gl/glut.h>
GLfloat xf, yf, win;
GLint view_w, view_h;
// Função callback chamada para fazer o desenho
void Desenha(void)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
// Desenha um retângulo preenchido com a cor corrente
glBegin(GL_POLYGON);
glVertex2f(0.0f, 0.0f);
glVertex2f(xf, 0.0f);
glVertex2f(xf, yf);
glVertex2f(0.0f, yf);
glEnd();
glFlush();
}
// Inicializa parâmetros de rendering
void Inicializa (void)
{
// Define a cor de fundo da janela de visualização como preta
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
xf=50.0f;
yf=50.0f;
win=250.0f;
}
// Função callback chamada quando o tamanho da janela é alterado
void AlteraTamanhoJanela(GLsizei w, GLsizei h)
{
// Especifica as dimensões da Viewport
glViewport(0, 0, w, h);
view_w = w;
view_h = h;
// Inicializa o sistema de coordenadas
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (-win, win, -win, win);
}
// Função callback chamada para gerenciar eventos de teclado
void GerenciaTeclado(unsigned char key, int x, int y)
{
switch (key) {
case 'R':
case 'r':// muda a cor corrente para vermelho
glColor3f(1.0f, 0.0f, 0.0f);
break;
case 'G':
case 'g':// muda a cor corrente para verde
glColor3f(0.0f, 1.0f, 0.0f);
break;
case 'B':
case 'b':// muda a cor corrente para azul
glColor3f(0.0f, 0.0f, 1.0f);
break;
}
glutPostRedisplay();
}
// Função callback chamada para gerenciar eventos do mouse
void GerenciaMouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON)
if (state == GLUT_DOWN) {
// Troca o tamanho do retângulo, que vai do centro da
// janela até a posição onde o usuário clicou com o mouse
xf = ( (2 * win * x) / view_w) - win;
yf = ( ( (2 * win) * (y-view_h) ) / -view_h) - win;
}
glutPostRedisplay();
}
// Função callback chamada para gerenciar eventos do teclado
// para teclas especiais, tais como F1, PgDn e Home
void TeclasEspeciais(int key, int x, int y)
{
if(key == GLUT_KEY_UP) {
win -= 20;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (-win, win, -win, win);
}
if(key == GLUT_KEY_DOWN) {
win += 20;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (-win, win, -win, win);
}
glutPostRedisplay();
}
// Programa Principal
int main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(350,300);
glutInitWindowPosition(10,10);
glutCreateWindow("Exemplo de Interacao");
glutDisplayFunc(Desenha);
glutReshapeFunc(AlteraTamanhoJanela);
glutKeyboardFunc(GerenciaTeclado);
glutMouseFunc(GerenciaMouse);
glutSpecialFunc(TeclasEspeciais);
Inicializa();
glutMainLoop();
}
Obs.: Clique aqui para fazer o download deste programa.
|
Última alteração em 27 de março de 2003.