Ferramentas de Programação Livres para
Computação Gráca e Animação por
Computador AlbertoB. Raposo , Adailton J. A. daCruz ;y , AlessandroL. Bicho , Alfredo K.Kojima z
, CarlosA. M. dos Santos x , IslaC. F. da Silva , Léo P. Magalhães , Paulo C. P.de Andrade z Resumo
Esteartigoabordaumasériedetecnologiasdedomíniopúbliconasáreasde
Com-putação Gráca, Realidade Virtual e Animação por Computador, enfocando
ferra-mentas de programaçãopara apoio ao desenvolvimento de sistemas grácos
intera-tivos. Aprimeiraparteapresentaduastecnologiasdemenorníveldeabstraçãopara
ageraçãodeinterfacesgrácas,formasgeométricaseimagens: XWindowSysteme
OpenGL.A segundaparteapresenta tecnologiasdemais altonível,voltadasparaa
Internet, quepodem serusadas para acriaçãode aplicaçõessosticadas, tais como
mundos virtuaiseanimaçõesinterativas. Dentre estastecnologiasdestacam-se Java
3D e VRML. Java 3D é a biblioteca padrão da linguagem Java para a criação de
programas com grácos tridimensionais. VRML é um padrão muito usado para a
modelagemetransmissãodeinformação3DemundosvirtuaispelaWeb.
Palavras-chave:ComputaçãoGráca,SoftwareLivre,Animação,RealidadeVirtual.
DepartamentodeEngenhariadeComputaçãoeAutomaçãoIndustrial-DCA
FaculdadedeEngenhariaElétricaedeComputaçãoFEEC
UniversidadeEstadualdeCampinasUNICAMP
e-mails:{alberto,ajcruz,bicho,isla,leopini}@dca.fee.unicamp.br
y
CentroUniversitáriodeDourados
UniversidadeFederaldoMatoGrossodoSulUFMS
z
ConectivaInformáticaS.A.
e-mails:{kojima,pcpa}@conectiva.com.br
x
CentrodePesquisasMeteorológicas,UniversidadeFederaldePelotas-UFPel
InstitutodeInformática,UniversidadeFederaldoRioGrandedoSulUFRGS
e-mail:casantos@cpmet.ufpel.tche.br
Abstract
Thispaperdiscussessomepublicly-availabletechnologiesintheeldsofComputer
Graphics,ComputerAnimation andVirtualReality,focusingonprogrammingtools
tosupportthedevelopmentofinteractivegraphicsystems. Therstpartpresentstwo
technologies oflowerabstraction level, used forthegenerationof graphic interfaces,
geometric drawings and images: the X Window System and OpenGL. The second
partpresentstwohigherabstraction level technologies: Java3D, theJavastandard
libraryfor3Dgraphicsprogramming,andVRML,alanguageforvirtualreality
mod-elling. BothJava3DandVRMLcanbeusedtocreatesophisticatedWWW-oriented
applications,suchasvirtualworldsand interactiveanimations.
Keywords: ComputerGraphics,FreeSoftware,ComputerAnimation,VirtualReality.
1 Introdução
Softwarelivrepodeserdenidocomosoftwaredesenvolvidoporumgrupoamploe
heterogêneodepessoas,empresasegruposacadêmicos,cujadiversidadedeinteresses
impedeque se estabeleça omonopólio de um único fornecedorou fabricante,como
normalmente ocorrecomsoftwarenão-livre.
Recentemente,surgiuumfortemovimentoporpartedeempresasquedesenvolvem
software comercialnosentidode abrirocódigodeseusprodutos, visandoaumentar
sua aceitaçãono mercado, facilitar sua distribuiçãoe fazer uso dos serviçosda
co-munidade para testar o produto e torná-lo compatível com um maior número de
plataformas. Este tipodesoftwareéchamadodeopen source (códigoaberto).
Portanto, o que se pode chamar de genericamente de software de uso
públi-co oudisponívelpublicamente,estádividido em três classes: software livre
(não-proprietário,códigodisponível egratuito), software de códigoaberto (proprietário,
códigodisponívelegratuito)esoftwaregratuito(apenasoexecutávelestádisponível
gratuitamente).
OcrescimentodesoftwarelivreedecódigoabertoemComputaçãoGráca
tam-bém é uma realidade, motivado principalmente pela preocupação com a utilização
depadrõesgrácospara trabalharde formaeciente em diversas plataformas. Este
artigoabordaalgumasferramentasdeprogramaçãolivres(oudecódigoaberto)para
odesenvolvimentodesistemasgrácosinterativos.
Inicialmente,seráestudado oXWindowSystem,um sistemadejanelascom
su-porte àconstrução deaplicaçõesgrácas distribuídas earquiteturacilente-servidor.
DepoisseráapresentadooOpenGL,umaAPI(Application Programmer's Interface)
incorporadaaqualquersistemadejanelas,inclusiveoX.Java3D,abordadaaseguir,
éabibliotecadalinguagemJavaparaacriaçãodeaplicaçõestridimensionais. Como
toda aplataforma Java, Java3D é, segundo oconceito apresentado anteriormente,
opensource,emboraaSun,proprietáriadosoftware,imponharestriçõesadicionaisà
distribuiçãodocódigo-fonte. Finalmente,seráapresentadaaVRML,uma linguagem
paraamodelagemetransmissãodeinformação3DpelaInternet.
Éimportante ressaltarqueestasferramentassedestinam aodesenvolvimentode
diferentes classes de aplicaçõesgrácas. O X Window System e suas interfaces de
programação(toolikts)sãousadosparaodesenvolvimentodecomponentesgrácosde
interfacesinterativas(janelas,botões,etc.) eprimitivasbásicasdedesenho. OpenGL
éumabibliotecagrácaparaarenderizaçãodeimagensestáticas. Java3DeVRML,
porsuavez,sãovoltadosàWebepossuemrecursossosticadosdeanimação,interação
enavegaçãopormundostridimensionais.
2 X Window System
OXWindow Systemfoi criadoem1984, noMassachusettsInstitute of
Technol-ogy (MIT) [18]. Devidoà suaaceitação nomercado, em 1988 oMIT formou junto
comfabricantesdesoftwareoMITXConsortium,destinadoaproversuportetécnico
e administrativo ao desenvolvimento do sistema. O consórcio tornou-se uma
enti-dadeindependente em1993e,apósváriasfusõesereorganizações,deuorigemauma
organizaçãochamadaTheOpenGroup,quehojedetémosdireitossobreoX.
OpapeldoXConsortiumsemprefoiodeproduzirpadrões,ouseja,especicações
de software,junto comas quaisdistribuía o código-fontede uma implementação de
amostra(SIsampleimplementation). Pode-secriarversõesmodicadas,apartirda
SI(amaioriadosfabricantesdesistemasUNIXcomerciaisfazisso),masoXWindow
System continua sendo um só, denido por suas especicações formais. Qualquer
implementaçãoquenãosigaàriscaasespecicaçõesdeveserconsiderada,nomínimo,
defeituosa.
2.1Arquitetura do XWindow System
X foi concebido para que uma aplicação pudesse funcionar comquaisquer tipos
demonitoresedispositivosdeentrada. Essesdispositivossãotratados,emconjunto,
comoumdisplay (verSeção2.3). Asaplicaçõesdeveriampoderusarqualquerdisplay,
coloridoou monocromático, remoto oulocal, sem que fossenecessário alteraroseu
códigoourecompilá-las,esemperdasensíveldedesempenho. Maisdeumaaplicação
deveriapoderacessarodisplaysimultaneamente,cadaumaapresentandoinformações
emumajanela.
Osistemapossuiarquiteturacliente-servidor. Oservidorlocaliza-senaestaçãode
comunicaçãoentreclienteseentradadedadospordispositivoscomomouseeteclado.
Osclientes podemserexecutadosnaprópriaestaçãoouremotamente,conectadosao
servidoratravésdeumarede.
Qualquercoisaquesequeiraapresentarnateladeveserdesenhadadentrodeuma
janela.Umaaplicaçãopodeusarmuitasjanelasdecadavez. Menuseoutroselementos
da interface podem ser construídos com janelas que se sobrepõem às demais. As
janelassãoorganizadasemumahierarquia,oquefacilitaogerenciamento. Qualquer
janela,excetouma, chamadaderaiz,ésubjaneladeoutra.
Aoinvésde ummodelode objetos de altonível, X ofereceum substrato de
op-erações básicas, deixandoa abstraçãopara camadassuperiores. Um mecanismode
extensãopermiteàscomunidadesdeusuáriosestender osistemaemesclar essas
ex-tensõesharmoniosamente.
Suporte agrácos3D nãoera umdosrequisitos originaisdo sistema.
Posterior-menteoXConsortiumpadronizouumaextensãobaseadaemPHIGS(Programmer's
Hierarchical InteractiveGraphics System),chamadaPHIGSextensionfor X (PEX),
que não teve sucesso. A extensão GLX, desenvolvida pela Silicon Graphics (SGI)
paradarsuporteaopadrãoOpenGL(Seção3), acabousetornandoamaisaceita.
2.2Interfaces que constituemosistema de janelas
Umsistemadejanelaséconstituídoporváriasinterfaces:
Interface de programação. Bibliotecaderotinasetiposparainteraçãocomo
sis-temadejanelas. Hádoistiposdeinterfacedeprogramação. Ade baixo nível
provêfunçõesgrácasprimitivas. NoX,abibliotecaXlib[2]provêessasfunções
pormeiodetrocademensagenscomoservidor.Adealto nívelprovêfunções
para trataroselementos constituintes da interface. Existem diversas
bibliote-cas (toolkits) de interface. X não dene uma interface de alto nível padrão,
mas provê os mecanismosnecessários à construção de uma por meio de uma
bibliotecachamadaXToolkit(Xt)[11].
Interface de aplicação. Deneainteraçãomecânicaentreaaplicaçãoeousuário,
que é especíca da aplicação. X também não dene regras para interação
usuário/aplicação.
Interface de gerenciamento. Deneapolíticadecontroledoposicionamento,
taman-hoesobreposiçãodasjanelassobreaáreadetrabalho. Este papelcabeauma
aplicação chamada gerenciador de janelas (window manager). X não provê
umgerenciadorpadrão,masdene umconjunto deatributospara cadajanela
chamadowindow manager hints (dicas). Gerenciadoresde janelasdevem
faz-erusodessas dicaspara determinarasalteraçõesqueousuáriopode fazer na
Essaclassicaçãodeneumaarquiteturaemcamadasesugereindependênciaentre
mecanismo, provido pelas camadas abaixo da interface de programaçãode baixo
nível,inclusive,epolítica,providapelascamadasacimadesta.
Ainterface com o usuário éasoma das interfacesde aplicaçãoe de
gerenci-amento [18]. Baseado noprincípio deque oconceito demelhor interfaceécultural,
X foi projetado de forma a provermecanismos para que diferentes políticas de
in-terface pudessem ser implementadas, propiciando que as aplicações convivam com
diversasculturas. Afunçãodeprovertais interfacesédelegadaàsaplicaçõesclientes
ebibliotecasadicionais(Seção2.9).
2.3Conceitos importantes e terminologia
NoX WindowSystem, display éuma instância deum servidor X rodando em
uma máquina, ou seja, o conjunto de hardware de vídeo, teclado e mouse mais o
softwarequegerenciaessehardware. Umamáquinadedicada queserveapenascomo
display,échamadadeterminalX.Cadamonitorligadoàmáquinaédenominadotela
(screen). Umdisplay semprecontémpelo menosuma tela,masmúltiplos monitores
ligadosàmesmamáquinapodemconviverformandoumdisplay multiscreen.
Janela(window)podeter doissentidos,dependendodocontexto. Nonívelmais
baixo,éumaárea,normalmenteretangular,emumadastelasdodisplay, naqualos
clientes podem realizaroperações de entrada e saída (neste texto, o termo janela
seráusadocomestesignicado). Emumnívelmaisalto,janelaéaáreaocupadana
telaporuma aplicação,tambémchamadadejaneladeaplicação,oushell. Área de
trabalhoéoconjuntoformadopelajanela-raizdeumatelaeasjanelasdeaplicação
criadassobreela.
Servidor é o programa que compartilha um display com os clientes. O
servi-dor éconstruído em duascamadas, uma dependente dohardwaree outra
indepen-dente. Portaroservidorparaoutrohardwareimplicaemmodicarapenasaprimeira.
Cliente é uma aplicação que usa os serviços de um ou mais servidores de display,
podendotermaisdeumaconexãoabertasimultaneamentecomomesmoservidor.
Sessão(session)éoperíododetempoduranteoqualumusuáriotemacessoao
display. Normalmente apenas umusuáriopode usarodisplay decada vez, mas ele
podedarautorizaçãoaoutrosparaqueousem.
2.4Protocolo X
Acomunicaçãocliente-servidorsedáportrocademensagens,usandooprotocolo
X [19], que é independente do protocolo de transporte usado (TCP/IP, DECnet,
etc.). O protocolo provêrepresentação de dados independente da organização dos
computadores em que são executados o cliente e o servidor. Isto é negociado no
estabelecimento da conexão e o servidor trata de fazer no seu lado as conversões
As mensagens podem ser de três tipos: Request, para solicitaçãode serviços do
cliente ao servidor,Reply,para respostasarequisições;ou Event, paraeventos, tais
comoalteração dageometria deuma janela, pressionamento deuma teclaou
movi-mentaçãodomouse. Requests podemserdedoistipos,deacordocomomodocomo
o servidor notica o atendimento: unidirecionais (one way trip) ou de ida-e-volta
(roundtrip).
Requisiçõesunidirecionaisnãonecessitamesperarporuma conrmaçãoimediata
derecebimento, queseráenviadadecarona em umamensagemposteriordo
servi-dor. Isto melhora odesempenho do sistema, pois várias requisições podem ser
ar-mazenadasnobuer detransmissãoedescarregadasembloco,otimizando otráfego
na rede. Requisições de ida-e-volta precisamesperar arespostado servidor e, por
serembloqueantes,seuusodeveserevitadotantoquantopossível,paranãodegradar
odesempenhodosistema.
2.5Recursos do servidor
Recursos (resources) são os dados que residem na memória do servidor e são
compartilháveisentreclientesdeummesmodisplay,masnãoentredisplays diferentes.
Umrecursosobreviveenquantoduraraconexãodoservidorcomoclientequeocriou.
Janelas são áreas para desenho na tela, que podem conter outras janelas. A
destruiçãodeuma janelaimplica na destruiçãodetodasasque nelaestiverem
con-tidas,masajanela-raiz deumscreen nuncapodeserdestruída. Mapas de pixels
(pixmaps)sãoespécies dejanelasocultassobre asquaisocliente poderealizar
qual-queroperaçãodedesenhoqueseriafeitaemuma janela. Oconteúdode umpixmap
podesercopiadoparauma janelaevice-versa. Aplicaçõesquefazemdesenhos
com-plexos,comoanimaçõesouimagensdealtorealismo,podemaceleraraexibição
man-dandooservidorcopiarpartesdeumpixmap paraaáreaexpostadajanela,aoinvés
deredesenhá-la.
Contextos grácos(GCs graphic contexts)guardamconjuntos deatributos
grácoscomocoresdefrenteefundo,padrõesparadesenhodelinhas,preenchimento
depolígonos,fontesdecaracteres,etc. GCssãoglobaisparatodoumdisplay epodem
serusadosporqualquercliente emoperaçõessobrequalquerjanela.
Fontessãodescriçõesdaaparênciadeconjuntosdecaracteres,incluindoafamília,
inclinação, tamanho, espaçamento etipo de codicação, de acordocom osidiomas
aosquaiselessedestinam.
Mapas de cores(colormaps)são tabelas nasquaiscadacor éreferenciadapor
umíndice. O servidor provêum mapa global para serusado por todos osclientes,
masaplicaçõesquefazemusointensode corespodemcriarnovosmapasdecoresno
servidor,paraseuusoprivado.
Cursoresdescrevemaaparênciadocursorassociadoaodispositivoapontador. O
clientenãoprecisadesenharocursor,apenasrequisitaraoservidorqueuseumcerto
2.6Comunicação entre clientes
Xprovêmecanismosdecomunicaçãonãosóentreclienteeservidor,mastambém
entre clientes. A rigor, um cliente não pode realmente enviar eventos para outro
cliente, apenas para as janelas que este possui no servidor. Clientes que desejam
recebereventos enviados poroutrosdeverãofazer umarequisiçãoao servidor,quea
partirdeentãoosenviará. Umcliente nãoprecisasolicitareventospara umajanela
criada porele, maspodeinformar quenão osdeseja. As convençõespara interação
entre aplicações são descritas detalhadamente no Inter-Client Conventions Manual
(ICCCM)[17].
2.6.1Propriedades,átomos,áreas de recorte eseleções
Eventos permitem envio de mensagens, mas não são adequados ao
compartil-hamento dedadosentreclientes. Para fazeristo existem aspropriedades
(proper-ties),blocosdedadosqueumclientependura emumajanela. Propriedadespodem
ser criadas, destruídas, lidas e gravadas. Aplicações que compartilham dados via
propriedadesdevemsolicitaraoservidoranoticaçãodealteraçõesnasmesmas.
Átomos (atoms) sãoidenticadores únicosqueos clientes podem usarpara
co-municarinformaçãounsaosoutros. Umátomoésimplesmenteuma cadeiadebytes
detamanhoarbitrário. Aoinvésdeenviaressascadeiaspelaredeoclienteregistra-as
no servidor,obtendo umrótulo único. Átomos também sãousadospara especicar
tiposdedadosenomesdepropriedadeseseleções.
A janela-raizde cada tela possui umgrupode áreas de recorte(cut buers),
propriedadesidenticadaspelos átomospré-denidosXA_CUTBUFFER0a
XA_CUTBUF-FER7. AXlibpossuifunçõesparaarmazenarbytesnestasáreasderecorte,permitindo
àsaplicaçõesimplementar umsistema simplesderecortar-e-colar.
Seleções(selections)sãomecanismosmaissosticadosdoqueoscutbuers para
compartilhamentodedados[14,cap. 11]. Umaseleçãoétratadacomoumbastãoem
umsistema derevezamento. Apenas umclientepodedeter obastãodecadavez. O
detentordobastãodeveentãoatenderàsrequisiçõesdosoutrosclientes, convertendo
osdadosselecionadosparaumformatosolicitado,armazenandooresultadoemuma
propriedade e noticando o solicitante da disponibilidade. Seleções permitem que
clientes armazenemos dadosemseu próprioespaçode dadosenão na memóriado
servidorX.
2.7Arrastar e soltar
Arrastaresoltar,oudrag-and-drop(DnD),éatécnicainterativabaseadana
metá-foradeselecionarumobjetoemumajanelaetransportá-loparaoutra,resultandoem
umatransferênciadosdadosentreasduasaplicações. Xnãoprovêexplicitamentetal
CLIENTE
WM
1
2
3
4
Figura1: Criaçãodeumajanelatop-level. Oclientecriaajaneladentrodajanela-raiz
erequisita seu mapeamentonuma tela ao servidor X (1). Ogerenciador de janelas
recebeumanoticação(2),vericaaspropriedadescolocadasnajanelapeloclientee
criaumcontainercuja aparênciadependedoshints acopladosàjanela. Finalmente,
ogerenciador dejanelasrequisita oreparenting dajanela paradentro daborda(3).
Ousuáriosempreveráajaneladaaplicaçãodentrodocontainer(4).
usandoosmecanismosdisponíveis.
Emdecorrênciadisso,hámuitosprotocolosDnDparaX,dentreosquais
destacam-setrês. Otoolkit Motif[16] dene umprotocoloDnD baseadoem mensagens entre
clientes, propridadeseseleções. Como exemplodeaplicaçãoque usaesseprotocolo,
podemos citar o Netscape Navigator (versão para UNIX). O pacote de aplicativos
Ox[15], que posteriormente evoluiu para um toolkit grácocompleto, incluía um
protocoloDnD que foi usadopor um grande númerode aplicações. Xdnd [9] é um
protocolorecente,criadoparaotoolkit JX[10], masqueestásetornandopadrãode
fatoentreospacotesdesoftwarelivre.
Essespadrõessãoincompatíveisentresieafaltadeumpadrãorealé,
provavel-mente, o motivoprincipal da relativa escassez de aplicaçõespara X que suportem
DnD.Umacomparaçãoentreosdiversosprotocoloséfeitaem[9].
2.8Gerenciamento de janelas
O gerenciador de janelas é um cliente especial que implementa as políticas de
atribuiçãodofoco(ajanelaemfocorecebeoseventosdeteclado),
redimensionamen-toesobreposiçãodejanelas. Oprogramafazissocombasenasconvençõesdenidas
noICCCM,quedeneumconjunto padrãodepropriedadesacopladasacadajanela
quefuncionamcomodicas(hints)paraogerenciadordejanelas,contendoinformações
relativasàformacomoajaneladevesertratada. AFigura1mostracomoo
2.9Bibliotecas e toolkits
AsbibliotecasqueimplementaminterfacesdeprogramaçãoparaXsãochamadas
toolkits. OX Consortiumnuncaimpôsumtoolkit padrãopara interfacesgrácas,o
que resultou na grande proliferação desse tipo de software. Há dezenas de toolkits
diferentes, que vãode simples conjuntos de widgets (elementos da interfacegráca,
tais comobotões, caixasdetexto,etc.) usadosem uma únicaaplicaçãoaté pacotes
bastantesosticados. Abordaremosaquidoisdeles.
Xlib. Éa APIde mais baixo níveldisponívelpara X [2]. É um padrão
estabeleci-do pelo XConsortium, implementadocomo uma biblioteca emC, que oferece
funçõescomcorrespondênciaquasediretacomoprotocoloX.Todosostoolkits
conhecidos são implementados sobre Xlib, mas oferecem níveis mais altos de
abstração.
X Toolkit(Xt). Foicriadocomaintençãodeproverrecursosbásicosparao
desen-volvimentodeoutrostoolkits [11]. Xtnão temwidgets completos, masfornece
osmecanismosnecessáriosparasecriaruma bibliotecaqueospossua. Aidéia
é que Xt ofereça o suporte básico e que um toolkit complementar forneça os
widgets.
2.10Técnicas de programação
2.10.1Estrutura de um programa
Umprogramapara Xdivide-seemtrêspartes,emlinhasgerais:
Inicialização. Durante a inicialização, o programa fazo tratamento de opções de
linhadecomando,conexãocomoservidorX(sejaelalocalouremota)ealocação
deestruturasinternas.
Montagem dainterface gráca. Após aberta a conexão com o servidor, o
pro-grama pode criar emontar sua interfaceutilizando oswidgets oferecidos pelo
toolkit,oumanualmente,usandoasprimitivasdoXlib.
Laço de tratamento de eventos. Finalmente,oprogramaentraemumlaço,onde
ca esperando por eventos vindos do servidor e reagindo aeles. Em toolkits,
esteseventossãoprimeirotratadosinternamenteedependendodocaso(quando
omouseéclicadoemumwidgetbotão,porexemplo)sãorepassadosaoprograma
atravésdecallbacks oumecanismossimilares.
2.10.2Tratamento de eventos
Aousaraaplicação,ousuáriomoveomouse,clicaseusbotõesedigitanoteclado.
origensde eventos sãoamodicaçãodahierarquia dejanelas, obscurecimento e
ex-posiçãodeumajanelaoudepartesdela. UmclienteXconsisteentãodeumprograma
queenviarequisiçõesaoservidorereageaeventos.
Nemtodososeventospodemserinteressantesparaocliente. Pode-seinformarao
servidorquetiposdeeventosdevemserreportadosparacadaumdosobjetoscriados
pelo cliente, o que ajuda a reduzir otráfego de mensagens desnecessárias, além de
simplicarocódigodaaplicaçãoeconsumirmenosprocessamento.
Uma conseqüênciaindesejável dosistema de eventos éque, mesmo selecionando
ostiposquesequerreceber,muitosdelesaindapodemserdesnecessários. Amaneira
corretadetrataresseproblemaédescartartodososeventosdeumacadeiadeeventos
domesmotipoereagirapenasaoúltimo[5]. Otrechodeprogramaaseguirdemonstra
essatécnica,exemplicando ouso defunçõesexistentes naXlibpara vericar sehá
eventos na la (XEventsQueued), consultar o próximo evento sem retirá-lo da la
(XPeekEvent)eretirar um evento da la (XNextEvent). A vericaçãotem que ser
feitaantesdetentarleroeventoporqueachamadaXNextEventébloqueante.
/* laço de tratamento de eventos */
done = 0;
while(!done) {
/* lê o próximo evento */
XNextEvent(mydisplay, &myev);
switch(myev.type) {
/* redesenha a janela em eventos Expose */
case Expose:
/* Comprime uma seqüência de Exposes, para evitar repetidas
repinturas, já que para um redimensionamento da janela o
servidor X envia vários Exposes consecutivos. */
while(
(XEventsQueued(myev.xexpo se. disp lay, Que uedA fter Rea ding ) > 0)
&& (XPeekEvent(myev.xexpose. disp lay, &nextev),
(nextev.type == Expose))
) {
XNextEvent(mydisplay, &myev);
}
desenhar(mydisplay, mywindow, mygc);
break;
2.10.3Primitivas de desenho
Xpossuiumasériedemecanismosparaageraçãodeformasgeométricassimples.
PontosindividuaissãodesenhadosusandoafunçãoXDrawPoint:
XDrawPoint(display, d, gc, x, y)
Display *display;
Drawable d;
GC gc;
Nocódigoacima,DrawablepodeserumajanelaouumpixmapeGCéumcontexto
grácoquedeterminaosatributosusadosparadesenho. Múltiplospontospodemser
desenhadosdeumasóvez comafunçãoXDrawPoints.
Àsemelhançadospontos,linhassãodesenhadascomafunçãoXDrawLinee
múlti-plaslinhaspodemserdesenhadasdeumaúnicavezusandoafunçãoXDrawLines.
XDrawArc e XDrawArcsdesenham um ou diversos arcos(círculos e elipses). Ao
usaressasfunções,éimportante observarquenoXosângulossãosempre expressos
em 1
64
de grau. Istopodeparecerestranho,mastem avantagemdepermitirquese
usemvaloresinteirosparaosângulos.
XDrawRectangleeXDrawRectanglesdesenhamumoudiversosretângulosdecada
vez. Os retângulosnão podem serrotacionadosem relação aoseixos x ey da tela.
Caso sejanecessário fazer isto,será preciso calcularascoordenadasde cada vértice
do retângulo edesenhá-lo usando XDrawLines. Retângulos são osúnicos polígonos
suportadosdiretamente. Casosequeiradesenharoutrostipos,seránecessáriocalcular
ascoordenadasdosvérticesedesenhá-losusandoXDrawLines.
Paraopreenchimentodeáreas,asfunçõesXFillArc,XFillArcs,XFillPolygon,
XFillRectangleeXFillRectanglespermitemdesenharasmesmasformas
geométri-casmencionadasanteriormente,maspreenchidascomuma coroupadrãodepontos.
2.11Usando XWindow System
Graçasàsualosoadeoferecermecanismoenãopolítica,associadaà
extensibil-idadedoprotocolo,Xtemevoluídoaolongodesuaexistência,sempreseconservando
como uma plataforma de desenvolvimento estável, conável e versátil para a
con-struçãode aplicaçõesgrácasinterativas. A existência deuma especicaçãoformal
rígidaparaoprotocologarantetambémainteroperabilidadeemambientes
heterogê-neos dehardware/software.
Porserbaseadoemumprotocolodecomunicaçõeseteruma arquitetura
cliente-servidor,quegaranteindependênciaentreaplicação ehardwaregráco,X provê
su-porte transparente à operaçãoem ambiente distribuído. A maioriados sistemas de
janelasoperaem modokernel,oqueobrigaaaplicaçãoaserexecutadanamesma
máquina em que está o display. Além disso, X tem escalabilidade: uma máquina
poderosa pode servir simultaneamente a dezenas de usuários conectados a ela por
terminaisXremotos.
As noções sobre programação apresentadas nas seções anteriores representam
muito pouco daquilo que se pode fazer com X, principalmente quando combinado
combibliotecasdeinterfaceeferramentasdemaisaltonível,comoOpenGLqueserá
visto na próxima seção. Para obter informações mais profundas, a documentação
de referência se encontra na forma de páginas de manual, normalmente instaladas
emsistemascomoX.ManuaisdereferênciaemPostScript(r)podemserobtidosvia
FTPanônimoemftp://ftp.x.org/pub/R6.4/xc/docs/hardcopy/.Referências
LessTif: http://www.lesstif.org/edaMotifZone http://www.motifzone.net/.
3 OpenGL
Padrõesgrácos,comoGKS(GraphicsKernelSystem)ePHIGS,tiveram
impor-tante papelna décadade 80, inclusive ajudando aestabelecer oconceito de usode
padrõesmesmoforadaáreagráca,tendosidoimplementadosem diversas
platafor-mas. NenhumadestasAPIs,noentanto,conseguiutergrande aceitação[20].
Atualmente,oOpenGL(GL signicaGraphics Library) éuma API degrande
utilizaçãonodesenvolvimentodeaplicaçõesemComputaçãoGráca[13]. Estepadrão
éosucessordabibliotecagrácaconhecidacomoIRISGL,desenvolvidapelaSilicon
Graphics como uma interface grácaindependente dehardware [6]. A maioria das
funcionalidadesdaIRISGLfoiremovidaourescritanoOpenGLeasrotinaseos
sím-bolos foram renomeadospara evitar conitos (todos osnomes começamcom gl ou
GL_). Namesmaépoca foiformadooOpenGLArchitecture ReviewBoard,um
con-sórcioindependentequeadministraousodoOpenGL,formadopordiversasempresas
daárea.
OpenGLéumainterfacequedisponibilizaumcontrolesimplesedireto sobreum
conjuntoderotinas,permitindoaoprogramadorespecicarosobjetoseasoperações
necessáriaspara aprodução deimagensgrácasde altaqualidade. OpenGL éuma
máquina de estados, onde o controle de vários atributos é realizado atravésde um
conjunto de variáveisde estado que inicialmente possuem valores default, podendo
seralteradoscasosejanecessário. Assim,porexemplo,todoobjetoserátraçadocom
amesmacoratéquesejadenido umnovovalorparaestavariável.
Porserumpadrãodestinadosomenteàrenderização[21],OpenGLpodeser
uti-lizadoemqualquersistemadejanelas(porexemplo,XouWindows),aproveitando-se
dosrecursosdisponibilizadospelosdiversoshardwaresgrácosexistentes. NoX
Win-dowSystemeleéintegradoatravésdoGLX(OpenGLExtensionforX),umconjunto
derotinaspara criare gerenciarumcontextode renderizaçãodoOpenGL noX[6],
[21]. AlémdoGLX, existemoutrasbibliotecasalternativasparainterfaceamento no
X, taiscomo GLUT (OpenGL Utility Toolkit)[7] eGTK[3]. Estas bibliotecas
pos-suemumconjuntodeferramentasquefacilita aconstruçãodeprogramasutilizando
oOpenGL.
3.1Objetos geométricos
OpenGLéumainterfacequenãopossuirotinasdealtoníveldeabstração. Desta
forma,asprimitivasgeométricassãoconstruídasapartirdeseusvértices. Umvérticeé
representadoemcoordenadashomogêneas(x,y,z,w). Sewfordiferentedezero,estas
coordenadas correspondem a um ponto tridimensional euclidiano (x/w, y/w, z/w).
1
GL_QUAD_STRIP
GL_TRIANGLES
0
1
2
3
4
5
6
7
0
2
4
8
5
3
1
6
7
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
0
2
1
3
4
5
0
1
2
3
4
5
GL_LINE_LOOP
0
1
2
3
4
5
GL_POLYGON
GL_QUADS
0
1
2
3
4
0
1
2
3
4
5
6
7
GL_POINTS
GL_LINES
GL_LINE_STRIP
0
2
3
4
5
0
1
2
3
4
0
1
2
3
4
5
6
Figura2: PrimitivasgeométricasdoOpenGL[6].
tridimensional. Assim sendo, os pontos bidimensionais especicados pelo usuário
são trabalhados como pontos tridimensionais, onde a coordenada z é igual a zero.
Ossegmentosderetasãorepresentadospor seuspontosextremoseospolígonossão
áreasdenidasporumconjuntodesegmentos. NoOpenGL,algunscuidadosquantoà
deniçãodeumpolígonodevemsertomados: umpolígonodeverásersempreconvexo
e não poderá ter interseçãodassuas arestas (conhecidocomo polígonosimples). A
especicaçãodeumvérticeéfeitaatravésdasfunçõesglVertex*(O *seráutilizado
nestetextopararepresentarvariantes nonomedafunção;asvariaçõesrestringem-se
ao número e/ou ao tipo dos argumentos por exemplo, glVertex3i denirá um
vérticecomtrêscoordenadasinteiras).
Emmuitasaplicaçõesgrácas háanecessidadededenirpolígonosnãosimples,
côncavosoucomfuros. Comoqualquerpolígonopodeserformadoapartirdaunião
de polígonos convexos, algumas rotinas mais complexas, derivadas das primitivas
básicas,sãofornecidasnaGLU(OpenGLUtilityLibrary)[13]. Estabibliotecautiliza
somente funçõespadrõesdoOpenGLeestá disponívelem todasasimplementações
doOpenGL.
Para traçar um conjunto de pontos, um segmento ou um polígono, os vértices
necessários para adenição destas primitivassão agrupadosentre aschamadasdas
funçõesglBegineglEnd. Pode-seadicionartambéminformaçõesaumvértice,como
umacor,umvetornormalouumacoordenadaparaatextura. Oargumentodafunção
glBegin indicaráaordem como serãoassociados osvértices, conformeilustradona
Figura2.
No OpenGL, uma primitiva pode ser traçada de diferentes maneiras, conforme
a ordemselecionada e oconjunto devértices denido. Otrechode códigoa seguir
apresentaumexemplodotraçadodeumacircunferência.
#define PI 3.1415926535
int circle_points = 100;
glBegin(GL_LINE_LOOP);
for (i = 0; i < circle_points; i++) {
glVertex2f(cos(angle), sin(angle));
}
glEnd();
O exemplo acima não é o modo mais eciente para traçar uma circunferência,
especialmente seestaprimitivafor utilizadaváriasvezes. Nestecaso,odesempenho
carácomprometidoporqueháocálculodoânguloeaexecuçãodasfunçõessinecos
para cadavértice, alémdo overhead do loop. Poderíamossolucionar este problema
calculando as coordenadas dos vértices uma única vez e armazenando-os em uma
tabela, ou utilizando uma rotina GLU/GLUT, ou ainda criando uma display list,
queéumamaneiradedenirumgrupoderotinasdoOpenGLqueserãoexecutadas
posteriormente,respeitandoaseqüênciaemqueforamdenidas.
3.2Visualização
Em Computação Gráca, organizar as operações necessárias para converter
ob-jetos denidos emum espaçotridimensional paraum espaçobidimensional(tela do
computador) é uma das principais diculdades no desenvolvimento de aplicações.
Paraisso,aspectoscomotransformações,clipping edeniçãodasdimensõesde
view-port (porçãodajanelaondeaimagemédesenhada)devemserconsiderados.
Transformaçõessão operaçõesdescritaspela multiplicaçãode matrizes. Estas
matrizespodem descreveruma modelagem, uma visualizaçãoou uma projeção,
de-pendendo do contexto. Clipping é aeliminação de objetos (ou partes de objetos)
queestãosituadosforadovolumedevisualização. Oenquadramentodasimagensno
viewport éaoperaçãodecorrespondência entre ascoordenadastransformadaseos
pixelsdatela.
Asmatrizesdemodelagemposicionameorientamosobjetosnacena,asmatrizes
de visualizaçãodeterminam oposicionamento dacâmera e asmatrizes de projeção
determinamovolumedevisualização(análogoàescolhadalenteparaumamáquina
fotográca). NoOpenGL,as operaçõescomestasmatrizessãorealizadasatravésde
duaspilhas: apilha quemanipulaasmatrizesdemodelagemedevisualização
(mod-elview)eapilhaquemanipulaasmatrizesdeprojeção(projection). Asoperaçõesde
modelagemedevisualizaçãosãotrabalhadasnamesmapilha,poispode-seposicionar
acâmeraemrelaçãoàcenaouvice-versa,ondeoresultadodeambasoperaçõesserá
omesmo. A denição dapilha na qualsedesejatrabalhar éfeitaatravésdarotina
glMatrixMode,indicadapelo argumentoGL_MODELVIEWouGL_PROJECTION.
Para o posicionamento da câmera ou de um objeto são utilizadas as rotinas
glRotate*e/ouglTranslate*, quedenemrespectivamente matrizes de rotaçãoe
detranslação. Pordefault,acâmeraeosobjetosnacenasãooriginalmentesituados
naorigem. HátambémarotinaglScale*,quedeneumamatrizdeescalonamento.
Quantoàdeniçãodaprojeção,OpenGLprovêduastransformações:aperspectiva
afastado dacâmera. Naortogonal, aprojeção não éafetada pela sua distância em
relaçãoàcâmera.
Paraestabeleceraáreanatelaondeaimagemserárenderizadaéutilizadaarotina
glViewport. Esta rotinapoderá distorceraimagem,casoarelaçãoentreaalturae
alarguradajanelanatelanãocorresponderamesmarelaçãoutilizadaparadenira
janelanovolumedevisualização.
3.3Cor
OpenGLpossuidois modosdiferentes para tratarcor: omodoRGBA eomodo
indexadode cor[6]. OmodoRGBA possui ascomponentes vermelho,verde,azule
alfa,respectivamente. Ostrêsprimeirosrepresentamascoresprimáriasesãolineares
(variandode0.0a1.0). Acomponentealfaéutilizada,porexemplo,emoperaçõesde
blending (mistura)etransparência. Estacomponenterepresentaaopacidadedacor,
variandode0.0(totalmentetransparente)até1.0(totalmente opaca).
Omodoindexadodecorutilizaummapadecores. Estemapaarmazenaemcada
índice os valorespara cada componente primária (RGB). A corentão étrabalhada
pelo índice, enão porsuascomponentes. OpenGLnão tem rotinasespecícaspara
alocaçãodecores,sendoosistemadejanelasresponsávelporestafunção.
3.4Aparência dos Objetos
OpenGL utiliza o modelo de Gouraud para a tonalização, provendo uma cena
comrealismo. Uma cena érenderizadalevando-se em consideraçãoalgunsaspectos
como, porexemplo, o tipode fonte de iluminação que está sendousada na cena e
aspropriedadesdo material para cadasuperfície. Alguns efeitos complexos comoa
reexãodaluzesombranãosãodiretamentesuportados,emboraestejamdisponíveis
códigos-fontenaredeparasimulartais efeitos.
Paraimplementaromodelodeiluminação,OpenGLdecompõeoraioluminosonas
componentesprimáriasRGBparacadacomponentedeluzdomodelodeiluminação,
quesão:
Componenteambiente. Componenteprovenientedeumafontequenãoépossível
determinar. Porexemplo,aluzdispersa em umasalatemumagrande
quan-tidadedacomponenteambiente,poisestaluzéresultantedemultireexõesnas
superfíciescontidasnacena.
Componentedifusa. Componentereetidaemtodasasdireçõesquandoestaincide
sobre uma superfície,provenientede uma direçãoespecíca. A intensidadede
luz reetida será amesma para oobservador, não importandoonde ele esteja
situado(superfícieLambertiana).
Componenteespecular. Componentereetidaemumadeterminadadireção
Su-perfícies como metais brilhantes produzem grande quantidade de reexão
es-pecular. OmodelodePhongéutilizadoparaocálculodareexãoespecular.
Quanto aostipos defonte deiluminação,OpenGL possuifontes pontuais,que
irradiam energia luminosa em todas as direções e spots, que são fontes pontuais
direcionais,i.e., têmumadireçãoprincipalnaqualocorreamáximaconcentraçãode
energialuminosa;foradestadireçãoocorreumaatenuaçãodestaenergia.
Damesmamaneiraquealuz,diferentesmateriaisdesuperfíciespodemapresentar
comportamentosdistintosemrelaçãoàscomponentesespecular,difusaeambientede
umaoumaisfontesluminosas,determinandoassimacordasuperfície. Umareexão
dacomponenteambientedomaterialécombinadacomacomponenteambientedaluz,
damesmaformaareexãodacomponentedifusadomaterialcomacomponentedifusa
daluzesimilarmenteparaareexãoespecular. Asreexõesdifusaeambientedenem
acor domaterial, enquanto areexãoespeculargeralmente produzuma corbranca
oucinza. AsrotinasglMaterial*sãoutilizadasparadeterminaraspropriedadesdos
materiais.
OpenGL também provê suporte para o mapeamento de texturas, embora esse
aindaseja um recurso bastante limitado, pois não existem facilidades para mapear
imagens de outras fontes (é necessário um programa auxiliar para converter uma
imagememuma representaçãoaceitapeloOpenGL).
3.5Framebuer
Umconjuntode buers de umadeterminadajanela oude umdeterminado
con-textoédenominadoframebuer. NoOpenGL,háumconjuntodebuersquepodem
sermanipuladosconformeanecessidade[13]:
Buers de cor. Sãonormalmente utilizadospara traçaraimagem. Podem conter
cores indexadas ou RGBA. Dependendo da aplicação, pode-se trabalhar com
imagensestéreooudoublebuering (doisbuers deimagem,umvisívele
out-ro não), desde que o sistema de janelas e o hardware suportem. Como no
OpenGLnãohárotinasespecícasparaproduçãodeanimações,autilizaçãode
umdouble buer éuma opção. NoX, por exemplo,há umcomando
denomi-nadoglXSwapBuffers,que disponibiliza este recurso. Dessa forma, enquanto
umquadroéexibidonatela,opróximoquadroestásendorenderizadonobuer
nãovisível.
Buer de profundidade. É utilizado para armazenar, durante a renderização, o
pixel cuja profundidade (coordenada z) é dada pela função de comparação
glDepthFunc. Por exemplo,para realizaro algoritmoz-buer, afunção pode
escolheropixeldemenorcoordenadazdentreosquetiveremasmesmas
Buer Stencil (seleção). Serveparaeliminaroumantercertospixelsnatela,
de-pendendo dealgunstestesdisponibilizadosparaeste buer. Émuitoutilizado
em simuladoresondeénecessáriomantercertasáreasealteraroutras.
Buer de acumulação. Contém cores especicadas em RGBA. É utilizado para
acumularumconjuntodeimagensatravésdeumaoperaçãopré-especicada. A
imagem resultante destas acumulaçõeséexibidaatravésda transferênciapara
umbuer decor. Podeserutilizadoparatrabalharcomdiversastécnicascomo,
porexemplo,antialiasing, motionblur (borrão)ouprofundidadedecampo.
3.6Usando OpenGL
A página do consórcio que administra o OpenGL é http://www.opengl.org,e
a página da SGI é http://www.sgi.com/software/opengl. Informações de
âm-bito geral e bibliotecas relacionadas podem ser obtidas em http://reality.sgi.
com/opengl/. Existetambémumclonenão-proprietáriodoOpenGLchamadoMesa
(http://www.mesa3d.org).
OpenGL foi projetado para fornecer o máximo acesso às capacidades de
difer-enteshardwaresgrácos,sendoimplementáveleexecutávelemumavariedadede
sis-temas. OMicrosoftDirectXSDK (http://www.microsoft.com/directx/)
disponi-biliza,atravésdasAPIsDirectDraweDirect3D,recursossemelhantesaosencontrados
no OpenGL, mas este é um sistema comercial, disponívelapenas para o Windows.
Além disso,segundo[8],Direct3DéumaAPImuitocomplexaedifícildeutilizar.
Pelasuaexibilidadeemmodelarerenderizarobjetosgeométricos,OpenGLserve
como umaexcelente basepara construirbibliotecasparadeterminados contextosde
aplicação,comoJava3Dqueserávistanapróximaseção.
4 Java 3D
Java3Déumainterfacecriadaparaodesenvolvimentodeaplicaçõesgrácas
trim-idensionaisemJava,executadanotopodebibliotecasgrácasdemaisbaixonível,tais
comoOpenGLeDirect3D,conformeilustraaFigura3. Comisto,osprogramadores
de aplicaçõespassam aexplorar, agora no âmbitodas aplicaçõesgrácas
tridimen-sionais, o conjunto de facilidades evantagensda plataforma Java, como orientação
a objetos, segurança e independência de plataforma. Em particular, a orientação
a objetos oferece uma abordagem de alto nível à programaçãoe possibilita que o
desenvolvedor sededique mais àcriação do que aos problemas de mais baixo nível
pertinentes àprogramação 3D, osquais exigem um esforçoconsiderável. Esta
tec-nologiagrácavem aindaaoencontro deuma crescente demandaporoperações3D
requisitadahojepela Web.
Java3D utilizaalgunsconceitos quesão comunsaoutras tecnologias,tais como
Java 3D
Hardware
Direct3D
Native Graphics Calls
Java
Applets ou Aplicações
Futuras APIs
OpenGL
Figura3: RelaçãoentreasváriascamadasdesoftwarenocontextodeJava3D.
próxima[1]. UmaaplicaçãoJava3Déprojetadaapartirdeumgrafodecenacontendo
objetos grácos, luz, som, objetos de interação, entre outros, que possibilitam ao
programadorcriarmundosvirtuaiscompersonagensqueinteragementresie/oucom
ousuário [22]. Descrever uma cena usando um grafo é tarefa mais simples doque
construiramesmausandolinhasdecomandoqueespecicamprimitivasgrácas,tais
comoasdoOpenGL.
4.1Ografo de cena emJava 3D
O primeiro procedimento na elaboração de uma aplicação Java 3D é denir o
universo virtual, que é composto por um oumais grafos de cena. Ografo de cena
éuma estrutura do tipo árvore cujos nóssão objetos instanciados dasclasses Java
3Deosarcosrepresentamotipode relaçãoestabelecida entre doisnós. Osobjetos
denemageometria,luz,aparência,orientação,localização,entreoutrosaspectosda
cena. A Figura4ilustraumpossívelexemplodegrafodecenas.
Osgrafosdecenas sãoconectadosao universovirtual(representadonaFigura 4
atravésdonóVirtualUniverse)pormeiodeumnóLocale.UmnóVirtualUniverse
pode ter um ou maisnós Locale,cuja nalidade é fornecer um sistema de
coorde-nadasaomundovirtual. Onó-raizdeumgrafodecena(branchgraph)ésempreum
objeto BranchGroup.
Osbranchgraphssãoclassicadosemduascategorias: deconteúdo(contentbranch
graph) e devista (view branch graph). Os content branch graphs descrevem os
ob-jetos queserãorenderizados, i.e., especicam ageometria, textura, som, objetos de
interação, luz, como estes objetos serão localizados no espaço, etc. (na Figura 4 é
oramo àesquerda donóLocale). Osview branch graphs especicamasatividades
eparâmetros relacionados como controle da vista dacena, tais como orientação e
localizaçãodousuário(naguraéoramoàdireita donóLocale).
Umcaminhoentreonó-raizdografodecenasatéumdeseusnósfolhasdetermina
deformaúnicatodasasinformaçõesnecessáriasparaseprocessarestenó. Omodelo
TG
Appearence
Geometry
Node Components
View Platform
View
Canvas3D
Screen3D
Physical Body
Physical Environment
TransformGroup Node
BranchGroup Node
Locale
Virtual Universe
Node
Shape3D
BG
BG
Figura4: Grafodeuma cenaemJava3D.
queele determinaseramaiseciente. Emgeraloprogramadornão sepreocupaem
determinarumaordemderenderização,umavezqueJava3Dfaráistodaformamais
eciente. No entanto, um programador poderá exercer, de forma limitada, algum
controleusandoumnóOrderedGroup,queasseguraqueseuslhosserãorenderizados
emumaordempré-denida,ouumnóSwitch,queselecionaumoumaislhosaserem
renderizados.
Java3D organizaouniversovirtualusando oconceito deagrupamento, i.e., um
nómantémumacombinaçãodeoutrosnósdemodoaformarumcomponenteúnico.
EstesnóssãodenominadosGroup. UmnóGrouppodeterumaquantidadearbitrária
de lhos que são inseridos ou removidos dependendo do que se pretende realizar.
Discutimos anteriormenteos nósBranchGroup,OrderedGroupeSwitch. Inserem-se
aindanestacategoriaosnósTransformGroup,quesãousadosparaalterara
localiza-ção,orientaçãoe/ouescaladogrupodenósdescendentes.
Umnó quenão possui lhos pertence auma segundacategoria e édenominado
nóLeaf. Estesnóssãousadosparaespecicarluz,som,procedimentosdeinteração,
formadosobjetosgeométricos,orientaçãoelocalizaçãodoobservadornomundo
vir-tual,entreoutros. EstasinformaçõesestãoarmazenadasnopróprionóLeafouentão
éfeitaumareferênciaaumobjeto NodeComponentquemantémosdadosnecessários
paraoprocessoderenderização. OsobjetosNodeComponentnãofazempartedografo
de cenas, i.e., arelação entre um nó Leafe um NodeComponentnão édo tipo
mesmoNodeComponentsemviolaraspropriedadesdografodecenas,queéumgrafo
direcionadoacíclico.
ComoexemplosdenósLeafpodemsercitados: Light,Sound,Behavior,
Shape-3D e ViewPlatform. Nós Shape3D são usados para construir formas 3D a partir
deinformaçõesgeométricaseatributos queestãoarmazenadosem umobjeto
Node-Component (naFigura 4, são os elementos referenciados por arcos tracejados). Os
nós Behavior são usados na manipulação de eventos disparados pelo usuário e na
animaçãodeobjetosdouniversovirtual. UmnóViewPlatforméusadoparadenir
a localização e orientação do observador (ou do usuário) no mundo virtual. Um
programa Java 3D pode fazer o observador navegar pelo mundo virtual aplicando
transformaçõesdetranslações,rotaçõeseescalonamentosnestenó.
4.1.1Escrevendo umprograma emJava 3D
A estrutura típicade umprogramaJava3D em geraltem doisramos: umview
branch eumcontent branch. Assim, escreverum programaem Java3D requer
ba-sicamentecriarosobjetosnecessáriosparaconstruirosramosview branch econtent
branch. Umbompontodepartidaéaseqüênciadepassossugeridapor[23]:
1. Criarumobjeto Canvas3D
2. Criarumobjeto VirtualUniverse
3. Criarumobjeto Localeeanexá-loaoVirtualUniverse
4. Construirumgrafoviewbranch
(a) Criarumobjeto View
(b) Criarumobjeto ViewPlatform
(c) Criarumobjeto PhysicalBody
(d) Criarumobjeto PhysicalEnvironment
(e) Anexarosobjetoscriadosem(b),(c) e(d)aoobjetoView
5. Construirumoumaisgrafoscontentbranch
6. Compilaro(s) branch graph(s)
7. InserirossubgrafosaonóLocale
A construção do grafo view branch (item 4 acima) mantém a mesma estrutura
paraamaioria dosprogramasJava3D.Uma formade ganhartempo éusaraclasse
SimpleUniverse,queretornaumuniversovirtualcomosnósVirtualUniverse(item
2acima),Locale(item3), ViewPlatformeosobjetosrelativosaoitem4.
Aseguiréapresentadoocódigodeumaaplicaçãoquecriaumgrafodecenasque
public class Exemplo01 extends Applet {
public Exemplo01 () {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null); // passo 1
add("Center", canvas3D);
BranchGroup s = ConstroiContentBranch() ; // passo 5
s.compile(); // passo 6
// A instanciação de um objeto SimpleUniverse corresponde
// aos passos 2, 3, e 4 da "receita"
SimpleUniverse su = new SimpleUniverse(canvas3D);
// Desloca o ViewPlatform para trás para que os
// objetos da cena possam ser vistos.
su.getViewingPlatform(). setN omi nalV iewi ngT rans form ();
// Anexa o content graph ao nó Locale : passo 7
su.addBranchGraph(s);
}
public BranchGroup ConstroiContentBranch() {
// Especificação dos conteúdos gráficos a serem renderizados
BranchGroup objRoot = new BranchGroup();
// Especificação das 2 rotações do cubo: uma no eixo x
// e outra no eixo y. Depois as duas são combinadas.
Transform3D rotate1 = new Transform3D();
Transform3D rotate2 = new Transform3D();
rotate1.rotX(Math.PI/4.0 d);
rotate2.rotY(Math.PI/5.0 d);
rotate1.mul(rotate2);
TransformGroup objRotate = new TransformGroup(rotate1);
objRoot.addChild(objRota te);
objRotate.addChild(new ColorCube(0.4));
return objRoot;
}
}
4.1.2Congurando as capacidades de umobjeto Java 3D
O grafo de cenas Java 3D pode ser convertido para uma representação interna
que tornaoprocesso derenderizaçãomais eciente. Esta conversãopode ser
efetu-ada anexandocada branch graph a um nó Locale,tornando-osvivos(live) e,
con-seqüentemente, cada objeto dobranch graph é dito estarvivo. A segunda maneira
é compilando cada branch graph, usando o método compile, de forma a torná-los
objetoscompilados. Uma conseqüênciadeumobjetoservivoe/oucompiladoéque
seus parâmetros não podem ser alterados a menos que tais alterações tenham sido
quepodemseracessadosédenomominadacapabilities evariadeobjetoparaobjeto.
Oexemploaseguircria umnóTransformGroupecongura-oparaescrita. Isto
sig-nicaque ovalor datransformada associadaao objeto TransformGrouppoderá ser
alteradamesmodepoisdeletornar-sevivoe/oucompilado.
TransformGroup alvo = new TransformGroup();
alvo.setCapability(Transf ormG rou p.AL LOW _TRA NSFO RM_ WRIT E);
4.2Modelagem
Umobjeto3DéumainstânciadaclasseShape3D,representadonografodecenas
por um nó do tipo Leaf. O nó Shape3D não contém os atributos que denem o
objeto 3D,tais comoseuconteúdogeométricoesuaaparência. Estesatributosestão
armazenadosem objetos dotipoNodeComponent.
Uma alternativa é denir um objeto 3D como sendo uma extensão da classe
Shape3D,o que é bastante útil quando se deseja criar múltiplas instâncias do
ob-jeto3Dcomosmesmosatributos.
4.2.1Denindoa geometriade um objeto 3D
Para que um objeto 3D seja funcional é necessário especicar pelo menos seu
conteúdo geométrico. Java 3D oferece basicamente três maneiras de se criar um
conteúdo geométrico. O primeiro método é o mais simples e consiste no emprego
deprimitivasgeométricas,taiscomoBox,Sphere,Cylinder eCone,cujacomposição
determinaaformadoobjeto desejado. Cadaprimitivapossuiummétodoconstrutor
ondesãoespecicadasasdimensõesdo objeto (ou então estessãoinstanciados com
dimensõesdefault). Emrazãodalimitaçãoinerenteaestemétodocomo,porexemplo,
aimpossibilidadedealteraçãodageometriadasprimitivas,elenãoéomaisapropriado
paramodelarageometriadeumobjeto3Dmaiscomplexo.
Umsegundométodopermiteque osdadosgeométricosquemodelamaformado
objeto 3D (primitivas geométricas denidas pelo programador) sejam especicados
vértice a vértice em uma estrutura vetorial. Esta estrutura é denida usando as
subclassesdeGeometryArraycomopor exemplo: PointArraydeneumvetorde
vértices,LineArray dene umvetor desegmentos, TriangleArraydene um
vetordetriângulosindividuaiseQuadArraydeneumvetordevérticesondecada
quatrovérticescorrespondemaumquadrado individual. Estes polígonosdevem ser
convexoseplanares.
UmobjetoGeometryArraypodearmazenar,alémdascoordenadasdelocalização,
coordenadasdovetornormalàsuperfície,coordenadasde coresede texturas. Uma
alternativa ao GeometryArray, eliminando possíveis redundâncias, é usar a classe
umobjeto IndexedGeometryArrayprecisa, alémdovetorde dados,deumvetorde
índicesparafazerreferênciasaoselementos dovetordedados.
Asalternativasapresentadasno segundométodooferecem aoprogramadormais
exibilidade na denição da forma dos objetos, mas ainda pesam contra elas
algu-mas desvantagens. A criação deum conteúdo geométricomais elaboradovai exigir
grandequantidadedetempoedelinhasdecódigopara computarmatematicamente
ouespecicaralistadevérticesdoobjetodeinteresse. Estabaixa performance não
motivaráoprogramadoradesenvolverformasmaissosticadas.
Aindacomrelaçãoaestaabordagemdedeniraformadoobjeto3Dusandoforça
bruta, Java3D disponibilizaumpacote com.sun.j3d.utils.geometryque oferece
algumas facilidades neste processo. Porexemplo, ao invésde especicar
exaustiva-mente as coordenadas, triângulo atriângulo, especica-seum polígono arbitrárioP
(quepodesernão-planarecomburacos)usandoumobjetoGeometryInfo,easeguir
efetua-se atriangulação de P usando um objeto Triangulator. A triangulação de
um polígononão-planar, noentanto, pode gerardiferentes superfícies,demodoque
oresultadoobtidopodenão serodesejado.
Java3D também ofereceum terceiro método, baseado na importaçãode dados
geométricoscriadosporoutrasaplicações,queresolveemgrandeparteosproblemas
citadosanteriormente. Nestetipodeabordagemécomumusarumsoftwareespecíco
para modelagem geométrica que ofereça facilidades para criar o modelo desejado.
Feito isto, o conteúdo geométrico é então armazenado em um arquivo de formato
padrão que posteriormente será importadopara umprogramaJava 3D, processado
e adicionado a um grafo de cenas. O trabalho de importação destes dados para
um programaJava3D érealizadopelos loaders [23]. Um loader sabe como lerum
formato de arquivo 3D padrão e então construir uma cena Java 3D a partir dele.
ExisteumagrandevariedadedeformatosdisponíveisnaWeb,porexemplooformato
VRML(.wrl),Wavefront(.obj),AutoCAD(.dfx),3DStudio(.3ds),LightWave(.lws),
entre outros. Uma cena Java3D pode ainda ser construída combinando diferentes
formatosdearquivo. Paraissoésuciente usaros loaders correspondentes. Porm,
vale observarqueestesloaders não fazemparteda Java3D, sãoimplementaçõesda
interfacedenidanopacotecom.sun.j3d.loaders.
4.2.2Denindoa aparência de umobjeto 3D
Um nó Shape3D pode, opcionalmente, referenciar um objeto Appearance para
especicarsuaspropriedades,taiscomotextura,transparência,tipodematerial,estilo
de linha, entre outros. Estas informações não sãomantidas noobjeto Appearance,
quefazreferênciaaoutrosobjetos NodeComponentquemantêmtaisinformações.
Estaspropriedades,ouatributos,sãodenidasusandoassubclassesde
NodeCom-ponent. Alguns exemplos, entre as várias subclasses existentes, são:
LineAttrib-utes, PoligonAttributese ColoringAttributes. Um objeto LineAttributesé
pontilhadaoutracejada-pontilhada)etratamentodeantialiasing. Umobjeto
Poly-gonAttributesdene,porexemplo,comoospolígonosserãorenderizados
(preenchi-do,wireframe ouapenas osvértices). Umobjeto ColoringAttributesdeneacor
dosobjetoseomodelodeshading.
4.3Interação
Programarumobjeto para reagiradeterminados eventos éuma capacidade
de-sejável na grande maioria das aplicações 3D. Por exemplo, um evento poderia ser
umateclapressionada,omovimentodomouseouacolisãoentreobjetos,cujareação
seria alteraralgum objeto (mudar cor, forma, posição, entre outros)ou ografo de
cenas(adicionarou excluirumobjeto). Quandoestasalteraçõessão resultantes
di-retasda ação do usuárioelas são denominadasinterações. As alteraçõesrealizadas
independentementedousuáriosãodenominadasanimações [23].
Java 3D implementa os conceitos de interação e animação na classe abstrata
Behavior. Estaclassedisponibilizaumagrandevariedadedemétodosparacapacitar
seusprogramasaperceberetratardiferentestiposde eventos. Permiteaindaqueo
programadorimplementeseusprópriosmétodos. Osbehaviors sãoosnósdografode
cenausadospara especicaroiníciodaexecuçãodeuma determinadaação baseado
na ocorrência de um conjunto de eventos, denominado WakeupCondition,ou seja,
quandodeterminadacombinaçãodeeventosocorrerJava3Ddeveacionarobehavior
correspondenteparaqueexecuteasalteraçõesprogramadas.
Uma WakeupCondition, condiçãousada para disparar um behavior, consiste de
uma combinação de objetos WakeupCriterion, que são os objetos Java 3D usados
paradenirumeventoouumacombinaçãológicadeeventos.
Osbehaviors sãorepresentadosnografodecenaporumnóLeaf,semprefazendo
referênciaaumobjetodografo. Éatravésdesteobjeto,denominadoobjeto-alvo,eem
geralrepresentadoporumTranformGroup,queosbehaviors promovemasalterações
nomundo virtual.
Todososbehaviors sãosubclassesdaclasseabstrataBehavior. Elescompartilham
umaestruturabásicacompostadeummétodoconstrutor,ummétodoinicializadore
ummétodoprocessStimulus.
Ométodoinitializeéchamadouma vez quandoobehavior torna-sevivo. No
casode umnóBehavior,ofato deestar vivosignicaque ele está pronto para ser
invocado. Dene-seneste métodoovalorinicialdaWakeupCondition.
OmétodoprocessStimuluséchamadoquandoacondiçãodedisparoespecicada
para obehavior ocorrere ele estiverativo. Esta rotina entãoefetua todo o
proces-samento programadoe dene a próxima WakeupCondition, i.e., informa quando o
behavior deveserinvocadonovamente.
Poruma questãode desempenho, oprogramadordene uma região limitada do
espaçodenominadascheduling bound paraobehavior. Eleéditoestarativoquando
aptosarecebereventos[24].
4.4Animação
Algumas alterações do mundo virtual podem ser realizadas independentemente
da ação dousuário. Elaspodem,por exemplo, serdisparadas em função dopassar
do tempo. Como comentado anteriormente, estas alterações são denominadas
ani-mações. AnimaçõesemJava3Dtambémsãoimplementadasusandobehaviors. Java
3Ddisponibilizaalgunsconjuntosdeclasses,tambémbaseadasembehaviors, quesão
próprias para implementar animações. Um primeiro conjunto destas classes são os
interpoladores.
OsInterpolatorssãoversõesespecializadasdebehaviors usadosparageraruma
animaçãobaseadanotempo. Oprocessode animaçãoaconteceatravésde dois
ma-peamentos. No primeiro, um dadointervalode tempoé mapeado sobre ointervalo
fechadoI=[0.0, 1.0], a seguirI émapeado em um espaço de valorespertinente ao
objetodografodecenasquesedesejaanimar(porexemplo,atributosdeumobjeto
Shape3Douatransformadaassociadaaumobjeto TransformGroup).
Oprimeiromapeamentoéefetuado por umobjeto Alpha,quedeterminacomoo
temposerámapeadodeformaagerarosvaloresdointervaloI,denominadosvalores
alpha. Alphapode ser visto como uma aplicação do tempo que fornece osvalores
alphaemfunçãodosseusparâmetrosedotempo.
OsegundomapeamentoédeterminadoporumobjetoInterpolatorque,a
par-tir dos valores alpha, realiza a animação do objeto referenciado. O programador
podeprojetarseusprópriosinterpoladoresusandoosvaloresalphaparaanimar
obje-tos do mundo virtual. No entanto, Java 3D disponibiliza os Interpolators, que
atendem a maioria das aplicações (ColorInterpolator, PositionInterpolator,
RotationInterpolatorentre outros). O procedimento usado para adicionar um
objetoInterpolatorsegueumpadrãobásico,queindependedotipodeinterpolador
a ser usado: i) criar o objeto a ser interpolado, oobjeto-alvo; ii) criar um objeto
Alphaquedescrevecomogeraros valoresalpha; iii) criarumobjeto Interpolator
usandoAlphaeoobjeto-alvo;iv) atribuirumschedulingbound aoInterpolator;v)
anexaroInterpolatoraografodecenas;
ExistemaindaasclassesbillboardeLOD(LevelofDetail)quetambémpermitem
especicaranimações,masnesteconjuntodeclassesasalteraçõessãoguiadassegundo
aorientaçãoouposiçãodavista[23].
4.5Usando Java 3D
AAPIJava3Desuadocumentaçãosãoencontradasemhttp://java.sun.com/
products/java-media/3D/. ParasuautilizaçãoénecessáriooambienteJava2(SDK
1.2paraSolarisouSDKouJRE1.2.2paraWindows,ouversõesmaisrecentes). Para
plug-inpara atualizaramáquinavirtualJavadobrowserparaaversão2. Oplug-in
podeserobtidogratuitamente emhttp://java.sun.com/products/plugin.
Oconjunto decapacidadesincorporadoporJava3Dofereceumambientede
de-senvolvimentodealtonívelparaodesenvolvimentoemanipulaçãodecomplexas
apli-cações3D.Aprogramaçãodealtonível,noentanto,éobtidaescondendodo
progra-madordetalhesdemaisbaixonível,porexemplo,noprocessoderenderização,oque
implicamenosexibilidade. Emcontrapartidaprogramadorescompoucaexperiência
emprogramação3Dpodemcriarmaisfacilmentemundosvirtuaisemsuasaplicações.
Java3D,porserumaAPIdalinguagemJava,trabalhanoníveldestalinguagem
(linguagem de programação orientada a objetos de alto nível). No entanto, para
modelarambientes3D, aindaexistem possibilidades demais altonível, tais como a
VRML, que éessencialmente uma linguagemde script mais descritiva edireta que
Java3D.
5 VRML (Virtual Reality Modeling Language)
AlinguagemVRMLsurgiudanecessidadedeproverumformatográco3Dpara
a Web seguindo um modelo similar à HTML, ou seja, uma linguagem textual
in-dependente de plataforma para a descrição de cenas. A linguagem escolhida como
referência foi a Open Inventor da SGI. Em 1995 foi lançada a VRML 1.0, que era
basicamenteumformatoparaadescriçãodecenasestáticas3D.Em1997foilançada
aVRML 2.0(ou VRML 97)[25], que adicionou àlinguagemconceitos derealidade
virtual,taiscomo possibilidade demoverobjetos dacenaecriaçãodesensorespara
detectaregerareventos.
OprojetodaVRMLsemprefoiaberto. Asespecicaçõessãoescritasporum
con-sórcioenvolvendo várias empresas e pesquisadores acadêmicos e são imediatamente
disponibilizadaspara realimentação, sugestões e críticas de toda a comunidade
in-teressada. Até 1999,este consórciosechamavaVRML Consortium,edepoispassou
a se chamar Web 3D Consortium [29]. Sua principal atividade é a elaboração e
manutençãodenovospadrõesparaatransmissãodeconteúdotridimensionalatravés
daWeb. Dentreoutrastarefas,istoincluiumamelhorintegraçãoentreVRML,Java
3D,MPEG-4eoutrastecnologiasrelacionadas.
5.1Estruturahierárquica da cena
OparadigmaparaacriaçãodecenasVRML (tambémchamadasmundosVRML
VRMLworlds)ébaseadoemnós,quesãoconjuntosdeabstraçõesdeobjetosede
certasentidadesdomundoreal,tais comoformasgeométricas,luzesom.
AssimcomoemJava3D,ummundoVRML éumgrafohierárquicoem formade
árvore. As hierarquias sãocriadas atravésde nósde agrupamento, osquaiscontêm
denósemVRML[12]:
Agrupamento. Criam a estrutura hierárquica da cena e permitem que operações
sejamaplicadasaumconjuntodenóssimultaneamente. Algunsexemplosdesse
tipodenósão:
Transform. É umnódeagrupamento quedene umsistemade coordenadas
paraseuslhosqueestárelacionadocomosistemadecoordenadasdeseus
pais. Sobre este sistema de coordenadaspodem ser realizadas operações
detranslação,rotaçãoeescalonamento.
Anchor. ÉumnódeagrupamentoquerecuperaoconteúdodeumURLquando
o usuário ativa alguma geometria contida em algum de seus nós lhos
(pressionaobotão domousesobreeles,porexemplo).
Group. EquivalenteaonóTransformsemoscamposdetransformação.
Geométrico. Dene a formae aaparênciade umobjeto do mundo. Onó Shape,
em particular, possuidoisparâmetros: geometry,quedene aformado
obje-to e appearance, que dene aspropriedades visuaisdos objetos (material ou
textura). Alguns exemplos de nós geométricos (usados no campo geometry
do nó Shape) são: Box, Cone, Cylinder, Sphere, Text, IndexedLineSet e
IndexedFaceSet. Estes dois últimos descrevem, respectivamente, objetos 3D
a partir de segmentos de reta epolígonos cujos vértices estão localizados em
coordenadasdadas.
Appearance. Apareceapenas nocampoappearancede um nó Shapee é
respon-sávelpela denição daspropriedadesvisuaisdasgurasgeométricas(material
etextura).
Câmera. O nóViewpoint dene, entre outros parâmetros, aposição e orientação
dacâmera(pontodevistadousuário).
Iluminação. ExistemtrêstiposdenósdeiluminaçãoemVRML:DirectionalLight
(fonte deluzdirecionalcomraiosparalelos),PointLight(fontedeluzpontual
em umlocal xo)eSpotLight(conedirecionaldeiluminação).
Alémdessestiposbásicos,existemaindaosnóssensores,osinterpoladoreseonó
Script,queserãovistos maisadiante.
5.2Prototipação ereuso
Osmecanismosde prototipaçãodaVRML permitemdenirum novotipodenó
baseadonacombinaçãodenósjáexistentes. Épermitido,inclusive,acriaçãodecenas
distribuídas,poisosubgrafo(protótipo)podeserdenidoemumarquivoremotocujo
Atribuindo-se um nome a um nó através da palavra DEF, pode-se futuramente
referenciá-loatravésdapalavraUSE.Sendoassim,casosejanecessáriaareutilização
deummesmonóváriasvezesemumacena,émaisecienteatribuir-lheumnomena
primeiravezqueeleédescritoeposteriormentereferenciá-loporestenome.
Emresumo,VRMLpermiteoencapsulamento(protótipos)ereutilizaçãode
sub-grafosdacena. OexemploaseguirmostraumacenaVRMLsimples(2conesverdes),
utilizandoalgunsdosconceitosapresentadosatéaqui(aprimeiralinhadoarquivodeve
sersempre#VRML V2.0 utf8eoscomentáriosdevem começarcom#):
#VRML V2.0 utf8
# Posição da câmera (ou observador)
Viewpoint { position 0 0 10 }
# Fonte de luz pontual
PointLight{
color 1 1 1 # luz branca
location 0 0 2 # posição da fonte
on TRUE # está "ligada"
radius 20 }
Transform {
# Um cone é definido e posicionado na origem
children [
DEF Cone_Verde Shape {
geometry Cone {} # cone
appearance Appearance {
material Material {
diffuseColor 0 1 0 } # cor verde
}
}
# reutilização do cone
Transform {
translation 2 0 3 # posicionamento em (2 0 3)
children USE Cone_Verde }
]
}
5.3Tipos de parâmetrose roteamento de eventos
CadanóVRMLdeneumnome,umtipoeumvalordefaultparaseusparâmetros.
Hádois tiposde parâmetrospossíveis: campos (elds)e eventos(events). Campos
podemsermodicáveis(exposedFields) ounão (elds).
OseventospodemserenviadosparaoutrosnósporumparâmetrodotipoeventOut
e recebidos por um eventIn. Eventos sinalizam mudançascausadas por estímulos
externos e podem ser propagados entre os nós da cena por meio de roteamentos
move
start
a cada
pulso de
relógio
sobre um objeto
usuário clica
TouchSensor
calcula
função
nova
posição
interpolação
de
TimeSensor
PositionInterpolator
Nó geométrico
Figura5: RoteamentodeeventosemumainteraçãotípicadeVRML.
elessejameventosdomesmotipo.
5.4Sensores e interpoladores
Os nós sensores e interpoladores são especialmente importantes porque são os
responsáveispelainteratividadeedinamismodosmundos VRML.
Ossensores geram eventos baseadosnas açõesdo usuário. Onó TouchSensor,
porexemplo,detectaquandoousuárioacionaomousesobreumdeterminadoobjeto
(ougrupode objetos) dacena. OProximitySensor,porsuavez, detectaquandoo
usuárioestá navegandoem umaregião próximaao objeto de interesse. Ossensores
sãoresponsáveispelainteraçãocomousuário,masnãoestãorestritosagerareventos
a partirdeaçõesdosmesmos. OTimeSensor, porexemplo, gera automaticamente
um evento acadapulso dorelógio. OseventOuts geradospelos sensorespodemser
ligadosaoutroseventIns dacena, iniciandoumaanimação,porexemplo.
Aformamaiscomumdesecriaranimaçõeséusandokeyframes (quadros-chave),
especicandoosmomentos-chavenaseqüênciadaanimação.Osquadrosintermediários
são obtidosatravés da interpolação dos quadros-chave. Nós interpoladores servem
para denireste tipo de animação, associando valores-chave (de posição, cor, etc.)
queserãolinearmenteinterpolados. Algunsexemplosdeinterpoladoressão:
PositionInterpolator,OrientationInterpolator,ColorInterpolatore
CoordinateInterpolator.
Oseventos gerados por sensores einterpoladores, ligados a nós geométricos, de
iluminação ou de agrupamento, podem denir comportamentos dinâmicos para os
elementosdoambiente. Umexemplotípico(Figura5) érotear umTouchSensorem
um TimeSensor, causando o disparo do relógio quando o usuário clicar sobre um
objeto. OTimeSensor,porsuavez,éroteadoemuminterpolador,enviandoparaele
valoresdetempoparaafunçãode interpolação. Ointerpoladorentãoéroteado em
umnógeométrico,denindoasalteraçõesdesteobjeto.
5.5Nó Script
Apesar de serumrecurso poderoso, oroteamentode eventosentre osnósnão é
sucienteparaotratamentodeváriasclassesdecomportamento. Porexemplo,nãoé