1. Introdução à Computação Gráfica

 

A Computação Gráfica é a área da ciência da computação que estuda a geração, manipulação e interpretação de modelos e imagens de objetos utilizando computador. Tais modelos vêm de uma variedade de disciplinas, como física, matemática, engenharia, arquitetura, etc.

Pode-se subdividir a Computação Gráfica em 3 sub-áreas [PER89]:
Síntese de Imagens: sub-área que se preocupa com a produção de representações visuais a partir das especificações geométrica e visual de seus componentes. É frequentemente confundida com a própria Computação Gráfica. As imagens produzidas por esta sub-área são colocadas nos chamados Display-File.

Processamento de Imagens: envolve as técnicas de transformação de Imagens, em que tanto a imagem original quanto a imagem resultado apresentam-se sob uma representação visual (geralmente matricial). Estas transformações visam melhorar as características visuais da imagem (aumentar contraste, foco, ou mesmo diminuir ruídos e/ou distorções). As imagens produzidas/utilizadas por esta sub-área são colocadas/recuperadas nos chamados Raster-File.

Análise de Imagens: sub-área que procura obter a especificação dos componentes de uma imagem a partir de sua representação visual. Ou seja através da informação pictórica da imagem (a própria imagem!) produz uma informação não pictórica da imagem (por exemplo, as primitivas geométricas elementares que a compõem).

A figura 1.1 apresenta o relacionamento entre as 3 subáreas da Computação Gráfica.

 

Na última década adicionou-se a esse contexto a área de Visualização de Dados, também chamada Visualização Computacional [Min 97][Sch96], que usa técnicas de Computação Gráfica para representar informação, de forma a facilitar o entendimento de conjuntos de dados numéricos de alta complexidade. Exemplos de áreas de aplicação são: visualização de imagens médicas, meteorologia, dados financeiros, visualização de programas, dinâmica dos fluidos, e muitas outras. Nelas, o que existe em comum é que a representação gráfica (superfícies, partículas, ícones) são geradas automaticamente a partir do conjunto de dados. Ao usuário cabe definir parâmetros e atributos da imagem para melhor 'navegar' seu conjunto de dados. Dessa maneira, a visualização de dados partilha de características da síntese, do processamento e da análise de dados.
Atualmente a Computação Gráfica é altamente interativa: o usuário controla o conteúdo, a estrutura e a aparência dos objetos e suas imagens visualizadas na tela, usando dispositivos como o teclado e o mouse. Entretanto, até o início dos anos 80, a computação gráfica era uma disciplina restrita e altamente especializada. Devido principalmente ao alto custo do hardware, poucos programas aplicativos exploravam gráficos. O advento dos computadores pessoais de baixo custo, como o IBM-PC e o Apple Macintosh, com terminais gráficos de varredura (raster graphics displays), popularizou o uso de gráficos na interação usuário-computador.
Os displays gráficos de baixo custo possibilitaram o desenvolvimento de inúmeros aplicativos baratos e fáceis de usar, que dispunham de interfaces gráficas - planilhas, processadores de texto, programas de desenho... As interfaces evoluiram e introduziu-se o conceito de desktop - uma metáfora para uma mesa de trabalho. Nessas interfaces gráficas, através de um gerenciador de janelas (window manager) o usuário pode criar e posicionar janelas que atuam como terminais virtuais, cada qual executando aplicativos independentemente. Isto permite que o usuário execute vários aplicativos simultaneamente, e selecione um deles a um simples toque no mouse. Ícones (icons) são usados para representar arquivos de dados, programas e abstrações de objetos de um escritório - como arquivos, caixas de correio (mailboxes), impressoras, latas de lixo - nas quais são executadas operações análogas às da vida real. Para ativar os programas, o usuário pode selecionar ícones, ou usar buttons e menus dinâmicos. Objetos são manipulados diretamente através de operações de pointing e clicking feitas com o mouse. Atualmente, mesmo aplicativos que manipulam texto (como processadores de texto) ou dados numéricos (como planilhas) usam interfaces desse tipo, reduzindo sensivelmente a interação textual através de teclados alfanuméricos.
A computação gráfica não é mais uma raridade: é parte essencial de qualquer interface com o usuário, é indispensável para a visualização de dados em 2D e 3D e tem aplicações em áreas como educação, ciências, engenharia, medicina, publicidade, lazer, militar, ...
A computação gráfica cuida da síntese de imagens de objetos reais ou imaginários a partir de modelos computacionais. Processamento de imagens é uma área relacionada que trata do processo inverso: a análise de cenas, ou a reconstrução de modelos de objetos 2D ou 3D a partir de suas imagens.
Note que a síntese de imagens parte da descrição de objetos tais como segmentos de reta, polígonos, poliedros, esferas, etc.; e produz uma imagem que atende a certas especificações e que pode, em última instância, ser visualizada em algum dispositivo (terminal de vídeo, plotter, impressora, filme fotográfico...). As imagens em questão constituem uma representação visual de objetos bi- ou tri-dimensionais descritos através de especificações abstratas.
O processamento de imagens parte de imagens já prontas para serem visualizadas, as quais são transferidas para o computador por mecanismos diversos - digitalização de fotos, tomadas de uma câmera de vídeo, ou imagens de satélite - para serem manipuladas visando diferentes objetivos.

1.1 Sistemas Gráficos

A Computação Gráfica (especialmente as partes relativas a gráficos 3D e a gráficos 3D interativos) desenvolveu-se de modo bem diverso: de simples programas gráficos para computadores pessoais à programas de modelagem e de visualização em workstations e supercomputadores. Como o interesse em CG cresceu, é importante escrever aplicações que possam rodar em diferentes plataformas. Um padrão para desenvolvimento de programas gráficos facilita esta tarefa eliminando a necessidade de escrever código para um driver gráfico distinto para cada plataforma na qual a aplicação deve rodar. Para de padronizar a construção de aplicativos que se utilizam de recursos gráficos e torná-los o mais independentes possível de máquinas, e portanto facilmente portáveis, foram desenvolvidos os chamados Sistemas Gráficos.

 

Vários padrões tiveram sucesso integrando domínios específicos. Por exemplo, a linguagem Postscript que se tornou um padrão por facilitar a publicação de documentos estáticos contendo gráficos 2D e textos. Outro exemplo é o sistema XWindow, que se tornou padrão para o desenvolvimento de interfaces gráficas 2D em workstations UNIX. Um programador usa o X para obter uma janela em um display gráfico no qual um texto ou um gráfico 2D pode ser desenhado. A adoção de X pela maioria dos fabricantes de workstation significa que um único programa desenvolvido em X pode ser rodado em uma variedade de workstation simplesmente recompilando o código. Outra facilidade do X é o uso de redes de computadores: um programa pode rodar em uma workstation e ler a entrada e ser exibido em outra workstation, mesmo de outro fabricante.

 

Para gráficos 3D foram propostos vários padrões. A primeira tentativa foi o Sistema Core - Core Graphics System - (1977 e 1979) pelos americanos. Mas a primeira especificação gráfica realmente padronizada foi o GKS - Graphical Kernel System, pela ANSI e ISO em 1985. O GKS é uma versão mais elaborada que o Core. O GKS suporta um conjunto de primitivas gráficas interrelacionadas, tais como: desenho de linhas, polígonos, caracteres, etc., bem como seus atributos. Mas não suporta agrupamentos de primitivas hierárquicas de estruturas 3D. Um sistema relativamente famoso é PHIGS (Programmer’s Hierarchical Interactive Graphics System). Baseado no GKS, PHIGS é um padrão ANSI. PHIGS (e seu descendente, PHIGS+) provêem meios para manipular e desenhar objetos 3D encapsulando descrições de objetos e atributos em uma display list. A display list é utilizada quando o objeto é exibido ou manipulado, uma vantagem é a possibilidade de descrever um objeto complexo uma única vez mesmo exibindo-o várias vezes. Isto é especialmente importante se o objeto a ser exibido deve ser transmitido por uma rede de computadores. Uma desvantagem da display list é a necessidade de um esforço considerável para reespecificar um objeto que está sendo modelado interativamente pelo usuário. Uma desvantagem do PHIGS e PHIGS+ (e GKS) é que eles não têm suporte a recursos avançados como mapeamento de textura.

 

O XWindow ganhou uma extensão para o PHIGS, conhecida como PEX ,de modo que o X pudesse manipular e desenhar objetos 3D. Entre outras extensões, PEX soma modo imediato ao PHIGS, assim um objeto pode ser exibido durante a sua definição sem a necessidade da display list. PEX também não suporta recursos avançados e só está disponível aos usuários do XWindow.

 

Um sistema gráfico que tem se tornado bem popular é o OpenGL (GL - Graphics Library) que provê características avançadas e pode ser utilizador em modo imediato ou com display list. OpenGL é um padrão relativamente novo (sua primeira versão é de 1992) e é baseado na biblioteca GL das workstations IRIS da Silicon Graphics. Atualmente um consórcio de industrias é responsável pela gerenciamento da evolução do OpenGL. Existe uma implementação livre (código fonte disponível) do OpenGL conhecida com MesaGL ou Mesa3D.

 

