Jump to content
Sign in to follow this  
saramgsilva

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

Recommended Posts

saramgsilva

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

Share this post


Link to post
Share on other sites
brink@ero

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;
}

Share this post


Link to post
Share on other sites
saramgsilva

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;
}

Share this post


Link to post
Share on other sites
TheDark

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;
}


Desaparecido.

Share this post


Link to post
Share on other sites
brink@ero

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.

Share this post


Link to post
Share on other sites
TheDark

ah... obrigado por partilharem :cheesygrin:

EDIT:

ah... obrigado por partilharem :P

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


Desaparecido.

Share this post


Link to post
Share on other sites
saramgsilva

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:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.