Introdução

A Computação Gráfica acompanha a evolução dos computadores na sociedade e, como eles, ela também teve um começo elitista, restrito a poucos lugares no mundo.  Poucas atividades eram merecedoras do investimento que os computadores e os equipamentos de Computação Gráfica demandavam. Hoje, com a popularização dos computadores e dos dispositivos gráficos, a Computação Gráfica está amplamente disseminada.

 

Se observarmos a difusão dos computadores, vemos que a Computação Gráfica tem tido um papel decisivo nela.  As interfaces gráficas na forma de janelas, botões, menus e dispositivos de seleção(Estas interfaces, denominadas WIMP para windows, icons, menus and pointer devices¸apareceram na Xerox e se popularizaram com as diversas versões do sistema operacional Windows da MicroSoft), por exemplo, foram muito importantes para a popularização dos computadores pessoais na década de 1980.  Dificilmente esta difusão dos computadores teria ocorrido não fossem estas interfaces gráficas. Atualmente as câmeras digitais acopladas a computadores portáteis de mão e a telefones móveis ainda estão impulsionando novos usos da informática no nosso dia-a-dia.

 

Áreas da CG

A área de entretenimento, com os jogos eletrônicos e os efeitos especiais do cinema digital, é provavelmente a face mais conhecida e sedutora da Computação Gráfica para o público em geral.  A Computação Gráfica, entretanto, não se restringe ela.  Ela está presente nas atividades de projeto e construção de carros, casas e plantas industriais. A Fig. 1.1 ilustra um modelo de uma plataforma marítima de petróleo, acrescida de efeitos artísticos para divulgação.

 

Fig. 1.1 – Modelo de uma plataforma marítima de petróleo

 

Outras aplicações importantes podem ser encontradas nas áreas de imagens médicas, cirurgia com realidade aumentada, supervisão e controle, e simulação em Engenharia, Geologia e Sísmica, entre muitas outras.  Uma boa maneira de estudarmos uma área tão ampla como a Computação Gráfica consiste em dividi-la de forma a compreender suas partes e a estrutura do todo.

Inicialmente a Computação Gráfica foi dividida em três grandes áreas: síntese de imagens (rendering), processamento de imagens e visão computacional.  Estas áreas foram categorizadas em função da entrada e saída dos seus algoritmos, como ilustra a Fig. 1.2.

 

Síntese de imagens (rendering)

 

Os algoritmos de síntese de imagens produzem imagens digitais a partir de dados e modelos computacionais de objetos, luzes e câmera.  De certa forma são as máquinas fotográficas do mundo virtual: eles tiram fotos dos objetos que estão lá. A Fig. 1.3 mostra, por exemplo, uma imagem de uma mesa de sinuca tirada de uma implementação do trabalho proposto no capítulo sobre Rastreamento de Raios.

Fig. 1.3 – Imagem produzida pelo algoritmo de Rastreamento de Raios

 

Os algoritmos de síntese de imagens são fundamentais para os sistemas de Realidade Virtual.  A Fig. 1.4 ilustra um destes sistemas, no qual o modelo de uma plataforma marítima está sendo examinado com o auxílio de óculos que permitem que cada um dos olhos receba uma imagem correspondente à sua posição, reproduzindo o efeito de estereoscopia e criando uma sensação de imersão no mundo virtual. 

Fig. 1.4 – Síntese de imagens

O objetivo dos algoritmos de síntese de imagens pode ser o realismo visual, como ilustra a Fig. 1.4, ou a transmissão de  informações técnicas, como mostram as visualizações científicas da Fig. 1.5.   Nesta figura, os programas de (a) geotecnia, (b) engenharia de reservatórios, (c) cartografia, (d) estruturas navais, (e) sísmica e (f) medicina têm fortes requisitos de precisão geométrica mas tratam de objetos abstratos que fogem à experiência

visual de pessoas leigas.  

 

Processamento de imagens

 

Os algoritmos de processamento de imagens modificam uma imagem para melhorar sua qualidade, eliminando ruídos e realçando características que facilitem o seu entendimento. Estes algoritmos não mudam a natureza dos dados, ou seja, eles processam imagens de entrada e geram imagens de saída.   A Fig. 1.6 ilustra a este processamento sobre uma imagem médica de um cérebro humano.  O objetivo do processamento ilustrado consiste

em realçar as regiões do cérebro para torná-las mais visíveis. 

 

Visão computacional

 

A visão computacional processa imagens visando obter informações sobre objetos presentes nelas.  Ou seja, interpretam o que está na imagem extraindo dela informações não puramente visuais.   A Fig. 1.7 ilustra, por exemplo, um algoritmo capaz de “ler” o número de uma placa de automóvel a partir de uma imagem dela.

 

Realidade aumentada

 

As aplicações mais recentes da Computação Gráfica não se encaixam em apenas uma das classes de algoritmos apresentada acima: síntese, processamento e visão.  Os sistemas de realidade aumentada, que misturam elementos virtuais em imagens reais, são os exemplos mais marcantes desta nova classe de aplicações da Computação Gráfica.  A Fig. 1.8 mostra, no lado esquerdo, um jogo da velha no qual o computador “vê” onde o usuário riscou o jogo e as suas jogadas e responde  colocando na tela a imagem da câmera acrescida de objetos virtuais. 

 

 

O programa da Fig. 1.8 tem três fases. Na primeira o programa captura cada quadro da câmera de vídeo, processa as imagens para reduzir os ruídos e realça as linhas da figura, obtendo a imagem mostrada do lado direito da Fig. 1.8.  Ou seja, é uma fase de processamento de imagens.

Na segunda fase, o programa reconhece onde está a câmera e quais são seus parâmetros com base na deformação da moldura preta que envolve a área onde o jogo ocorre. Reconhece também onde estão as linhas do jogo e as jogadas do usuário.  É uma fase típica de visão computacional.

Finalmente o computador sintetiza novos elementos na cena: as peças do jogo, as marcas dos cantos que fazem parte do algoritmo de visão e o bule de chá, que não tem nada a ver com o contexto do jogo.  É uma fase de síntese de imagens.

A Fig. 1.9 ilustra outro programa de realidade aumentada que serve para acompanhar jogos de esportivos de campo ou quadra.  Na fase de processamento de imagens, o sistema descobre onde estão as linhas do campo.  Na fase de visão o sistema acha as equações destas linhas e a partir delas encontra o modelo de uma câmera que as “vê” daquela forma distorcida.  Na última fase, de síntese, o sistema acrescenta elementos na imagem para torná-la mas clara.  Na imagem do lado direito da Fig. 1.9(a) o sistema realça a linhas de campo e a trave para ilustrar a precisão com que ele está capturando estes objetos.  Na Fig. 1.9(b) vemos uma verificação de impedimento com marcação das linhas de profundidade dos jogadores mais importantes na jogada.

 

Concluindo esta seção. devemos dizer que a divisão da Computação Gráfica ilustrada na Fig. 1.2 ainda persiste, mas é cada vez mais comum encontrarmos programas que não se encaixam em apenas uma destas áreas.  Uma divisão mais atual seria a ilustrada na Fig. 1.10, que introduz a área de Realidade Aumentada nas áreas clássicas da Computação Gráfica.

 

Requisitos de realismo e de eficiência

 

Uma outra divisão importante da Computação Gráfica diz respeito aos requisitos de realismo e eficiência que o programa deve ter.  Na produção de filmes, por exemplo, é comum utilizarmos grades de computadores trabalhando por longos períodos para gerarcada um dos quadros de uma animação. O importante nesta tarefa é a qualidade da imagem gerada.  O tempo um é fator menos crítico.  Programas que produzem vídeos e filmes são

geralmente baseados no algoritmo de Rastreamento de Raios, que apesar de não ter baixa eficiência produz imagens bastante realistas.

Em contrapartida à produção de filmes, temos os jogos de computador e os programas de Realidade Virtual, nos quais o usuário controla interativamente o que ele está vendo.  A Fig. 1.4 ilustra o uso de um mouse 3D para controlar o “vôo” do usuário no modelo da plataforma.  Programas como estes precisam gerar as imagens num tempo muito pequeno para que não se quebre a sensação de imersão do usuário no mundo virtual.  Estes