Como os outros sistemas gráficos, OpenGL oferece uma interface entre o software e o hardware gráfico. A interface consiste em um conjunto de procedimentos e funções que permitem a um programador especificar os objetos e as operações que os envolvem produzindo imagens de alta qualidade. Como o PEX, o OpenGL integra a manipulação de objetos 3D desenho ao X, mas também pode ser integrado em outros sistemas de janela (por exemplo, Windows/NT) ou pode ser usado sem um sistema de janela. OpenGL provê controle direto sobre operações gráficas fundamentais em 3D e 2D. Incluindo a especificação de parâmetros como matrizes de transformação e coeficientes de iluminação, métodos de antialiasing e operações sobre pixels, mas não provê mecanismos para descrever ou modelar objetos geométricos complexos.

 

1.2 Aplicações da CG

A lista de aplicações é enorme, e cresce rapidamente. Uma amostra significativa inclui:

Neste curso, estamos interessados principalmente em técnicas de síntese de imagens bem como seu relacionamento com o processamento de imagens. Também não pretendemos explorar todo o escopo de aplicações da CG, mas estudar os conceitos gerais envolvidos na programação das primitivas gráficas que estão por trás dessas aplicações.

1.3 Hardware Gráfico

Figura 1.2: Sistemas de hardware para computação gráficas.

Um sistema de hardware para computação gráfica consiste essencialmente de dispositivos gráficos de entrada e saída (I/O) ligados a um computador (Fig. 1.2). Ao conjunto de dispositivos de I/O gráficos alocados para utilização por uma única pessoa por vez denomina-se genericamente de "estação de trabalho gráfica", ou graphics workstation. Um sistema gráfico multiusuário pode ter várias estações gráficas, de forma que mais de um dos vários dispositivos de I/O disponíveis podem estar conectados e utilizando o computador hospedeiro. Como na CG é frequente a manipulação de grandes quantidades de dados, o computador deve ser equipado de memória secundária com alta capacidade de armazenagem. Além disso, um canal de comunicação de alta velocidade é necessário para reduzir os tempos de espera. Isto normalmente é feito através de comunicação local sobre um barramento paralelo com velocidade de transmissão de dados da ordem de um milhão de bits por segundo. Se o equipamento gráfico está distante do processador (conexão remota), um canal de comunicação serial pode ser necessário. Transmissão serial assíncrona pode ser feita a velocidades de até 19.2 kbps (milhares de bits por segundo). Mesmo tal velocidade pode ser muito lenta para alguns objetivos como animação gráfica de alta resolução, onde cada frame de imagem pode ter um megabyte de dados. Um sistema de conexão ideal nesse caso é uma Local Area Network (LAN) como a Ethernet.
Os dispositivos de saída gráficos podem ser de natureza digital ou analógica, resultando em duas classes de gráficos, denominados vector graphics (gráficos vetoriais), que desenham figuras traçando sequências de segmentos de reta (vetores); e raster graphics (gráficos de varredura, ou matriciais), que desenham figuras pelo preenchimento de uma matriz de pontos (pixels).

1.4 Resolução Gráfica

Virtualmente todos os dispositivos de I/O gráficos usam uma malha retangular de posições endereçáveis - a qual é denominada "retângulo de visualização" ou "envelope". A "resolução gráfica" de um dispositivo é o número de posições (ou pontos, ou pixels) horizontais e verticais que ele pode distinguir. Existem 4 parâmetros que definem a resolução:
 

1. ndh - o número de posições endereçáveis horizontalmente.
2. ndv - o número de posições endereçáveis verticalmente.
3. width - a largura do retângulo de visualização em mm.
4. height - a altura do retângulo de visualização em mm.

A partir desses 4 parâmetros, vários números interessantes podem ser calculados:

1. resolução horizontal: horiz_res:= ndh/width
2. tamanho ponto horizontal: horiz_dot_size:= width/ndh
3. resolução vertical: vert_res:= ndv/height
4. tamanho ponto vertical: vert_dot_size:= height/ndv
5. total pontos endereçáveis: total_nr_dots:= ndh*ndv
6. resolução de área: area_res:= total_nr_dots/(width*height)
7. razão de aspecto gráfica: aspect_ratio:= vert_dot_size/horiz_dot_size
8. razão de aspecto física: physical_aspect_ratio:= height/width

Obs:

  1. Note que horiz_res, vert_res e area_res definem resoluções físicas, enquanto que ndh, ndv e total_nr_dots definem resoluções gráficas. Dispositivos de visualização podem ter a mesma resolução gráfica, com resoluções físicas muito diferentes.

    O ideal seria ter um aspect ratio igual ou próximo de 1.

1.5 Sistemas de Coordenadas

Na CG é necessário definir sistemas de coordenadas para quantificar os dados sendo manipulados. Já vimos que os dispositivos de visualização gráfica matriciais consistem de uma matriz de pixels endereçáveis, e um gráfico é formado "acendendo" ou "apagando" um pixel. Os pixels são endereçados por dois números inteiros que dão suas coordenadas horizontal e vertical, dcx, e dcy, respectivamente, onde:

Eq.(1.1)

 

Na matriz de pixels, o valor dcx+1 dá o número da coluna, e dcy+1 dá o número da linha do pixel endereçado. O pixel endereçado como (0,0) está geralmente no canto inferior esquerdo do retângulo de visualização. As coordenadas (dcx,dcy) são chamadas de coordenadas do dispositivo, e podem assumir apenas valores inteiros.
Coordenadas do dispositivo podem variar bastante para diferentes equipamentos, o que levou à utilização de coordenadas normalizadas do dispositivo (NDC - normalized device coordinates), para efeito de padronização (ndcx,ndcy). NDCs são variáveis reais, geralmente definidas no intervalo de 0 a 1:

Eq. (1.2)

 

A coordenada NDC (0,0) corresponde à origem (0,0) nas cordenadas do dispositivo, e a coordenada NDC (1,1) refere-se ao pixel no canto superior direito, que corresponde ao pixel (ndhm1,ndvm1) nas coordenadas do dispositivo.
A vantagem da utilização de NDCs é que padrões gráficos podem ser discutidos usando um sistema de coordenadas independente de dispositivos gráficos específicos. Obviamente, os dados gráficos precisam ser transformados do sistema de coordenadas independente para o sistema de coordenadas do dispositivo no momento de visualização. O mapeamento de NDCs (reais) para coordenadas do dispositivo (inteiros) é "linear", por exemplo:

Eq. (1.3)

 

Dois outros sistemas de coordenadas são úteis. O primeiro é o sistema de cordenadas físico, (pcx,pcy) onde pcx é a distância física ao longo do eixo x a partir do extremo esquerdo do retângulo de visualização, e pcy é a distância física ao longo do eixo y a partir do extremo inferior. As unidades de medida utilizadas são polegadas ou milímetros. A transformação de coordenadas físicas para coordenadas do dispositivo é dada por:

Eq. (1.4)

 

O segundo é o sistema de coordenadas do mundo, ou sistema de coordenadas do usuário, que consiste de coordenadas cartesianas (x,y), num intervalo qualquer definido pelo usuário:

Eq. (1.5)

Os parâmetros que definem o intervalo de valores de x e y, xmin, ymin, xmax e ymax, definem uma área retangular no espaço bidimensional, denominada de janela. A transformação de coordenadas do usuário (x,y) para NDCs (ndcx,ndcy), denominada transformação de visualização, é dada por:

Eq. (1.6)

Para visualizar dados num dispositivo gráfico qualquer, é necessário transformá-los das coordenadas do usuário para NDCs, e de NDCs para coorde-nadas do dispositivo. Da mesma forma, dados de entrada gráficos precisam ser transformados de coordenadas do dispositivo para NDCs, e depois para coordenadas do usuário (Fig. 1.3).

 

Figura 1.3: Sistemas de coordenadas e suas transformações.

1.6 Exercícios

1. Escreva os procedimentos "inp_to_ndc", "ndc_to_user", "user_to_ndc" e "ndc_to_user", que transformam dados entre os vários sistemas de coordenadas, conforme ilustrado na Fig. 1.2. Repita o exercício assumindo que o intervalo de variação do sistema NDC vai de:
(i) -1 a +1 (coordenadas normalizadas centradas)
(ii) 0 a 100


 

1.7 Bibliografia

[FOL90] Foley, James D. et al : Computer Graphics - Principles and Practice, Addison-Wesley Publishing Company, 1990.

[MIN97] Minghim, R; Oliveira, M. C. F. Uma Introdução à Visualização Computacional XVI JAI’97, Jornadas de Atualização em Informática, XVII Congresso da SBC, Brasília, agosto de 1997, Cap. 3, pp. 85-131.

[PER89] Persiano, R.C.M.; Oliveira, A.A.F. :Introdução à Computação Gráfica, Livros Técnicos e Científicos Editora Ltda., 1989.

[SCH96] Schröeder, W.J.; Martin, K.; Lorensen, W. - The Visualization Toolkit - An Object-Oriented Approach to 3D Graphics, Prentice-Hall, 1996.

[SEG98] Segal, M.; Akeley, K. - The OpenGL Graphics Interface; SIGGRAPH’98 Course Notes.

[Woo97] Woo, M.; Neider, J.; Davis, T.; - OpenGL Programming Guide. Second Edition, Addison Wesley, 1997.