Material de Auxílio Didático

EA978 - Sistemas de informações gráficas

Primeiro semestre de 2003

DCA/FEEC/Unicamp


Projetos

A avaliação da parte prática da disciplina será feita sobre três projetos constituídos de uma série de tarefas de implementação de programas em OpenGL. Os resultados dos projetos deverão ser sintetizados em páginas em formato HTML contendo o código-fonte dos programas, fluxograma, explicação dos programas e imagens.

A maioria das tarefas são acompanhadas por um esqueleto de código em C e GLUT que facilita a implementação da atividade. Algumas tarefas também são acompanhadas por demonstrações didáticas constituídas de programas em OpenGL ou tutoriais que visam auxiliar o aluno no aprendizado do OpenGL para a execução das tarefas. Entretanto, para a compreensão desses programas é indispensável a leitura do OpenGL Programming Guide, do GLUT Specification e do GLU Specification. A versão impressa do OpenGL Programming Guide pode ser encontrada na biblioteca do IMECC ou na BAE.

Uma vez que o Mesa foi instalado, a compilação dos arquivos em C é muito simples. Em Linux basta construir um arquivo makefile apropriado para os arquivos-fonte e digitar "make" na linha de comando. Um exemplo simples de arquivo makefile para um arquivo fonte hipotético de nome "meu_prog" é mostrado a seguir.

MESA = /softs/Mesa-5.0         # Diretório onde o Mesa foi instalado
INCPATH = -I$(MESA)/include
LIBPATH = -L$(MESA)/lib
LIBS    = -lglut -lGLU -lGL -lm
CFLAGS  = $(INCPATH) -g
LFLAGS  = $(LIBPATH) $(LIBS)

# Main target
meu_prog: meu_prog.o
      gcc -o meu_prog meu_prog.o $(LFLAGS)

# Source target
meu_prog.o: meu_prog.c
      gcc -c meu_prog.c $(CFLAGS)

Em Windows, uma forma igualmente simples de compilar programas OpenGL é criando um projeto no Visual C++. O projeto deve ser do tipo Win32 Console. O usuário também deve incluir as bibliotecas MesaGL.lib, MesaGLU.lib, MesaGLUT.lib e osmesa.lib no projeto. Isso é feito acessando o menu Project/Settings, em seguida acessando o diálogo de opções Link e escrevendo o nome dessas bibliotecas no campo Object/library modules utilizando um espaço para separar cada nome.

1o Projeto

O primeiro projeto consiste em modelar os objetos de uma cena utilizando somente as funções do OpenGL e organizá-los de forma semelhante à cena mostrada na figura abaixo. A cena é composta por uma mesa, duas cadeiras, um vaso, um cálice e uma luminária. Todos esses objetos podem ser construídos através de comandos da GLUT tais como as funções glutWireCube() e glutWireTorus(), bem como através das funções de geração de quádricas da GLU e também das primitivas do próprio OpenGL (GL_QUADS, GL_TRIANGLES, etc). O uso de superfícies de Bézier também é explorado na modelagem do estofamento das cadeiras. Este projeto também compreende a definição da iluminação da cena (uma luz pontual acima da mesa e uma luz spot na luminária), a configuração das propriedades dos materiais e a escolha do método de tonalização.


Cena em wireframe.

Não é necessário reproduzir fielmente a cena sugerida na figura acima. Outras técnicas poderão ser exploradas de acordo com a criatividade do aluno para produzir, por exemplo, uma cena mais elaborada e com objetos dispostos de maneira diferente. Entretanto, a cena deve conter pelo menos os objetos sugeridos. Além disso, superfícies de Bézier devem ser utilizadas pelo menos no estofamento das cadeiras.

A série de atividades a seguir descreve como cada objeto pode ser construído e como a cena é gradativamente montada e melhorada.

  1. Modelagem Geométrica - Modelagem dos objetos da cena usando as primitivas do OpenGL.
  2. Transformações Geométricas - Composição da cena composta pelos objetos da atividade anterior.
  3. Transformações Perspectivas e Projeções - Visualização da cena construída em três diferentes pontos de vista.
  4. Calibração de Câmera - obter parâmetros da câmera através de um conjunto de correspondências de pontos conhecidas.
  5. Iluminação - Visualizar da cena com polígonos preenchidos, com iluminação de uma fonte de luz pontual, fonte de luz spot (spotlight), tonalização constante, tonalização Gouraud e definção das propriedades dos materiais.

2o Projeto

O segundo projeto consiste em utilizar conceitos de processamento de imagens para filtrar a imagem sintética em tons de cinza da cena gerada no primeiro projeto. O método de convolução através do buffer de acumulação do OpenGL é introduzido como uma alternativa para a filtragem da imagem. Nesse projeto também são explorados conceitos de quantização de luminância pelos método de limiarização, dithering aleatório, dithering ordenado e difusão de erro. Por fim, a imagem é processada por um algoritmo simples de warping.


Imagem processada pelo filtro de Sobel.

  1. Quantização - Quantizar em dois tons (preto e branco) uma imagem em tons de cinza da cena do primeiro projeto usando a técnica de limiarização, dithering aleatório, dithering ordenado e difusão de erros.
  2. Processamento de Imagens - Aplicação de um filtro de suavização sobre uma imagem da cena wireframe gerada no projeto anterior e detecção de bordas da imagem usando filtros por derivadas.
  3. Warping - Deformação de uma imagem da cena do primeiro projeto usando o algoritmo de warping dado e descrever o funcionamento desse algoritmo.

3o Projeto

O terceiro projeto consiste em definir as cores e texturas dos objetos e realizar conversão entre modelos de cores. Na cena visualizada abaixo, uma textura sintética (xadrez) foi aplicada no chão e no tampo da mesa já definidas com cores.


Cena texturizada e com cores.

  1. Cores - Modificação das propriedades dos materiais e das fontes de luz da cena do primeiro projeto de modo a incluir cores no ambiente, geração de imagens de cada componente de cor RGB separadamente e conversão entre o modelo de cor RGB para o modelo HSV, YIQ e XYZ.
  2. Textura - Aplicação de texturas aos objetos da cena colorida produzida nas atividade anterior.

Autor: Harlen Costa Batagelo (harlen@dca.fee.unicamp.br)