programas normalmente utilizam Sistemas Gráficos, como o OpenGL™, que são baseados no algoritmo de Mapa de Profundidades (ZBuffer).  Este algoritmo é bem mais eficiente que o algoritmo de Rastreamento de Raios mas produz resultados com menor realismo visual.

Estas duas linhas de algoritmos são importantes na Computação Gráfica e serão tratadas neste livro.  É interessante notarmos que cada um destes algoritmos tem evoluído de forma a superar suas deficiências.  O algoritmo de Rastreamento de Raios já tem implementações eficientes e os jogos de computador conseguem imagens bastante realistas.   A Fig. 1.11 mostra uma imagem de um modelo de uma plataforma gerada por um programa interativo feito com o OpenGL tm que utiliza o algoritmo de Mapa de Profundidades.  Se compararmos

a qualidade desta imagem com a mostrada na Fig. 1.1, obtida por um programa que utiliza o Rastreamento de Raios, vemos que não são tão diferentes.

 

Os jogos de computador também produzem imagens muito boas, mas quando o programa não está respondendo a eventos do usuário e exibe uma animação em vídeo podemos perceber claramente a melhora de qualidade.

 

Profissionais da Computação Gráfica

 

A Computação Gráfica envolve diversos tipos de profissionais.  Alguns precisam mais do que outros conhecer os fundamentos da Computação Gráfica.  Os fundamentos são entendidos aqui não só como os modelos físicos e matemáticos que dão suporte à disciplina mas também as classes de algoritmos que implementam as tarefas de síntese, processamento e visão computacional.  A Tab. 1.1 mostra uma escala que categoriza em ordem crescente os profissionais que necessitam dos conhecimentos destes fundamentos.

 

Os usuários constituem um grupo grande e variado.  Suas características dependem da área do conhecimento onde a Computação Gráfica está sendo utilizada.  Se o sistema for de interpretação sísmica, os usuários são geralmente geofísicos, se for de exames médicos os usuários são médicos, e assim por diante.  O conhecimento dos fundamentos da Computação Gráfica não é um requisito importante para estes profissionais. 

Devemos dar destaque especial aos usuários que produzem material audiovisual utilizando programas como o 3ds max, da Autodesk™.  A qualidade dos vídeos gerados por estes usuários depende, em grande parte, do conhecimento deles na área da Computação Gráfica propriamente dita.  Uma boa noção dos modelos e algoritmos ajuda bastante na criaçãoartística destes profissionais.

Os customizadores adaptam os programas existentes através das linguagens de extensão, escrevendo procedimentos que visam criar efeitos especiais ou automatizar tarefas repetitivas.  Eles precisam de um conhecimento básico dos fundamentos da Computação Gráfica.

Os       programadores de aplicações desenvolvem programas gráficos utilizando sistemas como o OpenGL™.  Nesta categoria se enquadram os profissionais que escreveram os programas ilustrados nas figuras deste capítulo.  Eles certamente precisam de sólidos  conhecimentos dos fundamentos da Computação Gráfica.

Finalmente, os desenvolvedores de ferramentas escrevem os sistemas do tipo OpenGL™ ou DirectX da Microsoft™.  Eles necessitam não só conhecer os fundamentos da Computação Gráfica como também ter uma sólida formação na área da Ciência da Computação em geral.

O material deste livro enfoca estes fundamentos da Computação Gráfica e procura explicá-los a partir de requisitos mínimos de Álgebra e programação.  Como a maioria dos profissionais envolvidos na Computação Gráfica tem estes conhecimentos, poderíamos dizer que o livro é de interesse para todos os profissionais citados na Tab. 1.1.  Este material, entretanto, foi preparado para servir de base para um curso de Computação Gráfica num programa de graduação em Informática ou Engenharia da Computação.  Esperamos que os leitores de áreas técnico-científicas, como as Engenharias, também achem o enfoque apresentado interessante.

 

Ferramentas de programação

 

