quinta-feira, 6 de junho de 2013

[Programação em C] Desenhando polígonos com OpenGL

Olá pessoal, nesse post iremos trabalhar um pouco com computação gráfica.

Iremos construir um programa que desenha três polígonos: triângulo, quadrado e retângulo.

Para fazer isso iremos utilizar a OpenGL que fornece um conjunto de comandos para modelagem e visualização de objetos geométricos.

Iremos utilizar também outras bibliotecas que são a GLU e GLUT, essas bibliotecas facilitam bastante pois fornecem uma maior abstração.

Para você poder programar utilizando OpenGL no Windows mostrarei um caminho bem simples.

Primeiro faça o download do Falcon C++ clicando no link abaixo:


Clique no link abaixo de "Current version" para fazer o download.

Agora basta você baixar os pacotes das bibliotecas que iremos utilizar no nosso exemplo. Pacotes facilitam bastante, pois basta fazer o download, clicar 2x e pronto, já está tudo configurado para você poder programar.

Clique aqui para baixar o pacote da OpenGL para o Falcon

Clique aqui para baixar o pacote da GLUT para o Falcon

Para instalar os pacotes é muito fácil, basta clicar duas vezes e prosseguir normalmente como se fosse a instalação de um programa qualquer.

Crie um novo projeto (Arquivo->Novo->Projeto) no Falcon.

Vai abrir uma janela, na aba "Multimedia", escolha "Glut demo", no arquivo "main.cpp" que irá ser criado, pode apagar o código que vem nele, é um exemplo de código utilizando a Glut, iremos fazer outro exemplo, então pode apagar.

Pronto, você já pode executar o código desse post. Geralmente essas bibliotecas são difíceis de configurar para quem é iniciante, então uma IDE com os pacotes e modelos de projeto são muito importantes para otimizar o seu trabalho. Você só tem que se preocupar em programar :)

O código a seguir mostra três polígonos: triângulo, quadrado e retângulo. Primeiramente ele mostra um triângulo e cada vez que você teclar espaço o polígono mudará para quadrado, depois retângulo e assim sucessivamente.

Caso você tecle ESC então o programa fechará!

// www.GeeksBR.com
// o arquivo glut.h já inclui o gl.h e GLU.h
#include <GL/glut.h>

// variável que define o poligono que será mostrado
int poligono = 0;

// função para desenhar um triângulo
void desenhar_triangulo()
{
 // limpa a tela com a cor branca
 glClearColor(1, 1, 1, 0);
 glClear(GL_COLOR_BUFFER_BIT);

 // define a cor azul para o desenho do triângulo
 glColor3f(0, 0, 1);

 // desenha um triângulo
 glBegin(GL_TRIANGLES);
 glVertex3f(-0.5, -0.5, 0);
 glVertex3f(0.0, 0.5, 0);
 glVertex3f(0.5, -0.5, 0);
 glEnd();

 // força execução dos comandos da OpenGL
 glFlush();
}

// função para desenhar um quadrado
void desenhar_quadrado()
{
 // limpa a tela com a cor branca
 glClearColor(1, 1, 1, 0);
 glClear(GL_COLOR_BUFFER_BIT);

 // define a cor vermelho para o desenho do quadrado
 glColor3f(1, 0, 0);

 // desenha um quadrado
 glBegin(GL_QUADS);
 glVertex3f(-0.5, -0.5, 0); // canto esquerdo inferior
 glVertex3f(-0.5, 0.5, 0); // canto esquerdo superior
 glVertex3f(0.5, 0.5, 0); // canto direito superior
 glVertex3f(0.5, -0.5, 0); // canto direito inferior
 glEnd();

 glFlush();
}

// função para desenhar um retângulo
void desenhar_retangulo()
{
 // limpa a tela com a cor branca
 glClearColor(1, 1, 1, 0);
 glClear(GL_COLOR_BUFFER_BIT);

 // define a cor verde para o desenho do retangulo
 glColor3f(0, 1, 0);

 // desenha um retângulo
 glBegin(GL_QUADS);
 glVertex3f(-0.5, -0.7, 0);
 glVertex3f(-0.5, 0.7, 0);
 glVertex3f(0.5, 0.7, 0);
 glVertex3f(0.5, -0.7, 0);
 glEnd();

 glFlush();
}

// função callback chamada para gerenciar eventos de teclas
void evento_teclado(unsigned char key, int x, int y)
{
 if(key == 32)   // se teclar espaço muda o polígono
 {
  // se poligono for 0, estava mostrando triangulo
  if(poligono == 0)
  {
   /*
    glutDisplayFunc define a função callback de
    exibição para a janela atual
   */
   glutDisplayFunc(desenhar_quadrado);
   desenhar_quadrado();
   poligono = 1;
  }
  else if(poligono == 1) // estava mostrando quadrado
  {

   glutDisplayFunc(desenhar_retangulo);
   desenhar_retangulo();
   poligono = 2;
  }
  else if(poligono == 2) // estava mostrando retangulo
  {
   glutDisplayFunc(desenhar_triangulo);
   desenhar_triangulo();
   poligono = 0;
  }
 }
 if(key == 27) // se teclar ESC fecha o programa
  exit(0);
}

// função responsável por inicializar parâmetros e variáveis
void inicializar()
{
 // define a janela de visualização 2D
 glMatrixMode(GL_PROJECTION);
 gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
 glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char *argv[])
{
 // define do modo de operação da GLUT
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

 // especifica o tamanho inicial em pixels da janela GLUT
 glutInitWindowSize(400, 400);

 // cria a janela passando como argumento o título
 glutCreateWindow("Polígonos");

 // registra a função callback de redesenho da janela de visualização
 glutDisplayFunc(desenhar_triangulo);
 poligono = 0;

 // define a função de callback
 glutKeyboardFunc(evento_teclado);

 // chama a função responsável por fazer as inicializações
 inicializar();

 // loop de processamento de eventos GLUT
 glutMainLoop();

 return 0;
}

Clique aqui para fazer o download do código

Quaisquer dúvidas deixem nos comentários, até a próxima!


Nenhum comentário: