Logo Hardware.com.br
Dhenyson
Dhenyson Novo Membro Registrado
10 Mensagens 0 Curtidas

OpenGl basico - Eventos do teclado

#1 Por Dhenyson 01/08/2014 - 01:29
Não sei se esse é o local certo para duvidas com OpenGL. Mas vamos lá.
Comecei estudar OpenGL hoje (há 3 horas pra ser mais exato) e estou com um pequeno problema. Tenho um programa que não faz nada além de criar uma janela no padrão RGB, e eu queria fazer o seguinte, quando eu apertar a letra 'r' a cor da janela ficar vermelha (red) quando apertar 'g' ficar verder e 'b' azul, com direito a misturas, exemplo, se eu apertar 'r' e 'g' a janela ficar amarela (pois vermelho e verde cria o amarelo). O meu programa funciona? SIM! porém ele funciona assim... quando eu aperto "uma cor" sofre a mudança de cor, porém eu não vejo, para eu poder perceber eu tenho que maximizar a janela ou minimizar, exemplo, a janela esta branca eu aperto 'r' e ele continua branca mas quando eu maximizo/minimizo ela fica vermelha (muda de cor). Como eu falei comecei hoje e meu programa é super simples, espero que me ajudem, pois comprei um livro de um amigo meu mas não encontrei esse problema, e minha faculdade está de ferias e não tenho contato com nenhum prof.

Meu código (não está comentado, mas quem sabe OpenGL vai entender muito fácil pois isso é o básico do básico básico):
____________________________________
#include
#include
#include

GLfloat red = 0, green = 0, blue = 0;

void Desenha(void){
glClearColor(red,green,blue,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}

void Inicializacao(void){
glMatrixMode(GL_PROJECTION);
glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void Teclado(unsigned char key, int x, int y){
switch(key){
case 114:
if(red == 0){
red = 1;
} else {
red = 0;
}
break;
case 103:
if(green == 0){
green = 1;
} else {
green = 0;
}
break;
case 98:
if(blue == 0){
blue = 1;
} else {
blue = 0;
}
break;
case 27:
exit(0);
break;
}
}

int main(int argc, char** argv){
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("Minha janelinha");
Inicializacao();
glutDisplayFunc(Desenha);
glutKeyboardFunc(Teclado);
glutMainLoop();
return 0;
}
Flyware
Flyware Zerinho Registrado
51 Mensagens 6 Curtidas
#2 Por Flyware
01/08/2014 - 05:28
Tem dois erros no código:

Primeiro:

falta um:
glutInit(&argc, argv);
No início.

Segundo:

O Desenha apesar de aparentar estar rodando em um eterno loop na verdade trabalha respondendo alguns eventos, o teclado não é um desses eventos, o redimensionamento da janela é um desses eventos.
O que você deve fazer é colocar essa função abaixo para forçar a entrada na função Desenha no final da função Teclado:
glutPostRedisplay();
Flyware
Flyware Zerinho Registrado
51 Mensagens 6 Curtidas
#4 Por Flyware
01/08/2014 - 13:15

#include <GL/gl.h>
#include <GL/glut.h>


GLfloat red = 0, green = 0, blue = 0;

void Desenha(void){
glClearColor(red, green, blue, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}

void Inicializacao(void){
glMatrixMode(GL_PROJECTION);
glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void Teclado(unsigned char key, int x, int y){
switch(key){
case 114:
if(red == 0){
red = 1;
} else {
red = 0;
}
break;
case 103:
if(green == 0){
green = 1;
} else {
green = 0;
}
break;
case 98:
if(blue == 0){
blue = 1;
} else {
blue = 0;
}
break;
case 27:
exit(0);
break;
}

glutPostRedisplay();
}

int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("Minha janelinha&quot;
Inicializacao();
glutDisplayFunc(Desenha);
glutKeyboardFunc(Teclado);
glutMainLoop();
return 0;
}



gcc a.c -lGL -lglut -lGLU
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal