:: Julho de 2003 ::
 

Projetos em Computação Gráfica - 3º Projeto

IA725 - Computação Gráfica
1º Semestre de 2003

Prof.a Wu, Shin-Ting
DCA/FEEC/UNICAMP
   

 

Projetos

1º Projeto

2º Projeto

3º Projeto

 

 

1) Descrição do Programa

O objetivo deste programa é apresentar uma aplicação utilizando recursos de textura e animação aplicadas na imagem do logotipo da UNICAMP.

O algoritmo foi desenvolvido na linguagem de programação Borland C++ 5.02 com o uso das funções do OpenGL 95, sob o sistema operacional Windows 98.

O programa logo (logot.cpp/logot.exe) lê um arquivo texto que contém todas as coordenadas x e y necessárias para desenhar o logotipo da UNICAMP, desenhando-o então na tela. Para isso, utilizamos o arquivo logo.txt, que foi criado a partir das coordenadas encontradas no arquivo preto.dxf, compatível com AutoCad e outros softwares vetoriais similares. Todos os procedimentos de leitura e carregamento das coordenadas foram retiradas do Projeto 1.

Após definido o objeto, colocamos em prática o carregamento e aplicação da textura e animação sobre a imagem. Neste caso, utilizamos um objeto 1D criado pelo próprio programa para facilicar sua aplicação.

2) Executando o Programa

Para iniciar o programa não é necessário passar parâmetro algum, basta digitar:

C:\logo> logot

Pode-se também utilizar a tecla End para sair do programa.

Figura 1 - Logotipo da UNICAMP texturizado

3) Detalhes da Implementação

Para inserirmos textura em um objeto 3D é necessário carregar os parâmetros correspondentes da textura para então aplicá-la na imagem. Um problema encontrado se deu pela aplicação de uma textura carregada por um arquivo em 2D, onde é necessário definir para cada vértice da imagem o limite da textura.

No programa logot não foi possível delimitar esses vértices pois o programa implementa o polígono lendo as coordenadas através de um arquivo texto e sendo carregadas por uma rotina default. Utilizei então uma função para criação de textura automática, criada pelo próprio programa. Neste caso, não foi necessário especificar as coordenadas dos vértices, pois o polígono foi preenchido em sua totalidade com a textura gerada.

Um exemplo de aplicação de textura 2D pode ser visto no programa Texture JPG. Nele, uma figura jpeg é carregada sobre um cubo, onde os vértices da textura são delimitados nos vértices do cubo. Veja maiores detalhes do programa (compilação e execução) na página http://www.inf.pucrs.br/~pinho/CG/Aulas/OpenGL/Texturas/MapTextures.html.

Figura 2- Exemplo de textura 2D

Vejamos agora alguns recortes da imagem durante a animação:

Figura 3 - Efeitos de Zoom e Rotação durante a animação

Um método simples de criação de uma textura automática pode ser visto no código abaixo:

#define stripeImageWidth 16
GLubyte stripeImage[3*stripeImageWidth];
GLfloat sgenparams[] = {5.5, 3.5, 1.5, 0.0};

void makeStripeImage(void)            
{
int j; for (j = 0; j < stripeImageWidth; j++)
{
stripeImage[3*j] = (j<=4) ? 255 : 0;
stripeImage[3*j+1] = (j>4) ? 255 : 0;
stripeImage[3*j+2] = 0;
}
}

Além desse procedimento é necessário também habilitar na inicialização do OpenGL algumas funções referentes à textura:

makeStripeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage1D(GL_TEXTURE_1D,0,3,stripeImageWidth,0,GL_RED,
GL_UNSIGNED_BYTE,stripeImage);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_S, GL_OBJECT_PLANE, sgenparams);

glDepthFunc(GL_LESS);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_1D);

Não devemos esquecer que para uma melhor visualização da textura podemos habilitar também fontes de iluminação sobre o objeto, como realizado neste projeto.

Já para o processo de animação foi necessário acrescentarmos à procedure display as funções incrementais de rotação e escala, como mostrados abaixo:

//declaração de variáveis globais
#define zoom 0.05
#define max_zoom 2
#define min_zoom 0 double atual = 1;
int aumentando = 1;

...

xRot+=3.0f;
yRot+=5.0f;
zRot+=2.0f;

 //controla o zoom
if (aumentando==1)
      {
      atual+= zoom;
      if (atual > max_zoom)
            {
            aumentando = 0;
            atual = max_zoom;
            }
      }
else
      {
      atual-= zoom;
      if (atual < min_zoom)
            {
            aumentando = 1;
            atual = min_zoom;
            }
      }
xScl = yScl = zScl = atual;

Maiores detalhes podem ser encontrados no código fonte do programa.

 

Referências Bibliográficas

FOLEY, J.; HUGHES, J.et al. Computer Graphics: Principles and Practice in C, 2nd edition, Addison-Wesley Publishing Company, 1996.

OpenGL® Programming Guide: The Official Guide to Learning OpenGL
Mason Woo, Jackie Neider, Tom Davis, Dave Shreiner
Addison-Wesley Publishing Company, 1999
ISBN: 0-201-60458-2

http://www.inf.pucrs.br/~pinho/CG/Aulas/OpenGL/Texturas/MapTextures.html