• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

saramgsilva

[Resolvido] Duvidas de Opengl e c/c++

7 mensagens neste tópico

boas,

eu estou a iniciar em opengl...e SOS!!!

e queria por uma imagem a piscar.... ou seja tenho 1 imagem 1 depois aparece a imagem 2 e depois a imagem 1 e assim sucessivamente....e fiz isto:

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


void init(void){

glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,500.0,0.0,500.0);

}


void quadrado1(void){

  	glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
	glColor3f(1.0,0.0,0.0);
    glVertex2i(30,30);
	glVertex2i(30,60);
	glVertex2i(60,60);
	glVertex2i(60,30);


glEnd();

glFlush();
  
}

void quadrado2(void){

glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);

glBegin(GL_POLYGON);
  glColor3f(1.0,1.0,0.0);
  glVertex2f(125.0,125.0);
  glVertex2f(375.5,125.0);
  glVertex2f(375.0,375.0);
  glVertex2f(125.0,375.0);

glEnd();

glFlush();
  
}


int main(int argc, char** argv){
glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);

glutCreateWindow("piscar ganhou!! ");

init();

	glutDisplayFunc(quadrado);

	do{  
		glClearColor(1.0,1.0,1.0,0.0);	
		glutDisplayFunc(quadrado1);
		glClearColor(1.0,1.0,1.0,0.0);
		glutDisplayFunc(quadrado2);
    	
		glutMainLoop();
	}while(1);

   



  return 0;
}
mas nao funciona...pois aparece spr o ultimo display...

devo estar a fazer asneiras...so pode...

ja agora a ideia inicial era por numa imagem....a dizer:  conseguiste!!  mas as letras a piscar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vendo o teu programa, tens erros alguns erros comum no início.

Aconselho-te este livro muito bom:

Computer Graphics Using OpenGL

F.S.Hill, Jr

Prentice Hall

Já progamaste em VB?... isto é um pouco parecido com isso.

Para começar a função:

glutDisplayFunc(quadrado);

Sempre e só quando a janela é aberta ou redimensionada a função quadrado é chamada!

Por isso não faz sentido ter duas vezes a função nem um ciclo entre ela!

a função glutMainLoop(); faz com que o programa entre num ciclo infinito.

Outra coisa, eu vi que bombardiaste o programa com a instrução:

glClearColor(1.0,1.0,1.0,0.0);

Basta por uma vez, a não ser que queiras determinada altura mudar a cor de fundo.

E por fim:

glBegin(GL_QUADS);

glBegin(GL_POLYGON);

das duas uma, ou queres fazer um quadrado ou um poligono, por isso basta uma das instruções.

O que queres é isto, mas como ves isto não é muito práctico, pois está num ciclo infinito numa função chamada pelo glutDisplayFunc, ou seja, não consegues fazer mais nada (nem encerrar nem minimizar nem fechar):

#include <stdio.h>
#include <GL/glut.h>
#include <windows.h>


void init(void){

glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,500.0,0.0,500.0);

}


void quadrado(void){

do
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
	glColor3f(1.0,0.0,0.0);
    glVertex2i(30,30);
	glVertex2i(30,60);
	glVertex2i(60,60);
	glVertex2i(60,30);
glEnd();

glFlush();

Sleep(500);

glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
  glColor3f(1.0,1.0,0.0);
  glVertex2f(125.0,125.0);
  glVertex2f(375.5,125.0);
  glVertex2f(375.0,375.0);
  glVertex2f(125.0,375.0);
glEnd();

glFlush();

Sleep(500);

}while(1);
  
}

int main(int argc, char** argv){

glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);

glutCreateWindow("piscar ganhou!! ");

init();

glutDisplayFunc(quadrado);
   	
glutMainLoop();

  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eheh ja pisca!! :D fixe...Obrigada....

e mudei isso que falaste...eu sabia que nao estava mto bem...em relacao as cores eu keria k cada quadrado tivesse 1 cor diferenta....:thumbsup:

fica aqui a alteracao...

#include <stdio.h>
#include <GL/glut.h>
#include <windows.h>


void init(void){

glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluOrtho2D(0.0,500.0,0.0,500.0);

}



void quadrado(void){

do
{
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);

		 glColor3f(1.0,0.0,0.0);

		 glVertex2f(125.0,125.0);
		 glVertex2f(375.5,125.0);
		 glVertex2f(375.0,375.0);
		 glVertex2f(125.0,375.0);

	glEnd();

	glFlush();

	Sleep(500);

	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
	  glColor3f(1.0,1.0,0.0);
	  glVertex2f(125.0,125.0);
	  glVertex2f(375.5,125.0);
	  glVertex2f(375.0,375.0);
	  glVertex2f(125.0,375.0);
	glEnd();

	glFlush();

	Sleep(500);

}while(1);
  
}


int main(int argc, char** argv){

glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);

glutCreateWindow("piscar ganhou!! ");

init();

glutDisplayFunc(quadrado);

glutMainLoop();

  return 0;
}

depois disto...tentei fazer algo que parasse o piscar...mas com a accao do teclado..primindo a tecla p ou P .... pq como o codigo anterior esta em ciclo infinito...quando fecho a janela...da erro...

mas o codigo que fiz....nao mas nao funciona...onde esta o erro??

#include <stdio.h>
#include <GL/glut.h>
#include <windows.h>


void init(void){

glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluOrtho2D(0.0,500.0,0.0,500.0);

}



void quadrado(void){

do
{
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);

		 glColor3f(1.0,0.0,0.0);

		 glVertex2f(125.0,125.0);
		 glVertex2f(375.5,125.0);
		 glVertex2f(375.0,375.0);
		 glVertex2f(125.0,375.0);

	glEnd();

	glFlush();

	Sleep(500);

	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
	  glColor3f(1.0,1.0,0.0);
	  glVertex2f(125.0,125.0);
	  glVertex2f(375.5,125.0);
	  glVertex2f(375.0,375.0);
	  glVertex2f(125.0,375.0);
	glEnd();

	glFlush();

	Sleep(500);

}while(1);
  
}


void teclado (unsigned char key, int x, int y)
{
	if( key==27)
	{	exit (0); }

	if( key=='p' || key=='P')
	{	 
		glClear(GL_COLOR_BUFFER_BIT);
		glBegin(GL_POLYGON);
		 glColor3f(1.0,0.0,0.0);

		 glVertex2f(125.0,125.0);
		 glVertex2f(375.5,125.0);
		 glVertex2f(375.0,375.0);
		 glVertex2f(125.0,375.0);
    	glEnd();

		glFlush();

	}

}


int main(int argc, char** argv){

glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);

glutCreateWindow("piscar ganhou!! ");

init();

glutDisplayFunc(quadrado);

   	glutKeyboardFunc(teclado);

glutMainLoop();

  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais uma vez tarde e a más horas. Não sei se entretanto resolveste o problema, mas aqui fica uma solução.

Percebo pouco de OpenGL, dei-lhe uns toques ha uns meses; felizmente, o problema é o algoritmo da função quadrado. Ao criares um loop infinito, a função nunca retorna, e assim sendo o glut não tem oportunidade de verificar se foi pressionada alguma tecla. Então, como dizer ao glut que queres desenhar quadrados num dado intervalo (no caso, de 1 em 1 segundo)?

Para isso existe a função glutTimerFunc(), que recebe um valor em milissegundos, um apontador para uma função callback, e um valor para passar a essa função.

Se disseres no final da função quadrado que dentro de 500 milissegundos a queres correr novamente, ficamos com uma espécie de loop não bloqueante: a função quadrado é chamada, desenha um quadrado, espera 500ms, desenha outro quadrado, e diz que quer ser chamada de novo daí a 500ms.

Na prática não é bem assim, porque a função de callback da glutTimerFunc tem que receber um parametro do tipo int, e a função quadrado não recebe qualquer parâmetro; mas isso resolve-se facilmente indicando outra função de callback que se resume a chamar a função quadrado.

Continuamos a chamar a função quadrado quando é preciso actualizar a janela; isso serve para desencadear esta "recursividade" falsa quando a janela é desenhada pela 1ª vez.

Decerto haverá uma forma "menos padeira"  ::cheesygrin: de fazer isto, mas como disse pouco sei de OpenGL...

Ficará então o código assim:

#include <windows.h>
#include <stdio.h>
#include <GL/glut.h>


void init(void){

glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluOrtho2D(0.0,500.0,0.0,500.0);

}

void redesenha(int);

void quadrado(void){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
	glColor3f(1.0,0.0,0.0);
	glVertex2f(125.0,125.0);
	glVertex2f(375.5,125.0);
	glVertex2f(375.0,375.0);
	glVertex2f(125.0,375.0);
glEnd();

glFlush();

Sleep(500);

glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
	glColor3f(1.0,1.0,0.0);
	glVertex2f(125.0,125.0);
	glVertex2f(375.5,125.0);
	glVertex2f(375.0,375.0);
	glVertex2f(125.0,375.0);
glEnd();

glFlush();

glutTimerFunc(500, redesenha, NULL);
}


void teclado (unsigned char key, int x, int y)
{
if( key==27)
	exit (0);

if( key=='p' || key=='P') {
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
		glColor3f(1.0,0.0,0.0);

		glVertex2f(125.0,125.0);
		glVertex2f(375.5,125.0);
		glVertex2f(375.0,375.0);
		glVertex2f(125.0,375.0);
	glEnd();

	glFlush();
}
}

void redesenha(int discard) {
quadrado();
}


int main(int argc, char** argv){

glutInit(&argc, argv);
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);

glutCreateWindow("piscar ganhou!! ");

init();

glutDisplayFunc(quadrado);
glutKeyboardFunc(teclado);
glutMainLoop();

return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim existe e eu já respondi a tofas.

//...
void myIdle ()
{
//...
glutPostRedisplay();
}

void main(int argc,char **argv)
{
//...
glutIdleFunc (myIdle);
//...
}

EDIT: Pronto, está ai. A função myIdle está sempre a executar, não precisa de nenhum ciclo infinito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ah... obrigado por partilharem :cheesygrin:

EDIT:

ah... obrigado por partilharem :P

é sempre bom sprender estas soluções mais correctas :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim existe e eu já respondi a tofas.

//...
void myIdle ()
{
//...
glutPostRedisplay();
}

void main(int argc,char **argv)
{
//...
glutIdleFunc (myIdle);
//...
}

EDIT: Pronto, está ai. A função myIdle está sempre a executar, não precisa de nenhum ciclo infinito.

pois...estas 2 funcoes sao mto importantes...e mto uteis...eheh obrigada pela ajuda  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora