Home Projeto 1 Projeto 2 Projeto 3

Introdução

Esta atividade tem como principal objetivo a construção de uma imagem monocromática do logotipo da UNICAMP, utilizando a biblioteca gráfica OpenGL. No caso deste trabalho, já foi adiantado também o uso de iluminação e cores. Para isso, foram observados alguns passos principais:

  • Modelagem Geométrica;
  • Transformações Geométricas e Projetivas;
  • Cores e Iluminação.

 

Passo 1 - Modelagem Geométrica

Modelos Geométricos são peças fundamentais em síntese e análise de imagens. Para a formulação de algoritmos de síntese, como no caso deste projeto, duas informações geométricas são essenciais: a posição de cada ponto (vértices) e o vetor normal de superfície associado a cada posição.

Para a determinação dos vértices, haviam várias opções:

  1. captura ponto a ponto das coordenadas dos vértices a partir de uma imagem pronta do logotipo, com o auxílio de um software gráfico;
  2. utilização de um arquivo de pontos, disponibilizado no site da UNICAMP em diversos formatos;
  3. modelagem matemática das formas geométricas, através de dados também fornecidos no site da UNICAMP.

Neste trabalho foi escolhido trabalhar com dados extraídos de um arquivo texto. As coordenadas foram armazenadas em constantes dentro do próprio programa, ao invés de se fazer a leitura de arquivo.

De posse destes dados, o passo seguinte é unir estes vértices, com coerência, de modo a formar os polígonos que vão formar as faces dos sólidos do logotipo. Esta etapa é trabalhosa, pois deve-se ordenar os polígonos para que as faces possuam suas normais voltadas para fora.

Como o projeto requer a construção de um sólido 3D, é preciso fazer a extrusão da figura do logotipo. Esta etapa é feita adicionando-se um valor à coordenada z dos vértices obtidos.

A modelagem foi dividida em 3 etapas distintas: a modelagem da parte da frente dos sólidos; a modelagem da parte de trás (parte da frente extrudada); e a modelagem da parte lateral, que faz o "fechamento" dos sólidos.

Inicialmente, tentou-se modelar as partes da frente e de trás diretamente, com o comando glBegin(GL_POLYGON). No entanto, como alguns sólidos não eram convexos, esta alternativa não foi satisfatória. Foi necessária a utlização do GLU Tesselator, uma série de comandos do GLUT que automaticamente cria uma malha triangular em um polígono, seja ele côncavo ou convexo. Essa técnica foi adotada para a construção da parte da frente e da parte de trás dos polígonos. Abaixo podemos ver um trecho de código que exemplifica a aplicação do GLU Tesselator no projeto:

/*-----------------------------------------------------------*/
/* Construcão das Partes da frente dos sólidos */


/* Letra U */
gluTessBeginPolygon (tess, NULL);
gluTessBeginContour (tess);
for (i=0; i<sizeof(letra_U_extr)/(sizeof(GLdouble)*3); i++)
gluTessVertex(tess, letra_U_extr[i], letra_U_extr[i]);
gluTessEndContour (tess);
gluEndPolygon (tess);

Para os três círculos do logotipo não foi necessário usar o GLU Tesselator, de forma que um simples glBegin(GL_POLYGON) foi necessário para construí-los.

Na parte lateral dos sólidos, foi utilizada a função glBegin novamente, no entanto com o parâmetro GL_TRIANGLE_STRIP. O desenho abaixo ilustra a ordem em que devem ser fornecidos os vértices para construirmos o “triangle strip”:

Como possuimos as coordenadas dos vértices da parte superior e da parte inferior, basta combiná-los de forma alternada para construirmos a parte lateral.
Obs.: Uma atenção especial deve ser voltada para o final do comando glBegin(GL_TRIANGLE_STRIP) de cada sólido: deve-se repetir os primeiros vértices da parte de cima e da parte de baixo para que a parte lateral se feche completamente!

Com esses passos já é possível se visualizar o modelo geométrico do logotipo, ainda que sem efeitos de iluminação nem de cor. Abaixo podemos observar o logotipo apenas com sua estrutura de "aramado" (wireframe) (clique para ampliar):


 

Passo 2 - Tranformações Geométricas e Projetivas

Para uma correta visualização da figura, é necessário que se efetuem transformações geométricas e projetivas no modelo geométrico.

Entende-se como transformação uma aplicação f que faz corresponder um ponto P do domínio Rn a um ponto do contra-domínio Sn. Em sistemas de informações gráficas, as transformações são muito utilizadas para mudar sistemas de referência (Rn diferente de Sn) ou mudar a posição dos pontos num mesmo sistema de referência (Rn igual a Sn). Este projeto se enquadra na segunda classe.

No aplicativo do Projeto 1 foram implementadas teclas de atalho que correspondem a diversas transformações sobre o logotipo. São elas:

Tecla
Tipo de Transformação
A
Rotação no eixo X, sentido horário
Z
Rotação no eixo X, sentido anti-horário
S
Rotação no eixo Y, sentido horário
X
Rotação no eixo Y, sentido anti-horário
D
Rotação no eixo Z, sentido horário
C
Rotação no eixo Z, sentido anti-horário
I
Translação no eixo Y, sentido positivo
K
Translação no eixo Y, sentido negativo
J
Translação no eixo X, sentido negativo
L
Translação no eixo X, sentido positivo
-
Escalamento positivo (zoom in) em todos os eixos
+
Escalamento positivo (zoom out) em todos os eixos
H
Retorno à condição inicial

Existem dois tipos básicos de projeções perspectivas possíveis em OpenGL: ortográfica e perspectiva. Neste trabalho foi utilizada a projeção ortográfica.

Na projeção ortográfica, simplesmente descartamos uma das dimensões. Por exemplo, um ponto (x,y,z) será mapeado para simplesmente (x,y). Este tipo de projeção é bastante utilizada em projetos arquitetônicos e de peças mecânicas, pois os desenhos assim obtidos podem ser utilizados para medirmos as dimensões dos objetos representados. Na projeção ortográfica, não importa a distância entre o objeto e o observador, o objeto vai sempre ser visualizado do mesmo tamanho, diferentemente da projeção perspectiva, como veremos abaixo. Em OpenGL a chamada que especifica uma projeção ortográfica no espaço 3D é:

glOrtho(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax);

Esta chamada define no espaço 3D um paralelepípedo. Somente serão visualizados os objetos que estiverem dentro deste paralelepípedo, denominado o Volume de Visualização (veja ilustração abaixo).

 

Passo 3 - Cores e Iluminação

Como último passo, foi feita a aplicação de um modelo de iluminação e de cores ao modelo do logotipo.

Para a aplicação do modelo de iluminação é necessária a determinação de diversos parâmetros, tais como a posição da fonte de luz (GL_POSITION), a intensidade ambiente(GL_AMBIENT), a intensidade lambertiana (GL_DIFFUSE), a intensidade especular (GL_SPECULAR), a direção da fonte spot (GL_SPOT_DIRECTION) (em nosso caso esse foi o tipo de fonte utilizado), o expoente de decaimento da intensidade (GL_SPOT_EXPONENT), o ângulo de abrangência do spot (GL_SPOT_CUTOFF) e os fatores de atenuação (GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION e GL_QUADRATIC_ATTENUATION). O modelo de tonalização utilizado foi a interpolação de luminância de Gourand (comando GL_SMOOTH). A tabela a seguir mostra os valores utilizados.

 

Resultados

O resultado final do aplicativo pode ser visto nas figuras abaixo, que mostram o logotipo de ângulos diferentes. Clique nas figuras para visualizá-las em um tamanho maior (e também com melhor qualidade).

Download do Código Fonte

Última atualização: 01-Ago-2003

©2003 Célio Flores Siqueira Jr. Home Projeto 1 Projeto 2 Projeto 3