TAREFA 4

Este é o relatório da quarta tarefa da disciplina IA841 - Introdução à Modelagem de Sólidos. Esta atividade consiste em implementar o corpo do teapot e calcular as suas direções e curvaturas principais.


Implementação

O programa foi feito em ANSI C++ e foi utilizada as API OpenGL e GLUT para visualização. Para computar autovalores e autovetores foi usada a biblioteca TNT (Template Numerical Toolkit) disponível em http://math.nist.gov/tnt/index.html.

A implementação consiste em cinco classes: R3, Bezier4, RevolutionSurf, Mesh e GLUTViewer. No arquivo R3.{h} está a classe R3, que define operadores para vetores em 3D. Os arquivos Bezier4.{h, cc} definem uma curva de Bezier com quatro pontos de controle. Nos arquivos RevolutionSurf.{h, cc}, é implementado a revolução de uma curva de Bezier em torno do eixo y e é computado o vetor normal e as direções e curvaturas principais dessa superfície. A classe Mesh contém uma coleção de cinco superfícies de revolução que determinam o corpo do teapot. Esta classe amostra cada superfície de revolução de acordo com os parâmetros n e m dados como entrada do programa, sendo n o número de amostras ao longo de uma curva de Bezier e m o número de pontos ao longo da revolução.

Os pontos amostrados na classe Mesh são armazenados de modo a compor uma matriz em que cada linha indica um ponto da curva de Bezier revoluída e, cada coluna, a curva de Bezier final revoluída. Para visualizar estes pontos, foi utilizada a própria ordenação dos pontos na matriz para determinar uma malha quadrangular, em que cada ponto se conecta com seus quatro pontos vizinhos na matriz de pontos.

Foi implementado sete opções de visualização: wireframe, superfície preenchida, cores indicando curvatura mínima e máxima (em módulo), cores indicando curvatura gaussiana e média e linhas indicando as direções principais e o vetor normal de cada ponto. A classe GLUTviewer utiliza estes métodos de visualização para compor a cena do programa. Assim, a cena contém seis cópias do corpo do teapot com as curvaturas mínima e máxima (em módulo) na primeira linha, o wireframe mais a superfície preenchida e as direções principais na segunda linha, e, na terceira linha, a curvatura gaussiana e média. Note que não foi utilizado nenhum tipo de iluminação .A figura a seguir ilustra a saída do programa.

Direções e curvaturas principais do corpo teapot calculado com n = m = 10.

O programa foi desenvolvido na plataforma UNIX. Para executá-lo, compile-o com o comando "make" e depois use o comando "./main (n) (m)", onde n e m são os números de amostras na curva de Bezier e na revolução, respectivamente.

Para determinar a cor de cada ponto da superfície para cada uma das curvaturas visualizadas (máxima e mínima em módulo e gaussiana e média) foi usado o seguinte procedimento: primeiro, calcula-se o maior e o menor valor de cada uma das curvaturas; segundo monta-se uma escala com valor mínimo na cor azul e valor máximo na cor vermelha, tendo o valor médio com cor verde; então, para cada ponto da superfície, a sua curvatura é interpolada linearmente dentro dessa escala, resultando na cor final do ponto.


Funcionalidades

Para facilitar a visualização, foram implementadas as seguintes funcionalidades com os respectivos atalhos:


Cálculo das curvaturas e direções principais

Como as superfícies deste trabalho são revoluções de curvas de Bezier em torno do eixo y, elas são parametrizáveis por S(u,v) = (P(u).x cos(v), P(u).y, P(u).x sin(v)), sendo P(u) a curva de Bezier de ordem quatro. Usando a teoria vista em aula, computamos as formas fundamentais de primeira (I) e segunda ordem (II) desta superfície e obtemos as curvaturas principais calculando os autovalores da matrix inv(I)II. As direções principais são os autovetores desta matriz multiplicados pela matriz Jacobiana J = [Su Sv].

Fernando Ferrari de Goes