MESTRADO EM CIÊNCIAS DA COMPUTAÇÃO COMPUTAÇÃO GRÁFICA PROF A. CARLA FREITAS SISTEMA DE MODELAGEM DE SÓLIDOS POR SWEEP ROTACIONAL RELATÓRIO - PDF
Download "MESTRADO EM CIÊNCIAS DA COMPUTAÇÃO COMPUTAÇÃO GRÁFICA PROF A. CARLA FREITAS SISTEMA DE MODELAGEM DE SÓLIDOS POR SWEEP ROTACIONAL RELATÓRIO"
Diogo Rijo Farias
1 UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL UFRGS CENTRO DE PÓS-GRADUAÇÃO EM CIÊNCIAS DA COMPUTAÇÃO CPGCC UNIVERSIDADE DA REGIÃO DA CAMPANHA URCAMP CENTRO DE CIÊNCIAS DA ECONOMIA E INFORMÁTICA CCEI MESTRADO EM CIÊNCIAS DA COMPUTAÇÃO COMPUTAÇÃO GRÁFICA PROF A. CARLA FREITAS SISTEMA DE MODELAGEM DE SÓLIDOS POR SWEEP ROTACIONAL RELATÓRIO ALEXSANDER DA ROSA JAN/FEV 1999
2 SUMÁRIO SUMÁRIO INTRODUÇÃO REQUISITOS DO SISTEMA FUNCIONAMENTO CRIANDO UM POLÍGONO GERANDO UM SÓLIDO VISUALIZANDO UM SÓLIDO EXPORTANDO UM OBJETO FORMATOS DE ARQUIVO ARQUIVOS DE POLÍGONOS FORMATO ASCII (3D STUDIO) IMPLEMENTAÇÃO ESTRUTURAS DE DADOS ALGORITMO DE GERAÇÃO DO SÓLIDO Geração da lista de vértices 3D Geração da lista de arestas Geração da lista de faces VISUALIZAÇÃO WIRE-FRAME REFERÊNCIAS BIBLIOGRÁFICAS
3 1. INTRODUÇÃO O objetivo do trabalho foi implementar um Sistema de Modelagem de Sólidos por Sweep Rotacional. O sweep (arrasto) de 360º será aplicado sobre um polígono (caso em que será gerado um sólido vazado ) ou sobre um perfil (caso em que o sólido será sem orifícios) ao longo de uma linha reta [WATT93]. O único parâmetro a ser fornecido é a variação do ângulo (em graus) (Fig. 1). O resultado será mostrado em uma representação wire-frame e pode ser exportado para o formato ASC. Figura 1: Menu de opções O ângulo deve ser um número inteiro, e um divisor inteiro de 360. Caso o valor fornecido não seja divisor inteiro de 360, o sistema utilizará o valor mais próximo e maior que o número fornecido, até o máximo de 120. As demais opções não se aplicam diretamente à geração do objeto, e são explicadas adiante neste documento Requisitos do sistema O sistema foi desenvolvido para o ambiente Microsoft Windows 9x (32 bits), e ocupa menos de 500 Kb no disco rígido. As necessidades de memória RAM também são modestas, e um sistema com 8 Mb de memória é suficiente. Não é necessário nenhum processo de instalação, bastando copiar o programa para o local desejado. Para a renderização dos modelos gerados, o software 3D Studio Release 4 pode ser utilizado. O sistema possui ainda recursos para melhorar a integração com o 3D Studio R4, permitindo fazer smoothing de triângulos e colocar um spot light (Fig. 1). 3
4 2. FUNCIONAMENTO O primeiro passo é fornecer um polígono gerador [FOLE96] para o sistema. Isso pode ser feito de duas maneiras distintas: i) desenhando-o diretamente na tela utilizando o mouse ou ii) carregando-o a partir de um arquivo previamente gravado pelo próprio sistema, em um formato texto. A especificação do formato está no item 4. Para carregar o polígono de um arquivo o usuário deve selecionar a opção Open do menu File. Os arquivos são gravados com a extensão.pgn (de polígono) Criando um polígono Caso o usuário decida por criar um polígono, deve clicar na opção New do menu File. Após isto, basta movimentar o mouse e clicar com o botão esquerdo nos locais onde devem ficar os vértices (Fig. 2). Para auxiliar nesta tarefa pode-se visualizar as coordenadas X,Y do mouse, clicando na opção Show mouse coordinates do menu Edit. Além disso, a opção de rubberband pode ser ativada no menu Options (Fig. 1). Figura 2: Criação de um polígono com o mouse Para poder gerar o sólido, é necessário que o polígono esteja fechado. Isto serve para evitar a criação de objetos não-sólidos, ou seja, que não delimitem um volume fechado no espaço [FOLE96]. O termo fechado aparece entre aspas porque é possível gerar um sólido por sweep a partir de um polígono aberto, desde que ambas as extremidades estejam exatamente sobre o eixo de rotação. Um detalhe importante é que o eixo ao redor do qual o polígono será rotacionado é o eixo Y, que corresponde à borda esquerda da janela. Além disso, o polígono deve ser desenhado tendo-se em consideração que na tela o eixo Y aponta para 4
5 baixo, mas no universo aponta para cima. Isto causa uma inversão no objeto (o sólido resultante aparenta estar de cabeça para baixo). Caso o polígono gerador seja fechado (tendo suas extremidades unidas), o sólido resultante terá um orifício (como por exemplo um torus). Ambas as possibilidades são contempladas pelo sistema, sendo a primeira chamada Close polygon (no hole) e a segunda Close polygon (with hole). Ambas estão no menu Edit. A primeira cria vértices extras para que as extremidades coincidam com o eixo de rotação, e a segunda une o último vértice ao primeiro (copiando o primeiro vértice) Gerando um sólido Após fechar o polígono, o usuário já pode gerar o sólido. Para tanto, basta selecionar a opção Generate do menu Sweep. Caso necessário, podem ser modificadas as opções default, acionando a tela Options no mesmo menu. A variação do ângulo pode ir de 2 a 120 graus, sempre variando em números inteiros e em graus Visualizando um sólido Para efeito de visualização, as faces mostradas são, em sua maioria, retangulares. As faces do topo e da base, em polígonos fechados com a opção no hole, são triangulares. No entanto, quando o sólido é exportado para o 3D Studio, as faces são todas triangularizadas, ou seja, subdivididas em triângulos. Figura 3: Visualização wire-frame do objeto gerado A opção 3D View do menu Sweep permite ao usuário ver em uma representação wire-frame o objeto gerado. É possível ter algum controle ainda que limitado sobre as dimensões da window (zoom in e zoom out), através do menu View da tela de 5
6 visualização do objeto (Fig. 3). As dimensões da viewport podem ser modificadas usando o próprio sistema de janelas do Windows, ou com o mouse. Durante a visualização, a câmera permanece fixa, em posição calculada pelo sistema, de modo a apontar para o centro do objeto a partir de uma posição superior em relação ao eixo Y. As coordenadas de localização e direção da câmera são indicadas na barra de status da janela 3D View (Fig. 3) Exportando um objeto O sólido gerado pode ser salvo em disco (Fig. 4), e até mesmo exportado para outros sistemas de visualização. A opção Save polygon do menu File realiza esta operação, salvando o polígono para uso posterior. Para exportar objetos, a opção Save 3D object salva nos formatos Cam3D 1 (.3DO) e 3D Studio ASCII File (.ASC). Figura 4: Exportando um objeto para o 3D Studio Quando o sistema salva um objeto no formato ASC, ele pode acrescentar uma fonte de luz (spot light) à cena e ainda pode suavizar os triângulos (smoothing). Para isto basta marcar as opções correspondentes no menu Options (Fig. 1). 1 Cam3D é um software de visualização (câmera) criado pelo autor. 6
7 3. FORMATOS DE ARQUIVO 3.1. Arquivos de polígonos Os polígonos são salvos em um arquivo texto (.PGN), contendo apenas duas áreas de dados. A primeira, que ocupa uma linha, é o número de vértices do polígono. A segunda parte ocupa todo o resto do arquivo e contém as coordenadas X e Y de cada vértice, uma em cada linha. Segue um exemplo (incluído com o sistema) contendo o polígono que gera um vaso (VASO.PGN): Figura 5: Arquivo de polígono (VASO.PGN) O polígono em questão possui portanto 27 vértices. O último vértice é igual ao penúltimo, indicando que este polígono foi fechado com a opção no hole. Quando o polígono for do tipo que gera sólidos com orifícios, o último vértice é igual ao primeiro. O último vértice (de fechamento) é descartado quando o sólido é gerado Formato ASCII (3D Studio) O formato ASCII é o formato utilizado pelo 3D Studio Release 4. Consiste de um arquivo texto que pode conter vários objetos em um único arquivo. Existem opções do formato que não são utilizadas pelo sistema, como por exemplo o mapeamento (mapping), que permite mapear uma textura (bitmap) sobre um objeto qualquer (acrescentando coordenadas U e V da textura para cada vértice); ou ainda a indicação de visibilidade de cada aresta de cada face, para facilitar a remoção de elementos ocultos pelo programa de visualização. 7
8 Um arquivo no formato ASCII (.ASC) contém três áreas básicas: o cabeçalho, que contém as informações gerais sobre o objeto, como nome, número de vértices e de faces; a lista de vértices, que contém as coordenadas X, Y e Z de cada vértice (Fig. 6); e a lista de faces, que contém os números dos vértices que compõem cada face. Named object: "SETA" Tri-Mesh, Vertices: 144 Faces: 288 Vertex list: Vertex 0: X: Y: Z: Vertex 1: X: Y: Z: Vertex 2: X: Y: Z: (...) Figura 6. Cabeçalho e trecho do arquivo ASCII (SETA.ASC) A lista de faces pode ainda conter informações de smoothing (Fig. 7), e neste caso a palavra Smoothing fica na linha seguinte à face na qual ela se aplica. Quando não houver smoothing, as faces ficam em linhas consecutivas. (...) Vertex 142: X: Y: Z: Vertex 143: X: Y: Z: Face list: Face 0: A: 0 B: 1 C: 5 Face 1: A: 0 B: 5 C: 4 Face 2: A: 1 B: 2 C: 6 (...) Figura 7: Trecho da lista de faces do arquivo ASCII (SETA.ASC) Caso seja incluída uma fonte de luz no modelo, algumas linhas extras são incluídas ao final do arquivo (Fig. 8). O sistema permite a inclusão de uma luz direcional (spot light) num local um pouco acima do objeto (não configurável). (...) Named object: "Light01" Direct light Position: X: Y: Z: Spotlight to: X: Y: Z: Hotspot size: 44 degrees Falloff size: 45 degrees Light color: Red=0.8 Green=0.8 Blue=0.8 Figura 8: Final do arquivo ASCII (VASO3.ASC) Quando houver a intenção de concatenar arquivos gerados pelo sistema, é interessante que no máximo um deles contenha luz, pois como todas as luzes são geradas com o mesmo nome, se houver mais de uma luz elas serão sobrepostas. 8
9 Figura 9: Imagem renderizada pelo 3D Studio R4 a partir de modelo gerado e exportado pelo sistema (VASO.ASC) É interessante notar que o 3D Studio normalmente carregas as imagens de lado, e uma rotação de cerca de 90º no eixo X pode ser necessária. Apesar disso, excelentes imagens podem ser renderizadas a partir de modelos gerados pelo sistema (Fig. 9). O formato ASCII tem ainda a vantagem de ser largamente conhecido e importado por diversos sistemas de renderização e visualização. 9
10 4. IMPLEMENTAÇÃO O programa foi totalmente escrito em Delphi 4/Object Pascal. Algumas funções foram extraídas e convertidas de programas em C/C++ criados pelo próprio autor. A função de recorte de retas foi adaptada de [FOLE96], e as demais implementadas a partir de anotações de aula e de [FOLE96] e [WATT93]. Os arquivos exportados em formato ASCII foram testados no 3D Studio R4 da Autodesk, Inc. e apresentaram excelente desempenho Estruturas de dados As quatro principais estruturas de dados do sistema (Lista de Vértices 2D, Lista de Vértices 3D, Lista de Arestas e Lista de Faces) foram implementadas com vetores. Apesar de terem sido definidos com um tamanho considerável, apresentam a limitação de número máximo de vértices, que pode ser contornada com a substituição da estrutura Algoritmo de geração do sólido O principal algoritmo do programa é o que foi implementado como geração do sólido (opção Generate do menu Sweep). Ele se divide em três partes distintas: i) criação da lista de vértices no espaço tridimensional; ii) criação da lista de arestas (para uso na visualização em wire-frame); e iii) criação da lista de faces triangulares Geração da lista de vértices 3D A primeira parte realiza a rotação de todos os pontos do polígono gerador ao redor do eixo Y (do SRU 3D). Os cálculos efetuados para um vértice tridimensional são: x := cos(rads)*raio; y := Vert2d[i].y; z := sin(rads)*raio; Onde rads é o ângulo convertido para radianos, raio é a distância do ponto ao eixo e o vetor Vert2d contém os vértices do polígono gerador Geração da lista de arestas A segunda parte do algoritmo de geração de sólido cria a lista de arestas. Cada vértice 3D gera 2 arestas, uma no sentido da seção (ao longo do polígono gerador) e outra no sentido do sweep (ao longo da rotação ao redor do eixo). No sentido da seção, um vértice V[i] geralmente liga-se ao vértice V[i+1]. Quando estiver no último vértice da seção, no entanto, ele deve ligar-se ao primeiro. Supondo ser n o número de vértices do polígono gerador. No sentido da rotação, um vértice V[i] liga-se a V[i+n], exceto quando estiver na última seção, caso em que ele se liga ao vértice V[i mod n], onde a operação mod retorna o resto da divisão inteira Geração da lista de faces A parte final do algoritmo é a mais complexa. Ela precisa levar em conta a ordem (sentido horário ou anti-horário) dos vértices na face para não comprometer as 10
11 normais das superfícies e fazer a triangularização das faces (que podem ser retangulares). Cada vértice 3D gera duas faces triangulares. Cada face pode (ou não) estar no final da seção, e pode (ou não) estar no final da rotação. Assim, 2 3 combinações podem surgir, e para cada uma delas pode ser necessário utilizar uma fórmula diferente. Uma vez que as faces são triangulares, é necessário saber os índices dos três vértices que a compõe. Para tanto foi utilizada a nomenclatura a, b e c. Supondo ser n o número de vértices do polígono gerador e p o índice do primeiro vértice da seção atual, temos que para um determinado vértice V[i], os extremos de uma de suas faces é: a := i; b := i+1; c := i+n+1; Estas fórmulas contemplam apenas a hipótese mais confortável, onde o vértice não se encontra nem no final da seção nem no final do sweep. Caso ele não esteja no final da seção, mas no final do sweep, temos c := i mod n. Se ele estiver no fim da seção mas não no fim do sweep, temos b := p e c := p+n. Se ele estiver no fim da seção e no fim do sweep, as fórmulas seriam b := p e c := 0. Isto completa as combinações para a primeira face, e outros quatro conjuntos de fórmulas são necessários para a segunda face: a := i; b := i+n+1; c := i+n; Outra vez, as fórmulas são apenas para a melhor hipótese. Se o vértice estiver apenas no fim da seção, temos b := p+n e c := i + n. Se ele estiver apenas no fim do sweep, temos b := (i mod n)+1 e c := i mod n. Se o vértice estiver em ambos os casos, as fórmulas ficam b := 0 e c := n-1. Caso o polígono gerador tenha sido fechado com a opção no hole, algumas faces extras e não visíveis podem ser criadas, sem alterar de forma significativa o sólido gerado Visualização wire-frame O sistema permite visualizar uma representação wire-frame do sólido gerado. Esta visualização tem apenas caráter ilustrativo, e apresenta as faces com quatro vértices. Como ela é realizada em cima da lista de arestas, não é possível realizar a remoção de superfícies ocultas. O sistema calcula uma posição para a câmera em função dos valores limite das coordenadas do sólido, evitando que a câmera fique dentro do mesmo. 11
12 5. REFERÊNCIAS BIBLIOGRÁFICAS [FOLE96] Foley, James D., van Dam, Andries, Feiner, Steven K. and Hughes, John F., Computer Graphics: Principles and Practice, second edition in C. Addison- Wesley, [WATT93] Watt, Alan, 3D Computer Graphics, second edition. Addison-Wesley,