O desenvolvimento de um programa gráfico interativo requer duas ferramentas básicas: um Sistema Gráfico e um Sistema de Interface com o Usuário.  A Tab. 1.2  ilustra a evolução destas ferramentas.

 

A primeira proposta de Sistema Gráfico, independente de fabricante, foi o Core da ACM, em 1978.  Esta proposta visava ser um sistema gráfico 3D e trazia dentro dela um modelo de câmera bem semelhante ao que utilizamos até hoje. A sua principal deficiência foi a falta de detalhes referentes a como a proposta deveria ser implementada.  Por exemplo, o nome e os parâmetros das funções da proposta nas diversas linguagens de programação não eram especificados. Assim, dadas duas implementações do sistema Core, um programa escrito para uma geralmente teria que ser modificado para rodar na outra. A proposta também era bem deficiente no tratamento de imagens.  Os monitores gráficos da época ainda eram predominantemente vetoriais e o suporte para imagens digitais era praticamente inexistente.

A partir da experiência do Core, a DIN alemã propôs o GKS, Graphical Kernel System.  O GKS é uma especificação de um Sistema Gráfico bidimensional que era basicamente um subconjunto bidimensional do Core com algumas extensões para incluir as já importantes imagens digitais. A grande vantagem deste sistema foi a completude da sua especificação.  Programas escritos para uma implementação do GKS podem rodar em outra sem grandes dificuldades.

O PHIGS (Programmer's Hierarchical Interactive Graphics System) retomou a idéia de cenas 3D do Core com modelos hierárquicos de objetos e transformações. O PHIGS foi posteriormente estendido para suportar imagens digitais. Este novo sistema passou a ser denominado PHIGS+. 

Ao mesmo tempo em que a discussão acadêmica sobre Sistemas Gráficos evoluía, os Sistemas de Interface gráficos foram sendo desenvolvidos.  A coluna da direita da Tab. 2 ilustra as datas destes sistemas.  É interessante notarmos que os Sistemas Gráficos e de Interface competem pela gestão da área da tela onde o desenho vai ser exibido.  Sistemas como o XWindow, por exemplo, são baseados em arquiteturas cliente-servidor em que o acesso a uma janela é encapsulado pela Xlib, que é intrinsecamente 2D.  Ou seja, a programação 3D teria que ser feita por software.  Para contornar este problema, o PHIGS evoluiu para o PEX, que foi a extensão do PHIGS para o XWindow.

O PEX não vingou como padrão porque na mesma época a Silicon Graphics™ criou o GL (Graphics Library), que foi um sucesso absoluto.  Este sistema foi posteriormente aberto e se tornou o OpenGL™, que é atualmente o padrão mais consagrado de Sistemas Gráficos. Compete com o OpenGL™ o Direct3D, que é um sub-sistema do DirectX que a MicroSoft™ criou para dar suporte à programação de jogos.  Com o avanço dos computadores a as placas de vídeo programáveis, o  OpenGL™ tem ocupado este espaço também.

O foco central deste livro é conceitual, de modo que ele seja útil para programadores de qualquer linguagem de computador utilizando qualquer Sistema Gráfico e de Interface.  Os códigos apresentados no texto e no CD em anexo são todos escritos em ANSI C.  Os códigos utilizam o Sistema Gráfico OpenGL™ e os Sistemas de Interface com o Usuário GLUT e IUP.  

Todos os sistemas utilizados neste livro são livres.  O OpenGL™ e o GLUT podem ser obtidos em http://www.opengl.org  e o IUP em http://www.tecgraf.puc-rio.br/iup

 

Projeto de programação

 

Faça o download das bibliotecas OpenGL, GLUT e IUP e instale o seu compilador favorito em sua máquina.

 

Exercícios

 

1)         Qual a diferença entre processamento de imagens, visão computacional e síntese de imagens?  Procure descrever um programa de cada uma destas áreas que você conheça.

2)         Por que um programa gráfico interativo utiliza o algoritmo de Mapa de Profundidades e não o de Rastreamento de Raios?

3)         O que é uma programa de aplicação?  

4)         Faça um breve histórico dos principais Sistemas Gráficos. 

 

 

Free Web Hosting