Você está na página 1de 43

Programao Grca 3D com OpenGL, Open Inventor e Java 3D

A LESSANDRO L. B ICHO L UIZ G ONZAGA DA S ILVEIRA J R A DAILTON J. A. DA C RUZ A LBERTO B. R APOSO

Resumo: Este tutorial aborda trs tecnologias de domnio pblico nas reas de computao grca e animao por computador, enfocando ferramentas de programao para apoio ao desenvolvimento de sistemas grcos interativos. A primeira parte aborda a OpenGL, uma tecnologia de menor nvel de abstrao para a gerao de formas geomtricas e imagens. Na segunda parte estudado a Open Inventor, uma orientada a objetos construda sobre a OpenGL, contemplando funes mais sosticadas, como gerenciamento de janelas e manipulao de eventos. Finalmente, ser apresentada a Java 3D, que fortemente inspirada na Open Inventor. Ela a biblioteca padro da linguagem Java para a criao de programas com imagens tridimensionais, animao e interao com o usurio. Cabe salientar que este trabalho de carter introdutrio, com referncias a estudos avanados. Palavras-chaves: computao grca, animao por computador, realidade virtual, interao homemcomputador, OpenGL, Open Inventor, Java 3D. 1 Introduo Este tutorial uma introduo programao grca 3D, apresentando trs tecnologias que, embora com nveis de abstrao e funcionalidades diferentes, representam uma viso geral do variado espectro de ferramentas existentes. A primeira biblioteca apresentada a OpenGL, que uma API (Application Programmers Interface) aberta para o desenvolvimento de aplicaes grcas tridimensionais que pode ser incorporada a qualquer sistema de janelas (MS Windows, X Window, etc.). A independncia de sistema de janelas , ao mesmo tempo, uma vantagem e um fator limitante da OpenGL, j que, por causa disso, ele no oferece as funcionalidades de gerenciamento de janelas e manipulao de eventos. A Open Inventor surgiu para preencher essas e outras lacunas da OpenGL. A Open Inventor uma toolkit orientada a objetos, concentrando suas atenes na construo e estruturao de cenas 3D, utilizando a OpenGL para a renderizao 1 das cenas. A Open Inventor implementada em C/C++ e oferece uma interface de programao de mais alto nvel de abstrao que a OpenGL. Java 3D, por sua vez, foi desenvolvida para ser a API da linguagem Java para aplicaes envolvendo grcos e imagens tridimensionais. Da mesma forma que a Open Inventor, Java 3D se concentra na estruturao das cenas, deixando a renderizao a cargo de bibliotecas grcas de mais baixo nvel, como a OpenGL e a Direct3D. O
1 Renderizao a obteno da imagem a partir do modelo. neste processo que se adiciona, por exemplo, sombreamento, cores e iluminao cena.

formato de estruturao da cena em Java 3D (grafo de cena) , por sinal, inspirado no formato denido para a Open Inventor. A grande diferena da Java 3D em relao a Open Inventor o fato da primeira ser programada em uma linguagem Java e a segunda em C/C++, mas ambas utilizam OpenGL para renderizao da cena. Alm de serem tecnologias para a programao de aplicaes grcas 3D e terem os elos apontados acima, essas trs tecnologias tambm tm em comum o fato de estarem disponveis gratuitamente, facilitando seu uso e manuteno por uma vasta gama de usurios. 2 OpenGL2 Padres grcos, como o GKS (Graphical Kernel System [ANSI, 1985a]) e o PHIGS (Programmers Hierarchical Interactive Graphics System [ANSI, 1985b]), tiveram importante papel na dcada de 80, inclusive ajudando a estabelecer o conceito de uso de padres mesmo fora da rea grca, tendo sido implementados em diversas plataformas. Nenhuma destas APIs, no entanto, conseguiu ter grande aceitao [Segal, 1994]. A interface destinada a aplicaes grcas 2D ou 3D deve satisfazer diversos critrios como, por exemplo, ser implementvel em plataformas com capacidades distintas sem comprometer o desempenho grco do hardware e sem sacricar o controle sobre as operaes de hardware [Segal, 1996]. Atualmente, a OpenGL (GL signica Graphics Library) uma API de grande utilizao no desenvolvimento de aplicaes em computao grca [Neider, 1993]. Este padro o sucessor da biblioteca grca conhecida como IRIS GL, desenvolvida pela Silicon Graphics como uma interface grca independente de hardware [Kilgard, 1994]. A maioria das funcionalidades da IRIS GL foi removida ou reescrita na OpenGL e as rotinas e os smbolos foram renomeados para evitar conitos (todos os nomes comeam com ou ). Na mesma poca, foi formado o OpenGL Architecture Review Board, um consrcio independente que administra o uso da OpenGL, formado por diversas empresas da rea. OpenGL uma interface que disponibiliza um controle simples e direto sobre um conjunto de rotinas, permitindo ao programador especicar os objetos e as operaes necessrias para a produo de imagens grcas de alta qualidade. Para tanto, a OpenGL funciona como uma mquina de estados, onde o controle de vrios atributos realizado atravs de um conjunto de variveis de estado que inicialmente possuem valores default, podendo ser alterados caso seja necessrio. Por exemplo, todo objeto ser traado com a mesma cor at que seja denido um novo valor para esta varivel. Por ser um padro destinado somente renderizao [Segal, 1996], a OpenGL pode ser utilizada em qualquer sistema de janelas (por exemplo, X Window System ou MS Windows), aproveitando-se dos recursos disponibilizados pelos diversos hardwares grcos existentes. No X Window System, ela integrada atravs da GLX (OpenGL Extension for X), um conjunto de rotinas para criar e gerenciar um contexto de renderizao da OpenGL no X [Kilgard, 1994]. Alm da GLX, existem outras bibliotecas alternativas para interfaceamento no X, tais como GLUT (OpenGL Utility Toolkit [Kilgard, 1996]) e GTK [GTK+, 2002]. Estas bibliotecas possuem um conjunto de ferramentas que facilita a construo de programas utilizando a OpenGL. Podemos citar, por exemplo, funes para gerenciamento de janelas, rotinas para gerao de vrios objetos grcos 3D ou dispositivos de entrada de dados. Uma vantagem em se utilizar a GLUT que esta biblioteca compatvel com quase todas as implementaes OpenGL em Windows e X. Em aplicaes que requerem uma maior utilizao dos recursos do X, pode-se utilizar a GLUT juntamente com a GLX. Esta seo descreve as funcionalidades da OpenGL e, quando necessrio, apresenta algumas rotinas disponveis na GLX e na GLUT. 2.1 Objetos geomtricos OpenGL uma interface para aplicaes grcas que no possui rotinas de alto nvel de abstrao. Sendo assim, as primitivas geomtricas so construdas a partir de seus vrtices. Um vrtice representado em coordenadas homogneas (x, y, z, w). Se w for diferente de zero, estas coordenadas correspondem a um ponto tridimensional euclidiano (x/w, y/w, z/w). Assim como as demais coordenadas, pode-se tambm especicar um valor para a coordenada w. Mas isto raramente feito, sendo assumido o valor 1.0 como default. Alm disso, todos os clculos internos so realizados com pontos denidos no espao tridimensional. Portanto, os pontos bidimensionais especicados pelo usurio so trabalhados como pontos tridimensionais, onde a coordenada z igual a zero. Os segmentos de reta so representados por seus pontos extremos e os polgonos so reas denidas por um conjunto
2 Biblioteca

desenvolvida pela Silicon Graphics Inc.

de segmentos. Na OpenGL, alguns cuidados quanto denio de um polgono devem ser tomados: um polgono dever ser sempre convexo e simples (no poder haver interseo das suas arestas). A especicao de um vrtice feita atravs das funes 3 . Em muitas aplicaes grcas h a necessidade de denir polgonos no simples, cncavos ou com furos. Como qualquer polgono pode ser formado a partir da unio de polgonos convexos, algumas rotinas mais complexas, derivadas das primitivas bsicas, so fornecidas na GLU (OpenGL Utility Library [Neider, 1993]). Esta biblioteca utiliza somente funes padres e est disponvel em todas as implementaes da OpenGL. Para traar um conjunto de pontos, um segmento ou um polgono, os vrtices necessrios para a denio e . Pode-se adicionar tambm destas primitivas so agrupados entre as chamadas das funes informaes a um vrtice, como uma cor, um vetor normal ou uma coordenada para a textura, utilizando um e . importante salientar que a nmero restrito de funes da OpenGL vlidas entre o par restrio quanto utilizao apenas para as rotinas da OpenGL; outras estruturas de programao podero ser e . O argumento da funo indicar a ordem utilizadas normalmente entre o par como sero associados os vrtices, conforme ilustrado na Figura 1.
1 0 2 4 0 3 4 3 2 5 1 GL_LINES 0 7 2 4 6 1 3 6 GL_TRIANGLES 0 2 1 5 3 1 5 6 4 0 4 GL_LINE_LOOP 1 3 2 3 0 4 3 1 1 2 3 0 5 2 4 7 GL_POLYGON 5 1 4 GL_TRIANGLE_STRIP 2 0 GL_TRIANGLE_FAN GL_QUADS 3 4 6

GL_POINTS 3 1 0 5

GL_LINE_STRIP 4 5 7 0 8

GL_QUAD_STRIP

Figura 1: Primitivas geomtricas da OpenGL. Na OpenGL, uma primitiva pode ser traada de diferentes maneiras, conforme a ordem selecionada e o conjunto de vrtices denido. O trecho de cdigo a seguir apresenta um exemplo do traado de uma circunferncia.


O exemplo acima no o modo mais eciente para traar uma circunferncia, especialmente se esta primitiva for utilizada vrias vezes. Neste caso, o desempenho car comprometido porque h o clculo do ngulo e a execuo das funes e para cada vrtice, alm do overhead do loop. Poderamos solucionar este problema calculando as coordenadas dos vrtices uma nica vez e armazenando-os em uma tabela, ou utilizando uma rotina da GLU/GLUT, ou ainda criando uma display list (lista de instrues). A display list uma maneira eciente de armazenar um grupo de rotinas da OpenGL que sero executadas posteriormente. Quando uma display list invocada, as rotinas so executadas na ordem em que elas foram originalmente armazenadas. A maioria das rotinas da OpenGL pode ser armazenada em uma display list, exceptuando aquelas com passagem de parmetros por referncia ou que retornem um valor. A restrio adotada porque uma
3 O * ser utilizado neste texto para representar variantes no nome da funo; as variaes restringem-se ao nmero e/ou ao tipo dos argumentos por exemplo, denir um vrtice com trs coordenadas inteiras.

lista poder, por exemplo, ser executada fora do escopo de onde os parmetros foram originalmente denidos. Estas rotinas, aquelas que no pertencerem OpenGL e as variveis sero avaliadas no momento da compilao da lista, sendo substitudas por seus respectivos valores resultantes. Uma display list denida agrupando as instrues entre as funes e , de modo similar denio de uma primitiva geomtrica. O trecho de cdigo para traar a circunferncia pode ento ser reescrito utilizando uma lista, como apresentado a seguir.


O argumento um nmero inteiro que identicar a lista. O atributo indicar ao sistema que a lista ser compilada, porm o seu contedo no ser executado. Para ser executado o contedo de uma lista no . Quando for necessrio, a lista poder momento da compilao, utilizado o atributo ser invocada atravs da rotina . Uma outra alternativa para modelar objetos que so difceis de serem denidos atravs de vrtices utilizar rotinas fornecidas nas bibliotecas GLU e GLUT, como j mencionado anteriormente. Por exemplo, para traarmos uma esfera simplesmente executamos a rotina , onde os argumentos deniro o raio, o nmero de linhas longitudinais e o nmero de linhas latitudinais. 2.2 Visualizao Em computao grca, organizar as operaes necessrias para converter objetos denidos em um espao tridimensional para um espao bidimensional (tela do computador) uma das principais diculdades no desenvolvimento de aplicaes. Para isso, aspectos como transformaes, clipping e denio das dimenses de viewport (poro da janela onde a imagem desenhada) devem ser considerados. Transformaes so funes que mapeiam um ponto (ou vetor) em um outro ponto (ou vetor). Na OpenGL, elas so implementadas atravs de matrizes. Estas matrizes podem descrever uma modelagem, uma visualizao ou uma projeo, dependendo do contexto. Clipping a eliminao de objetos (ou partes de objetos) que esto situados fora do volume de visualizao. O enquadramento das imagens no viewport a operao de correspondncia entre as coordenadas transformadas e os pixels da tela. As matrizes de modelagem posicionam e orientam os objetos na cena, as matrizes de visualizao determinam o posicionamento da cmera e as matrizes de projeo determinam o volume de visualizao (anlogo escolha da lente para uma mquina fotogrca). Na OpenGL, as operaes com estas matrizes so realizadas atravs de duas pilhas: a pilha que manipula as matrizes de modelagem e de visualizao (modelview) e a pilha que manipula as matrizes de projeo (projection). As operaes de modelagem e de visualizao so trabalhadas na mesma pilha, pois pode-se posicionar a cmera em relao cena ou vice-versa, sendo que o resultado de ambas operaes ser o mesmo. A matriz atual4 da modelview conter o produto cumulativo das multiplicaes destas matrizes. Ou seja, cada matriz de transformao utilizada ser multiplicada pela matriz atual, e o resultado ser colocado como a nova matriz atual, representando a transformao composta. A pilha projection comporta-se da mesma maneira. Entretanto, na maioria das vezes esta pilha conter apenas duas matrizes: uma matriz identidade e uma matriz de projeo, pois um volume de visualizao pode ser denido por uma nica matriz de transformao.
4A

matriz atual aquela que est no topo da pilha.

A pilha de matrizes utilizada na OpenGL para facilitar a construo de modelos hierrquicos, onde objetos complexos so construdos a partir de objetos mais simples. Alm disso, a pilha um mecanismo ideal para organizar uma seqncia de operaes com matrizes. Segundo a metodologia de uma pilha de dados, a transformao especicada mais recentemente (a ltima a ser empilhada) ser a primeira a ser aplicada [Angel, 1997]. OpenGL possui um conjunto de rotinas que manipulam as pilhas e as matrizes de transformao. Abordaremos, de forma sucinta, as principais rotinas e suas utilizaes. A denio da pilha na qual se deseja trabalhar feita atravs da rotina , indicada pelo argumento ou . Aps denida a pilha, esta pode ser ento inicializada com a matriz identidade, atravs da rotina . Como default, toda pilha conter apenas a matriz identidade. Para o posicionamento da cmera ou de um objeto so utilizadas as rotinas e/ou , que denem respectivamente matrizes de rotao e de translao. Por default, a cmera e os objetos na cena so originalmente situados na origem do sistema de coordenadas da OpenGL. H tambm a rotina , que dene uma matriz de escalonamento. O controle sobre a pilha pode ser feito atravs das rotinas e . A rotina duplica a matriz atual, colocando a cpia no topo da pilha em questo. Este mtodo permite preservar o estado da pilha em um determinado momento para posterior recuperao, realizada por meio da rotina . O exemplo a seguir demonstra a utilizao destas rotinas. O trecho de cdigo desenha um automvel, assumindo a existncia das rotinas para desenhar o corpo do automvel, a roda e o parafuso.

Quanto denio do volume de visualizao, OpenGL prov duas transformaes de projeo: a perspectiva e a ortogonal. A projeo perspectiva dene um volume de visualizao onde a projeo do objeto reduzida a medida que ele afastado da cmera. Esta projeo fornecida na OpenGL atravs da rotina . O volume de visualizao calculado atravs de seis planos de corte, sendo os quatro planos que formam a janela (left, right, top e bottom), mais os planos near e far, como ilustrado na Figura 2.

Figura 2: O volume de visualizao da projeo perspectiva. A projeo ortogonal dene um volume de visualizao onde a projeo do objeto no afetada pela sua distncia em relao cmera. Esta projeo fornecida na OpenGL atravs da rotina . O volume de visualizao calculado de modo similar projeo perspectiva, atravs dos mesmos seis planos de corte. Os planos formaro um paraleleppedo, ilustrado na Figura 3.

Figura 3: O volume de visualizao da projeo ortogonal. Para estabelecer a rea na tela onde a imagem ser renderizada utilizada a rotina . Esta rotina poder distorcer a imagem caso a relao entre a altura e a largura da janela na tela no corresponda a mesma relao utilizada para denir a janela no volume de visualizao. Alm das matrizes de transformao denidas pela OpenGL, pode-se tambm atribuir ou multiplicar a matriz atual por uma determinada matriz de transformao especicada pelo usurio, respectivamente atravs das rotinas ou das rotinas . 6

2.3 Cor OpenGL possui dois modos diferentes para tratar cor: o modo RGBA e o modo indexado de cor [Neider, 1993]. A denio do modo de cor depender da biblioteca que o programa est utilizando para interfacear com o sistema de janelas. A GLUT, por exemplo, prov uma rotina denominada , onde a seleo feita ou . O default caso no seja especicado nenhum atravs dos parmetros dos modos. O modo RGBA possui as componentes vermelho, verde, azul e alfa, respectivamente. Os trs primeiros representam as cores primrias e so lineares (variando de 0.0 a 1.0), sendo muito teis para renderizar cenas realsticas. A componente alfa utilizada, por exemplo, em operaes de blending (mistura) e transparncia. Esta componente representa a opacidade da cor, variando de 0.0, onde a cor totalmente transparente, at 1.0, onde a cor totalmente opaca. Desta forma, o valor alfa no visvel na tela, sendo usado apenas para determinar como o pixel ser exibido. As rotinas so utilizadas para denir os valores para cada componente. O trecho de cdigo a seguir dene um tringulo no modo RGBA.


Cada vrtice do polgono foi denido com uma cor e o seu interior ser preenchido conforme o modo indicado . Pode-se indicar o modo , onde a cor do ltimo vrtice denido do atravs da rotina polgono ser utilizada como padro para toda a primitiva geomtrica, ou , sendo as cores para o interior do polgono calculadas a partir da interpolao das cores denidas para os vrtices (mtodo Gouraud shading) (ver Figura 4), sendo este ltimo modo o default da OpenGL.

Figura 4: Um tringulo desenhado no modo smooth. O modo indexado de cor utiliza um mapa de cores. Este mapa armazena em cada ndice os valores para cada componente primria (RGB). A cor trabalhada pelo ndice e no por suas componentes. OpenGL no tem rotinas especcas para alocao de cores, sendo o sistema de janelas responsvel por esta funo. No X, por exemplo, a rotina utilizada para alocao de cores. J a biblioteca GLUT prov a rotina , responsvel pela denio das componentes primrias para um determinado ndice no mapa de cores. As rotinas so usadas para selecionar o ndice da cor atual no mapa de cores.

2.4 Iluminao OpenGL utiliza o modelo de Gouraud para a tonalizao, provendo realismo cena. Uma cena renderizada levando-se em considerao alguns aspectos como, por exemplo, o tipo de fonte de iluminao que est sendo usada na cena e as propriedades do material para cada superfcie. Alguns efeitos complexos como a reexo da luz e sombra no so diretamente suportados, embora estejam disponveis cdigos-fonte na rede para simular tais efeitos. Para implementar o modelo de iluminao, a OpenGL decompe o raio luminoso nas componentes primrias RGB. Dessa forma, a cor para uma fonte de luz caracterizada pela percentagem da intensidade total de cada componente emitida. Se todas as componentes possurem o valor 1.0, a luz ser a mais branca possvel. Se todos os valores forem 0.5, ainda ser a cor branca, mas com uma intensidade menor. Para os materiais, os valores correspondem percentagem reetida de cada componente primria. Se a componente vermelha for 1.0, a componente verde for 0.5 e a componente azul for 0.0 para um determinado material, este reetir toda a intensidade da luz vermelha, metade da intensidade da luz verde e absorver a luz azul. Por exemplo, uma bola vermelha que receba a incidncia das luzes vermelha, verde e azul reetir somente a luz vermelha, absorvendo as luzes verde e azul. Caso seja incidida uma luz branca (composta por intensidades iguais das componentes vermelha, verde e azul), a superfcie da bola reetir apenas a luz vermelha e, por isso, a bola ser vista com esta cor. Mas caso seja incidida apenas uma luz verde ou azul, a bola ser vista com a cor preta, pois no haver luz reetida. Uma vez que um raio luminoso ser dividido nas suas componentes primrias RGB, a OpenGL considera ainda que esta diviso ser realizada para cada componente de luz do modelo de iluminao, que so: Componente ambiente. Componente proveniente de uma fonte que no possvel determinar. Por exemplo, a luz dispersa em uma sala tem uma grande quantidade da componente ambiente, pois esta luz resultante de multi-reexes nas superfcies contidas na cena. Componente difusa. Componente de luz reetida em todas as direes quando esta incide sobre uma superfcie, proveniente de uma direo especca. A intensidade de luz reetida ser a mesma para o observador, no importando onde ele esteja situado. Componente especular. Componente de luz reetida em uma determinada direo quando esta incide sobre uma superfcie, proveniente de uma direo especca. Uma superfcie como um espelho produz uma grande quantidade de reexo especular, assim como os metais brilhantes e os plsticos. Entretanto, materiais como o giz possui uma baixa reexo especular. O modelo de Phong utilizado para o clculo da reexo especular [Angel, 1997]. No modelo de iluminao da OpenGL, a luz na cena pode ser proveniente de vrias fontes, sendo controladas individualmente. Algumas luzes podem ser provenientes de uma determinada direo ou posio, enquanto outras podem estar dispersas na cena. Quanto aos tipos de fonte de iluminao, a OpenGL possui: Fontes pontuais. Fontes que irradiam energia luminosa em todas as direes. Fontes spots. Fontes pontuais direcionais, isto , tm uma direo principal na qual ocorre a mxima concentrao de energia luminosa; fora desta direo ocorre uma atenuao desta energia. Alm das fontes citadas anteriormente, a OpenGL prov uma luz que no possui uma fonte especca, denomi so utilizadas para especicar as propriedades da fonte de iluminao nada luz ambiente. As rotinas descrevem os parmetros do modelo de iluminao como, por exemplo, a luz e as rotinas ambiente. As fontes de luz somente tm efeito nas superfcies que deniram as suas propriedades do material. Da mesma maneira que a luz, os materiais tm diferentes valores para as componentes especular, difusa e ambiente, determinando assim suas reexes. Alm destas componentes, um material pode tambm emitir luz prpria, denida atravs da componente emitida. Uma reexo da componente ambiente do material combinada com a componente ambiente da luz, da mesma forma a reexo da componente difusa do material com a componente difusa da luz e similarmente para a reexo especular. As reexes difusa e ambiente denem a cor do material, enquanto a reexo especular geralmente produz uma cor branca ou cinza concentrada em um ponto do material. As rotinas so utilizadas para determinar as propriedades dos materiais. 8

Depois de denidas as caractersticas de cada fonte de luz e dos materiais, deve-se utilizar a rotina para habilitar cada fonte de luz previamente denida. Antes, entretanto, esta rotina deve ser utilizada com o parmetro , de modo a preparar a OpenGL para os clculos do modelo de iluminao. O trecho de cdigo a seguir ilustra a denio de um modelo de iluminao na OpenGL para traar uma esfera azul com o efeito do reexo da luz (brilho) concentrado em um ponto. Quanto maior o valor da varivel , maior ser a concentrao da luz e conseqentemente menor o ponto e maior o brilho. O resultado est demonstrado na Figura 5.

Figura 5: Exemplo do modelo de iluminao da OpenGL. 2.5 Textura Para realizarmos um mapeamento de textura na OpenGL, o procedimento utilizado segue um padro bsico, conforme descrito a seguir: 1. Especicar a textura. 2. Indicar como a textura ser aplicada para cada pixel. 3. Habilitar o mapeamento de textura. 4. Desenhar a cena, fornecendo as coordenadas geomtricas e as coordenadas de textura. 9

Na OpenGL, quando um mapeamento de textura realizado, cada pixel do fragmento a ser mapeado referencia uma imagem, gerando um texel. O texel um elemento de textura que representa a cor que ser aplicada em um determinado fragmento, tendo entre um (uma intensidade) e quatro componentes (RGBA) [Segal, 1994]. podendo, caso necessrio, ser esUma imagem de textura disponibilizada pelas funes pecicada em diferentes resolues atravs de uma tcnica denominada mipmapping. O uso de uma textura com multiresoluo recomendado em cenas que possuam objetos mveis. A medida que estes objetos se movem para longe do ponto de viso, o mapa de textura deve ser decrementado em seu tamanho na mesma proporo do tamanho da imagem projetada. Desta maneira, o mapeamento sempre utilizar a resoluo mais adequada para o fragmento. Para indicar como a textura ser aplicada para cada pixel, necessrio escolher uma das trs possveis funes que combinam a cor do fragmento a ser mapeado com a imagem da textura, de modo a calcular o valor nal para cada pixel. Pode-se utilizar os mtodos decal, modulate ou blend, de acordo com a necessidade do usurio. O controle do mapeamento da textura na rea desejada especicado atravs das rotinas , enquanto as rotinas determinam como a textura ser organizada no fragmento a ser mapeado e como os pixels sero ltrados quando no h um exato casamento entre os pixels da textura e os pixels na tela. Para desenhar a cena necessrio indicar como a textura estar alinhada em relao ao fragmento desejado. Ou seja, necessrio especicar as coordenadas geomtricas e as coordenadas de textura. Para um mapeamento de textura bidimensional, o intervalo vlido para as coordenadas de textura ser de 0.0 a 1.0 em ambas direes, diferentemente das coordenadas do fragmento a ser mapeado onde no h esta restrio. No caso mais simples, por exemplo, o mapeamento feito em um fragmento proporcional s dimenses da imagem de textura. Nesta situao, as coordenadas de textura so (0,0), (1,0), (1,1) e (0,1). Entretanto, em situaes onde o fragmento a ser mapeado no proporcional textura, deve-se ajustar as coordenadas de textura de modo a no distorcer a imagem. Para denir as coordenadas de textura utilizado as rotinas . Para habilitar o mapeamento de textura necessrio utilizar a rotina , utilizando a constante ou , respectivamente para um mapeamento unidimensional ou bidimensional. O trecho de cdigo a seguir demonstra o uso do mapeamento de textura. No exemplo, a textura que consiste de quadrados brancos e pretos alternados como um tabuleiro de xadrez gerada pelo programa, atravs da . O programa aplica a textura em um quadrado, como ilustrado na Figura 6. Muito rotina embora a OpenGL prov suporte para o mapeamento de texturas, este ainda um recurso bastante limitado, pois no existem facilidades para mapear imagens de outras fontes ( necessrio um programa auxiliar para converter uma imagem em uma representao aceita pela OpenGL).


10

Figura 6: Exemplo do mapeamento de textura em um quadrado. 2.6 Framebuffer Em uma aplicao, a rea utilizada para armazenar temporariamente os dados denominada buffer. Um conjunto de buffers de uma determinada janela de visualizao ou de um determinado contexto denominado framebuffer. Na OpenGL, h um conjunto de buffers que podem ser manipulados conforme a necessidade [Neider, 1993]: Buffers de cor. So normalmente utilizados para traar a imagem. Podem conter cores indexadas ou RGBA. Dependendo da aplicao, pode-se trabalhar com imagens estreo ou double buffering (dois buffers de imagem, um visvel e outro no), desde que o sistema de janelas e o hardware suportem. Como na OpenGL no h rotinas especcas para a produo de animaes, a utilizao de um double buffer uma opo. No X, por , que disponibiliza este recurso e na GLUT h a exemplo, h uma rotina denominada . Dessa forma, enquanto um quadro exibido na tela, o prximo quadro est rotina sendo renderizado no buffer no visvel. Buffer de profundidade. utilizado para armazenar, durante a renderizao, o pixel cuja profundidade (coordenada z) dada pela funo de comparao . Por exemplo, para realizar o algoritmo z-buffer, a funo pode escolher o pixel de menor coordenada z dentre os que tiverem as mesmas coordenadas x e y. Buffer Stencil (seleo). Serve para eliminar ou manter certos pixels na tela, dependendo de alguns testes disponibilizados para este buffer. muito utilizado em simuladores onde necessrio manter certas reas e alterar outras. Buffer de acumulao. utilizado para acumular um conjunto de imagens atravs de uma operao pr-especicada. A imagem resultante destas acumulaes exibida atravs da transferncia para um buffer de cor. Pode ser utilizado para trabalhar com diversas tcnicas como, por exemplo, antialiasing5, motion blur (borro) ou profundidade de campo. 3 Open Inventor6 Como vimos anteriormente, a OpenGL uma biblioteca que implementa um grande e completo conjunto de algoritmos para a produo de cenas 3D, tais como remoo de linhas escondidas, iluminao, tonalizao, desenho no framebuffer, etc. No entanto, a OpenGL foi projetada para ser independente dos sistemas de janelas e, portanto, no contempla o gerenciamento de janelas e nem a manipulao de eventos de entrada do usurio. Outras ausncias na OpenGL so a possibilidade de salvar e restaurar uma cena completa e de denir objetos grcos 3D de alto nvel. Tudo isso ca a cargo da aplicao, ou seja, o programador ter que implementar. Com isso, surge a necessidade de se desenvolver uma forma de estruturao e representao de objetos 3D, alm de um mecanismo para propiciar a juno entre a cena 3D e o sistema de janelas utilizado. A Silicon Graphics desenvolveu originalmente a toolkit IRIS Inventor 1.0 para a plataforma IRIX 7 [Strauss, 1992] [Strauss, 1993]. Em 1994, aps uma srie de revises na IRIS Inventor, a SGI lana a Open Inventor
5 Processo 6 Toolkit

empregado na reduo do efeito de serrilhado em linhas e curvas quando apresentadas, por exemplo, no monitor. desenvolvida pela Silicon Graphics Inc. 7 Implementao do Unix para estaes de trabalho da Silicon Graphics.

11

2.0 [Wernecke, 1994]. A Open Inventor contempla todas estas lacunas deixadas pela OpenGL. Ela uma toolkit orientada a objetos para o desenvolvimento de aplicaes interativas grcas 3D, dispondo tambm de um formato de arquivo de dados 3D padro para troca de informaes entre aplicaes e plataformas. A Open Inventor consiste essencialmente de:

um grafo de cena (ns) para representao da informao 3D, uma biblioteca de componentes e utilidades (Component Library) para auxiliar o uso da Open Inventor com sistemas de janelas e uma API C/C++ para a manipulao dos ns do grafos e componentes da toolkit.

Implementada em C/C++, a Open Inventor enfoca a criao de objetos 3D e oferece uma interface orientada a objetos com alto nvel de abstrao para o desenvolvimento de aplicaes interativas grcas 3D, concentrando suas atividades na construo e manipulao dos objetos. A Open Inventor oferece ainda uma biblioteca para a construo de interfaces grcas convencionais, com um completo modelo de eventos para interao 2D e 3D, eximindo o programador de conhecer a tediosa e difcil programao com bibliotecas grcas dos vrios sistemas de janelas. A Figura 7 exibe os mdulos principais da Open Inventor.
Aplicao Grfica 3D Biblioteca de Componentes Open Inventor Kits de Ns Manipuladores Formato de Dados 3D

Base de Dados de Cena Sistema de Janelas

OpenGL

Figura 7: Arquitetura da Open Inventor. A Open Inventor, como mostra a Figura 7, construda sobre a OpenGL e, portanto, funciona como uma API C++ para esta biblioteca, j que a utiliza para renderizao da cena 3D. O mecanismo de renderizao dentro da Open Inventor realiza chamadas ecientes de rotinas da OpenGL para gerar a cena 3D e, alm disso, tira proveito da ecincia desta biblioteca na renderizao das cenas. A Open Inventor uma toolkit independente do sistema de janelas. Mas, ao contrrio da primeira, j contempla uma biblioteca de componentes que realiza conexo com sistemas de janelas especcos. Vamos abordar aqui uma implementao da biblioteca de componentes, denominada Xt Component Library, que facilita a programao com a Open Inventor no X Window System [Wernecke, 1994]. 3.1 Base de dados e grafo de cena Uma cena na Open Inventor uma coleo ordenada de ns (objetos) chamada grafo de cena. Este grafo armazenado em uma base de dados interna da Open Inventor. O grafo e a base de dados de cena reconhecem todos os ns contidos na toolkit e novos ns adicionados pelo programador. A Figura 8 exibe um exemplo de grafo de cena. Um n, na Open Inventor, um bloco de construo bsico usado para criar uma cena 3D. Cada n especica um conjunto de campos que dene uma instncia de um objeto da Open Inventor como, por exemplo, formas geomtricas, atributos, cmeras, luzes, transformaes, etc. Ns especiais respondem diretamente a eventos do usurio e so utilizados para a manipulao direta da cena. Os ns podem ter nomes e seus campos podem ser conectados a campos de outros ns. Depois de construir o grafo, pode-se realizar algumas aes nele, tais como 12

Group

Separator Transform

Property

Transform

Shape

Figura 8: Exemplo de grafo de cena. renderizao, leitura/escrita, picking8 , busca, destaque, computao de bounding box9 , etc. Dentre as primitivas (ns) da base de dados incluem:

formas geomtricas (shapes nodes) - por exemplo, esferas, cubos, cilindros e malhas, propriedades (property nodes) - por exemplo, material, modelo de iluminao, texturas e grupos (group nodes) - por exemplo, separador, nvel de detalhes e deciso.

Alm destes ns bsicos, outras primitivas so denidas pela Open Inventor, como engines e sensores. Os engines so objetos que podem ser conectados a outros objetos e usados em animaes ou para a imposio de restries a partes da cena. Os sensores so objetos que detectam quando algo muda na base de dados e ativam alguma funo fornecida pela aplicao. Os kits de ns so mecanismos especiais da Open Inventor que facilitam a criao de agrupamento de ns na base de dados. Cada kit uma coleo de ns com um arranjo especco. Por exemplo, o kit de ns SoShapeKit pode conter um n cubo (SoCube), permitindo a denio de um material, uma transformao geomtrica e outras propriedades, quando necessrio. Um outro uso para o kit de ns denir objetos especcos para uma aplicao e suas semnticas dentro da aplicao. 3.2 A biblioteca de componentes e utilidades A biblioteca de componentes e utilidades est relacionada a interao e visualizao na Open Inventor, pois promove a juno entre a parte 3D e o sistema de janela, atravs do uso de janelas para visualizao da cena 3D e componentes GUI (Graphics User Interface) para interface da aplicao, bem como o tratamento de eventos de entrada e sada. A biblioteca de componentes , portanto, dependente do sistema de janela, apesar de conservar o mesmo look and feel10 para as vrias plataformas. No X temos a implementao da biblioteca de Xt/Components, que utiliza o Xt/Motif para gerao de janelas e tratamento de eventos. Esta biblioteca inclui uma rea de renderizao (para visualizao da cena renderizada), rotinas para inicializao de janelas e tratamento de eventos (Main Loop) e um conjunto de componentes usados para edio e interao com a cena ou com os objetos da cena, alm da manipulao dos parmetros de visualizao. A rea de renderizao aceita eventos do X, traduz estes eventos para eventos da Inventor e ento os repassa para os objetos, tais como os manipuladores (tipo especial de n que reage a eventos da GUI e podem ser editados pelo usurio). A biblioteca de componentes tambm contm um conjunto de editores e visualizadores, sendo
sobre um objeto para identicar que este pode ser selecionado. envoltria sobre o objeto. 10 aparncia.
9 caixa 8 click

13

utilizados para editar os ns da cena e fornecer a visualizao da cena de diversas formas. Alguns exemplos de componentes so: editor de material, editor de luz direcional, y viewer 11 e o examiner viewer 12 . 3.3 Um tour pela Open Inventor A informao retida no grafo de cena, dentro da base de dados, pode ser utilizada para vrios ns, no entanto, a maioria das aplicaes objetivam visualizar uma imagem dos objetos 3D na tela, bem como permitir a interao do usurio com a cena. Assim, vamos construir um conjunto de exemplos que mostra um cone vermelho em uma janela. Este exemplo ser gradualmente incrementado para demonstrar o uso de importantes objetos e funcionalidades da Open Inventor, tais como instanciao de objetos geomtricos, transformaes geomtricas, agrupamento de objetos, denio de propriedades para os objetos engines, manipuladores e componentes. Al Cone O cdigo mostrado abaixo constri um grafo de cena com uma cmera, uma luz, um material e um cone. Vamos segmentar este primeiro exemplo para explicar todas as suas partes (os demais exemplos sero colocados por completo). Todo programa Open Inventor deve conter alguns include que indicam os prottipos das classes e rotinas da Open Inventor e bibliotecas auxiliares. Vejamos que include necessitamos neste exemplo:

A inicializao da Open Inventor, com a criao da janela principal da aplicao, feita atravs das seguintes linhas de cdigo:

Observe que o passado para o mtodo , a m de nomear a janela. Se o programa no obtiver sucesso na inicializao da Open Inventor e da criao da janela principal, o programa abortado (retorna ), seno a janela construda e o programa segue. J a construo de fato da cena 3D realizada pelas seguintes linhas de cdigos:

Observe a criao de um grupo raiz, ao qual so adicionados uma cmera, um n para denio da aparncia do objeto (material de cor vermelha), uma luz tipo direcional e um cone. Assim, teremos um cone vermelho! Agora, resta criar uma rea de renderizao para mostrar o grafo de cena que ir ser colocada dentro da janela principal criada anteriormente.
11 Simula 12 Usa

um vo atravs da cena. um trackball virtual para rotacionar o grafo da cena em torno de um ponto de interesse.

14

Ajusta-se a cmera para visualizar a cena inteira do grafo.

Coloca-se a cena na rea de renderizao e altera-se o seu ttulo usando as seguintes linhas:

Por m, exibe-se a janela principal e coloca-se o tratador de eventos para processar os eventos de entrada provenientes do usurio da aplicao:

O arquivo completo deste primeiro exemplo o seguinte:

15

Este exemplo inicial ilustra os passos bsicos para se construir um programa usando a Open Inventor. O resultado do programa mostrado na Figura 9.

root

myCamera

DirLight

myMaterial

Cone

Figura 9: Cone vermelho e o grafo da cena. Um pouco de animao Fazendo-se o cone rotacionar continuamente na cena, ilustramos o uso de engines para a realizao de animao de cenas 3D. Este processo realizado atravs de uma ligao entre um engine e um campo angle de um n SoRotationXYZ no grafo de cena. O engine muda o campo angle em resposta a mudana do clock, que por sua vez causa uma rotao contnua no cone.


16

O resultado do programa mostrado na Figura 10. Observe que ao executar este programa obtm-se um resultado muito melhor, pois a Figura 10 infelizmente no consegue mostrar a animao resultante!

root

myCamera

DirLight

myRotXYZ

myMaterial

Cone

Real Time

myCounter

Figura 10: Exemplo de engines e o grafo da cena. Manipulao direta 3D Em aplicaes grcas interativas 3D imprescindvel a existncia de mecanismos/ferramentas pelos quais o usurio possa manipular a cena diretamente, seja alterando os objetos da cena ou os parmetros de visualizao (navegao). Assim, vamos comear ilustrando um n especial denominado manipulador (trackball virtual), atravs do qual conseguimos manipular os objetos na cena com um mouse ou outro dispositivo de entrada. O trackball aparece na cena em forma de trs anis ao redor do cone. Quando o primeiro boto do mouse pressionado sobre

17

o manipulador, este muda seus atributos, aparecendo em destaque (ativo). Enquanto o manipulador estiver ativo, o mouse usado para rotacionar o cone. Vejamos o programa:

Devido rea de renderizao ter um sensor associado ao grafo da cena, ela automaticamente renderizada todas as vezes que a cena alterada. Este mecanismo faz com que o cone parea se mover, como de fato ocorre, quando uma manipulao feita com o trackball. A Figura 11 exibe o resultado do programa, com o manipulador tipo trackball. Navegando atravs da cena Voltando ao primeiro exemplo, trocamos o n SoXtRenderArea por um componente denominado SoXtExaminerViewer. Este componente fornece mecanismos para o usurio da aplicao alterar a posio e a orientao da cmera 18

root

myCamera

DirLight

Trackball

myMaterial

Cone

Figura 11: Manipulador tipo trackball, juntamente com o grafo da cena. na cena (parmetros de visualizao) diretamente com o mouse, possibilitando a visualizao do cone de diversos ngulos e posies. A diferena deste exemplo para o anterior que neste a cmera est se movendo, ao contrrio do trackball, onde o objeto que se move.

19

Observe pela Figura 12 que neste exemplo a janela principal oferece um conjunto de ferramentas para explorao da cena, atravs de botes e dials que captam eventos externos (normalmente do usurio) e repassa para a Open Inventor.

root

myMaterial

Cone

Figura 12: Componente Examiner Viewer e o grafo da cena. 3.4 Formato de Dados 3D O formato de dados (de arquivo) da Open Inventor um padro da Silicon Graphics para troca de informao 3D entre diferentes aplicaes e plataformas. Ele suporta tanto arquivo binrio quanto arquivo ASCII. A extenso usada para arquivos da Open Inventor .iv. Qualquer arquivo da Open Inventor deve possuir um cabealho padro para identic-lo (primeira linha do arquivo):


ou

Os ns no arquivo contm os seguintes elementos: nome, abre-chaves ({), campos (se houver) seguidos de seus ns lhos (se houver) e fecha-chaves (}). Por exemplo,

Note a presena do Separator, utilizado para agrupar alguns ns dentro da cena. Neste caso, as transformaes de rotao e translao estaro restritas ao escopo dos objetos daquele n e dos seus lhos, se existirem. Alm destes elementos descritos acima, o arquivo da Open Inventor suporta todos os elementos presentes no grafo de cena. Esta forte correlao extremamente importante e interessante, pois permite-nos pensar indistintamente sobre o grafo de cena e o formato de arquivo 3D da Open Inventor. Ou seja, o contedo de um arquivo nada mais do que o contedo de um grafo de cena. 20

A Open Inventor possui um conjunto de objetos (e mtodos) que lem grafos de cena de um arquivo, armazenando-os na base de dados e vice-versa, conseguindo tambm gravar em arquivo grafos (ou sub-grafos) de cena armazenados na base de dados. Vejamos, por exemplo, um fragmento de cdigo usado para ler um arquivo Open Inventor:

Observe que a funo retorna um apontador para o n raiz da cena contida no arquivo lido. Assim, a cena pode ser visualizada facilmente, bastando associar o n em questo a uma rea de renderizao ou a um componente examiner viewer. 4 Java 3D13 Java 3D uma interface criada para o desenvolvimento de aplicaes grcas tridimensionais em Java, executada no topo de bibliotecas grcas de mais baixo nvel, tais como OpenGL e Direct3D, conforme ilustra a Figura 13. De forma mais precisa, Java 3D um componente da Sun Microsystems Inc., junto com as vrias tecnologias multimdia e grcas suportadas pela extenso padro Java Media Framework, para o desenvolvimento de aplicaes (aplicativos e/ou applets) 3D. Com isto, os programadores de aplicaes passam a explorar, agora no mbito das aplicaes grcas tridimensionais, o conjunto de facilidades e vantagens da plataforma Java, como orientao a objetos, segurana e independncia de plataforma. Em particular, a orientao a objetos oferece uma abordagem de alto nvel programao e possibilita que o desenvolvedor se dedique mais criao do que aos problemas de mais baixo nvel pertinentes programao 3D, os quais exigem um esforo considervel. Por essa razo, programadores no familiarizados com tais detalhes podem tambm explorar o universo 3D em suas aplicaes. Esta tecnologia grca vem ainda ao encontro de uma crescente demanda por operaes 3D requisitada hoje pela Web. Neste sentido, Java 3D se apresenta como uma soluo fortemente vivel, considerando que a mesma disponibiliza uma interface robusta para Web. Estas caractersticas facilitam e agilizam o desenvolvimento de aplicaes 3D mais complexas, uma vez que a reutilizao uma realidade e a compatibilidade com diferentes plataformas uma das premissas bsicas de Java. Java 3D utiliza alguns conceitos que so comuns a outras tecnologias, tais como a Open Inventor. Uma aplicao Java 3D projetada a partir de um grafo de cena contendo objetos grcos, luz, som, objetos de interao, entre outros, que possibilitam ao programador criar mundos virtuais com personagens que interagem entre si e/ou com o usurio [Sowirzal, 1998]. Descrever uma cena usando um grafo tarefa mais simples do que construir a
13 Biblioteca

desenvolvida pela Sun Microsystems Inc.

21

Figura 13: Relao entre as vrias camadas de software no contexto de Java 3D. mesma usando linhas de comando que especicam primitivas grcas, tais como as da OpenGL. Esta abordagem de mais alto nvel valoriza signicativamente a produtividade dos desenvolvedores e facilita em muito a tarefa dos programadores com pouca experincia em programao 3D. O conjunto de ferramentas oferecidas por Java 3D possibilita, alm de construir uma cena 3D a partir de um programa, que esta seja carregada de um arquivo externo, assim como faz a Open Inventor. Este conjunto de propriedades d a Java 3D grande exibilidade, fazendo dela uma plataforma vivel para diferentes aplicaes grcas. A literatura cita aplicaes em visualizao molecular, visualizao cientca, realidade virtual, sistemas de informao geogrca, animao, entre outros [Sowizral, 1999]. Antes de comearmos a estudar Java 3D, importante fazer uma breve introduo da linguagem Java. 4.1 Java Java pode ser usada tanto para o desenvolvimento de programas independentes quanto para o de applets, que so executados dentro de um ambiente hospedeiro (o browser). Os applets so tratados pelo browser como qualquer outro tipo de objeto da pgina HTML, como uma imagem ou um vdeo: ele transmitido do servidor para o cliente, onde executado e visualizado dentro do browser. Java uma linguagem orientada a objetos de propsito geral (semelhante a C++) e projetada para ser simples. Todos os recursos considerados desnecessrios foram deixados de fora da linguagem. Java no possui, por exemplo, apontadores, estruturas, vetores multi-dimensionais e converso implcita de tipos. Tambm no h necessidade de gerenciamento de memria em Java, pois ela tem um programa interno (garbage collector) que automaticamente libera partes ocupadas da memria que no tero mais uso. Outra caracterstica essencial de Java ser independente de plataforma. O cdigo-fonte de um programa Java pr-compilado em bytecodes, que so conjuntos de instrues semelhantes ao cdigo de mquina, mas sem serem especcos de qualquer plataforma. As instrues em bytecodes so vericadas na mquina local antes de serem executadas, garantindo a segurana da linguagem. Os bytecodes podem ser interpretados por Mquinas Virtuais Java (JVMs Java Virtual Machines) instaladas em qualquer plataforma, sem necessidade de recompilao do programa. Praticamente todos os browsers j incorporam a JVM em sua implementao. 4.2 O grafo de cena em Java 3D O primeiro procedimento na elaborao de uma aplicao Java 3D denir o universo virtual, que composto por um ou mais grafos de cena. O grafo de cena uma estrutura do tipo rvore cujos ns so objetos instanciados das classes Java 3D e os arcos representam o tipo de relao estabelecida entre dois ns. Os objetos denem a geometria, luz, aparncia, orientao, localizao, entre outros aspectos, tanto dos personagens quanto do cenrio que compem um dado mundo virtual. A Figura 14 ilustra um possvel exemplo de um grafo de cenas. Nos prximos pargrafos discute-se, entre outros aspectos, os tipos de ns que esto representados nesta gura. Foge do escopo deste texto uma abordagem mais prxima dos construtores de cada tipo de n, para este m sugere-se [Sun 22

Microsystems, 2001]. Na seo 4.2 mostra-se um procedimento bsico que pode ser empregado na construo de programas Java 3D e um primeiro exemplo de cdigo.

Figura 14: Grafo de uma cena em Java 3D. Os grafos de cenas (ou subgrafos) so conectados ao universo virtual (representado na Figura 14 atravs do n . Um n pode ter um ou mais ns , cuja nalidade fornecer um sistema de coordenadas ao mundo virtual. O n raiz de um grafo de cena (branch . graph) sempre um objeto Os branch graphs so classicados em duas categorias: de contedo (content branch graph) e de vista (view branch graph). Os content branch graphs descrevem os objetos que sero renderizados, i.e., especicam a geometria, textura, som, objetos de interao, luz, como estes objetos sero localizados no espao, etc. (na Figura 14 o ramo esquerda do n ). Os view branch graphs especicam as atividades e os parmetros relacionados com o controle da vista da cena, tais como orientao e localizao do usurio (na gura o ramo direita do n ). Os branch graphs no determinam a ordem em que os objetos sero renderizados, mas sim o que ser renderizado. Um caminho entre o n raiz do grafo de cenas at um de seus ns folha determina de forma nica todas as informaes necessrias para se processar este n. Assim, uma forma 3D depende somente das informaes do seu caminho para ser renderizada. O modelo de renderizao de Java 3D explora este fato renderizando os ns folha em uma ordem que ele determina ser a mais eciente. Em geral, o programador no se preocupa em determinar uma ordem de renderizao, uma vez que Java 3D far isto da forma mais eciente. No entanto, um , que assegura que programador poder exercer, de forma limitada, algum controle usando um n seus lhos sero renderizados em uma ordem pr-denida, ou um n , que seleciona um ou mais lhos a serem renderizados. O modelo de renderizao mais largamente discutido em [Brown, 1999]. Java 3D organiza o universo virtual usando o conceito de agrupamento, i.e., um n mantm uma combinao de outros ns de modo a formar um componente nico. Estes ns so denominados . Um n pode ter uma quantidade arbitrria de lhos que so inseridos ou removidos dependendo do que se pretende realizar. Dis, e . Inserem-se ainda nesta categoria os ns cutimos anteriormente os ns , que so usados para alterar a localizao, orientao e/ou escala do grupo de ns descendentes.

) por meio de um n

23

A Figura 15 mostra alguns nveis da hierarquia de classes dos componentes que compem um grafo de cenas.

Figura 15: Hierarquia de classes de alguns componentes de uma cena Java 3D. . Estes ns so usados Um n que no possui lhos pertence a uma segunda categoria e denominado n para especicar luz, som, procedimentos de interao, forma dos objetos geomtricos, orientao e localizao ou do observador no mundo virtual, entre outros. Estas informaes esto armazenadas no prprio n que mantm os dados necessrios para o processo ento feita uma referncia a um objeto no fazem parte do grafo de cenas, i.e., a relao entre um n de renderizao. Os objetos e um no do tipo pai-lho, mas de referncia. Este fato possibilita que diferentes ns referenciem um mesmo sem violar as propriedades do grafo de cenas, que um grafo direcionado acclico. podem ser citados: , , , e . Como exemplos de ns Ns so usados para construir formas 3D a partir de informaes geomtricas e atributos que esto (na Figura 14, so os elementos referenciados por arcos tracejados armazenados em um objeto so usados na manipulao de eventos a prxima seo aborda detalhadamente este tpico). Os ns disparados pelo usurio e na animao de objetos do universo virtual, as Sees 4.4 e 4.5 fornecem as informaes bsicas sobre como estes objetos podem ser especicados em um programa Java 3D. Um n usado para denir a localizao e orientao do observador (ou do usurio) no mundo virtual. Um programa Java 3D pode fazer o observador navegar pelo mundo virtual aplicando transformaes de translaes, rotaes e escalonamentos neste n. Ao contrrio das APIs que possuem apenas o modelo de vista que simulam uma cmera (denominado camerabased), Java 3D oferece um sosticado modelo de vista que diferencia claramente o mundo virtual do mundo fsico. O o nico n presente no grafo de cenas que faz referncias aos objetos que denem , , , e ). Essa associao este mundo fsico ( entre o mundo virtual e o fsico possibilita o desenvolvimento de aplicaes que exigem um nvel de controle e um sincronismo entre estes ambientes, como por exemplo aplicaes de realidade virtual. Para uma descrio detalhada do modelo de vista de Java 3D vericar [Sun Microsystems, 2001]. Escrevendo um programa em Java 3D A estrutura tpica de um programa Java 3D em geral tem dois ramos: um view branch e um content branch. Assim, escrever um programa em Java 3D requer basicamente criar os objetos necessrios para construir os ramos

24

(as super-estruturas para anexar os ), construir um view branch e um content branch. Um bom ponto de partida a seqncia de passos sugerida por [Sun Microsystems, 2002]: 1. Criar um objeto

e anex-lo ao

2. Criar um objeto 3. Criar um objeto

4. Construir um grafo view branch

(b) Criar um objeto (c) Criar um objeto (d) Criar um objeto


(e) Anexar os objetos criados em (b), (c) e (d) ao objeto 5. Construir um ou mais grafos content branch 6. Compilar o(s) branch graph(s) 7. Inserir os subgrafos ao n

(a) Criar um objeto

A construo do grafo view branch (item 4 acima) mantm a mesma estrutura para a maioria dos programas Java3D. Uma forma de ganhar tempo usar a classe denida no pacote . Esta classe cria todos os objetos necessrios para a composio de um view branch. O construtor retorna um universo virtual com os ns (item 2 acima), (item 3), e os objetos relativos ao item 4. A seguir apresentado o cdigo completo de uma aplicao cuja utilidade se limita a ser um exemplo didtico. radianos no Seu objetivo criar um grafo de cenas, ilustrado na Figura 16, que desenha um cubo rotacionado de radianos no eixo y (ver Figura 17). Procura-se evidenciar os passos da seqncia dada anteriormente eixo x e e fornecer comentrios que contribuam para o entendimento do Exemplo01 (adaptado de [Sun Microsystems, 2002]):

Figura 16: Grafo de cena do Exemplo01.

25

26

Figura 17: Imagem produzida pelo Exemplo01. Congurando as capacidades de um objeto Java 3D O grafo de cenas Java 3D pode ser convertido para uma representao interna que torna o processo de renderizao mais eciente. Esta converso pode ser efetuada anexando cada branch graph a um n , tornando-os vivos (live) e, conseqentemente, cada objeto do branch graph dito estar vivo. A segunda maneira compilando cada branch graph, usando o mtodo , de forma a torn-los objetos compilados. Uma conseqncia de um objeto ser vivo e/ou compilado que seus parmetros no podem ser alterados a menos que tais alteraes tenham sido explicitamente codicadas no programa antes da converso. A lista de parmetros que podem ser acessados denomominada capabilities e varia de objeto para objeto. O exemplo a seguir cria um n e congura-o para escrita. Isto signica que o valor da transformada associada ao objeto poder ser alterada mesmo depois dele tornar-se vivo e/ou compilado.


4.3 Modelagem . O n Um objeto 3D uma instncia da classe , representado no grafo de cenas por um n do tipo no contm os atributos que denem o objeto 3D, tais como seu contedo geomtrico e sua aparncia (cor, transparncia, tipo de material, textura, entre outros). Estes atributos esto armazenados em objetos do tipo . Um objeto pode ser denido pela frmula Shape3D = geometria + aparncia. Em Java 3D este objeto pode ser instanciado pelo construtor:

Uma alternativa denir um objeto 3D como sendo uma extenso da classe , o que bastante til quando se deseja criar mltiplas instncias do objeto 3D com os mesmos atributos. Um pseudo-cdigo para esta nalidade pode ter a seguinte organizao: 27

Denindo a geometria de um objeto 3D Para que um objeto 3D seja funcional necessrio especicar pelo menos seu contedo geomtrico. Java 3D oferece basicamente trs maneiras de se criar um contedo geomtrico. O primeiro mtodo o mais simples e consiste no emprego de primitivas geomtricas, tais como Box, Sphere, Cylinder e Cone, cuja composio determina a forma do objeto desejado. Por exemplo, um haltere pode ser a soma das seguintes primitivas: esfera + cilindro + esfera. Cada primitiva possui um mtodo construtor onde so especicadas as dimenses do objeto (ou ento estes so instanciados com dimenses default). Por exemplo, mostrado a seguir um trecho de cdigo para criar uma caixa, centrada na origem, com aparncia e de dimenses , , , que especicam comprimento, largura e altura respectivamente:

Em razo da limitao inerente a este mtodo como, por exemplo, a impossibilidade de alterao da geometria das primitivas, ele no o mais apropriado para modelar a geometria de um objeto 3D mais complexo. Um segundo mtodo permite que o programador especique outras formas geomtricas para um objeto 3D em alternativa s formas pr-denidas discutidas acima. Neste mtodo, os dados geomtricos que modelam a forma do objeto 3D (primitivas geomtricas denidas pelo programador) so especicados vrtice a vrtice em uma estrutura vetorial. Esta estrutura denida usando as subclasses de como por exemplo: dene um vetor de vrtices, dene um vetor de segmentos, dene um vetor de dene um vetor de vrtices onde cada quatro vrtices correspondem a um tringulos individuais e quadrado individual. Estes polgonos devem ser convexos e planares. permite denir atravs de suas subclasses ( , A subclasse e ) estruturas geomtricas que compartilham o uso dos vrtices especicados. Um objeto dene uma lista de segmentos conectados, um objeto dene uma lista de tringulos, onde cada dois tringulos consecutivos possuem uma aresta dene uma lista de tringulos onde cada dois tringulos consecutivos em comum e um objeto possuem uma aresta em comum e todos compartilham um mesmo vrtice (Figura 18).

28

Figura 18: Objetos array e strip. Um objeto pode armazenar, alm das coordenadas de localizao, coordenadas do vetor normal superfcie, coordenadas de cores e de texturas. . O cdigo a seguir exemplica como construir a geometria de um objeto usando a classe

No exemplo acima foi necessrio especicar 4 vrtices para denir um quadrado. Se o objeto a ser modelado fosse um cubo seria necessrio especicar 4 x 6 = 24 vrtices. Certamente existe uma grande redundncia, pois um cubo tem apenas 8 vrtices. Uma forma alternativa de denir esta geometria, eliminando esta redundncia, (subclasse de ). Como o prprio nome sugere, um usar a classe 29

objeto precisa, alm do vetor de dados, de um vetor de ndices para fazer referncias aos elementos do vetor de dados. Voltando ao exemplo do cubo, um possvel pseudo-cdigo seria:

As alternativas apresentadas no segundo mtodo so mais satisfatrias que as apresentadas no primeiro. Elas oferecem ao programador mais exibilidade na denio da forma dos objetos, mas ainda pesam contra elas algumas desvantagens. A criao de um contedo geomtrico mais elaborado vai exigir grande quantidade de tempo e de linhas de cdigo para computar matematicamente ou especicar a lista de vrtices do objeto de interesse. Este baixo desempenho no motivar o programador a desenvolver formas mais sosticadas. Ainda com relao a esta abordagem de denir a forma do objeto 3D usando fora bruta, Java 3D disponibiliza um pacote que oferece algumas facilidades neste processo. Por exemplo, ao invs de especicar exaustivamente as coordenadas, tringulo a tringulo, especica-se um polgono arbitrrio P (que pode ser no-planar e com buracos) usando um objeto , e a seguir efetua-se a triangulao de P usando um objeto , como exemplica o trecho de cdigo a seguir.

A triangulao de um polgono no-planar pode gerar diferentes superfcies, de modo que o resultado obtido pode no ser o desejado. Isto leva o programador a um processo de tentativas at obter a forma desejada. Estes problemas mostram que escrever universos virtuais 3D complexos no uma tarefa trivial. Felizmente, Java 3D tambm oferece um terceiro mtodo, baseado na importao de dados geomtricos criados por outras aplicaes, que resolve em grande parte os problemas citados anteriormente. Neste tipo de abordagem comum usar um software especco para modelagem geomtrica que oferea facilidades para criar o modelo desejado. Feito isto, o contedo geomtrico ento armazenado em um arquivo de formato padro que posteriormente ser importado para um programa Java 3D, processado e adicionado a um grafo de cenas. O trabalho de importao destes dados para um programa Java 3D realizado pelos loaders. Um loader sabe como ler um formato de arquivo 3D padro e ento construir uma cena Java 3D a partir dele. Existe uma grande variedade de formatos disponveis na Web, por exemplo o formato VRML (.wrl), Wavefront (.obj), AutoCAD (.dfx), 3D Studio (.3ds), LightWave (.lws), entre outros. Uma cena Java 3D pode ainda ser construda combinando diferentes formatos de arquivo. Para isso suciente usar os loaders correspondentes. Por m, vale observar que estes loaders no fazem . Maiores detalhes parte da Java 3D, so implementaes da interface denida no pacote sobre como escrever um loader para um dado formato de arquivo so mostrados em [Sun Microsystems, 2002]. Denindo a aparncia de um objeto 3D Um n pode, opcionalmente, referenciar um objeto para especicar suas propriedades, tais como textura, transparncia, tipo de material, estilo de linha, entre outros. Estas informaes no so mantidas no que mantm tais informaes (ver Figura objeto , que faz referncia a outros objetos 19). 30

Figura 19: Subgrafo da cena relativa ao Exemplo02 (descrito a seguir).

. Alguns exemplos, Estas propriedades, ou atributos, so denidas usando as subclasses de entre as vrias subclasses existentes, so: , e . Um objeto usado para denir a largura em pixels da linha, seu padro (linha solida, tracejada, pontilhada ou tracejada-pontilhada) e tratamento de antialiasing (habilita ou desabilita). Um objeto dene, por exemplo, como os polgonos sero renderizados (preenchido, wireframe ou apenas os vrtices). Um objeto dene a cor dos objetos e o modelo de shading. O exemplo02 a seguir emprega os mtodos das subclasses discutidas no pargrafo anterior para especicar os atributos de linha, polgono e cor para um objeto 3D qualquer. O grafo de cena resultante mostrado na Figura 19.


4.4 Interao Programar um objeto para reagir a determinados eventos uma capacidade desejvel na grande maioria das aplicaes 3D. A reao resultante de um certo evento tem por objetivo provocar alguma mudana no mundo virtual que depender da natureza da aplicao e ser determinada pelo programador. Por exemplo, um evento poderia ser pressionar uma tecla, o movimento do mouse ou a coliso entre objetos, cuja reao seria alterar algum objeto (mudar cor, forma, posio, entre outros) ou o grafo de cenas (adicionar ou excluir um objeto). Quando estas 31

alteraes so resultantes diretas da ao do usurio elas so denominadas interaes. As alteraes realizadas independentemente do usurio so denominadas animaes [Sun Microsystems, 2002]. . Esta classe dispoJava 3D implementa os conceitos de interao e animao na classe abstrata nibiliza ao desenvolvedor de aplicaes 3D uma grande variedade de mtodos para capacitar seus programas a perceber e tratar diferentes tipos de eventos. Permite ainda que o programador implemente seus prprios mtodos (ver seo seguinte). Os behaviors so os ns do grafo de cena usados para especicar o incio da execuo de , ou uma determinada ao baseado na ocorrncia de um conjunto de eventos, denominado seja, quando determinada combinao de eventos ocorrer Java 3D deve acionar o behavior correspondente para que execute as alteraes programadas. , condio usada para disparar um behavior, consiste de uma combinao de objetos Uma , que so os objetos Java 3D usados para denir um evento ou uma combinao lgica de eventos. , sempre fazendo referncia a um objeto do Os behaviors so representados no grafo de cena por um n grafo. atravs deste objeto, denominado objeto alvo, e em geral representado por um , que os behaviors promovem as alteraes no mundo virtual. Estrutura de um behavior Todos os behaviors so subclasses da classe abstrata . Eles compartilham uma estrutura bsica composta de um mtodo construtor, um mtodo inicializador e um mtodo . Estes dois ltimos so e devem ser implementados por todos behaviors denidos pelo usurio. fornecidos pela classe O mtodo chamado uma vez quando o behavior torna-se vivo (live). Um objeto do grafo de cena dito vivo se ele faz parte de um branch graph anexado a um n (ver Seo 4.2). A conseqncia , o fato de estar deste fato que estes objetos so passveis de serem renderizados. No caso de um n . vivo signica que ele est pronto para ser invocado. Dene-se neste mtodo o valor inicial da O mtodo chamado quando a condio de disparo especicada para o behavior ocorrer e ele estiver ativo (ver seo seguinte). Esta rotina ento efetua todo o processamento programado e dene a , i.e., informa quando o behavior deve ser invocado novamente. prxima O cdigo apresentado a seguir (adaptado de [Sun Microsystems, 2002]) exemplica como escrever um behavior para rotacionar um objeto sempre que uma tecla for pressionada.

32

Para adicionar um objeto a um programa Java 3D deve-se basicamente: (i) criar o suporte necessrio exigido pelo behavior (e.g., um behavior Rotaciona precisa referenciar um n ), (ii) criar um e efetuar as referncias necessrias, (iii) denir um scheduling bound para o behavior (ver seo objeto seguinte) e (iv) congurar as capacidades do objeto alvo. O mtodo visto a seguir . ilustra este processo para o behavior

Behaviors ativos Por uma questo de desempenho, o programador dene uma regio limitada do espao (por exemplo, uma esfera ou um paraleleppedo), denominada scheduling bound para o behavior (Figura 20). Ele dito estar ativo quando seu scheduling bound intercepta o volume de cena. Apenas os behaviors ativos esto aptos a receber eventos. Dessa forma, o cmputo necessrio a manipulao dos behaviors se reduz apenas aos que esto ativos, liberando assim mais tempo de CPU para o processo de renderizao. Na verdade o scheduling bound mais uma questo de desempenho, se ele no for denido o behavior associado nunca ser executado [Sun Microsystems, 2001].

Figura 20: Scheduling bound. 4.5 Animao Algumas alteraes do mundo virtual podem ser realizadas independentemente da ao do usurio. Elas podem, por exemplo, ser disparadas em funo do passar do tempo. Como comentado anteriormente, estas alteraes 33

so denominadas animaes. Animaes em Java 3D tambm so implementadas usando behaviors. Java 3D disponibiliza alguns conjuntos de classes, tambm baseadas em behaviors, que so prprias para implementar animaes. Um primeiro conjunto destas classes so os interpoladores. Os so verses especializadas de behaviors usados para gerar uma animao baseada no tempo. O processo de animao acontece atravs de dois mapeamentos. No primeiro, um dado intervalo de tempo (em milissegundos) mapeado sobre o intervalo fechado I=[0.0, 1.0], a seguir I mapeado em um espao de valores pertinente ao objeto do grafo de cenas que se deseja animar (por exemplo, atributos de um objeto ou a transformada associada a um objeto ). O primeiro mapeamento efetuado por um objeto , que determina como o tempo ser mapeado de forma a gerar os valores do intervalo I, denominados valores alpha. pode ser visto como uma aplicao do tempo que fornece os valores alpha em funo dos seus parmetros e do tempo. O segundo mapeamento determinado por um objeto que, a partir dos valores alpha, realiza a animao do objeto referenciado. Mapeamento do tempo em As caractersticas de um objeto so determinadas por uma lista de parmetros que podem variar at um total de dez. A Figura 21 mostra o grco de onde os valores alpha so obtidos em funo de todos estes parmetros. A forma do grco varia conforme a quantidade de parmetros especicados.

Figura 21: Grco Alpha: tempo x valores alpha. fcil identicar quatro fases bem distintas em um grco : uma fase de crescimento dos va e ), uma fase de decrescimento lores alpha ( e ), uma fase com valores alpha constantes em ( ) e uma fase com valores alpha constantes em um ( ). A dezero ( nio de um objeto pode ter todas ou apenas algumas destas fases. Os parmetros correspondentes a cada uma das fases de permitem controlar o nmero de vezes ( ) que os valores alpha so gerados, e/ou ), a velocidade o modo em que os valores alpha so gerados ( e ) e acelerao ( ( e ) com que uma trajetria do espao de valores ser percorrida. O parmetro permite especicar um tempo de espera, antes que os valores alpha comecem a ser gerados. Este tipo de controle bastante til em um ambiente multithreading como a Java 3D. Imagine, por exemplo, a situao onde Java 3D tenha iniciado o processo de renderizao antes que a janela de display seja aberta. Neste caso, o usurio poder ver a animao a partir de um instante que no corresponda ao inicial, o que pode ser evitado estabelecendo um atraso. O exemplo a seguir dene um objeto que gera os valores alpha um nmero innito de vezes, gastando 4000 milissegundos (ou 4 segundos) em cada perodo. Os parmetros que no aparecem na lista recebem o valor zero, a menos do parmetro que dene o modo em que os valores alpha so gerados que congurado com a 34

constante

. A Figura 22 mostra o grco relativo a este exemplo.

Figura 22: Grco Alpha com innitos ciclos. O grande nmero de parmetros que podem ser especicados na construo de um objeto oferece um maior controle do processo de interpolao. No entanto, isto tem o custo do programador necessitar calibrar corretamente os valores de tais parmetros para obter um resultado mais prximo possvel do desejado, o que faz este mtodo ser um tanto quanto trabalhoso. Por outro lado, um objeto pode ser compartilhado, permitindo economizar trabalho e memria. Uma apresentao detalhada da lista dos parmetros de pode ser encontrada em [Brown, 1999] e [Sun Microsystems, 2001]. Mapeamento de para o espao de valores O programador pode projetar seus prprios interpoladores usando os valores alpha para animar objetos do mundo virtual. No entanto, Java 3D disponibiliza classes de behaviors pr-denidos, denominados , que atende a maioria das aplicaes ( , , entre outros). O procedimento usado para adicionar um objeto segue um padro bsico, parecido com o apresentado na Seo 4.4, que independe do tipo de interpolador a ser usado: 1. Criar o objeto a ser interpolado, o objeto alvo, e congurar os bits de capacidades necessrios; 2. Criar um objeto que descreve como gerar os valores alpha; e o objeto alvo;

3. Criar um objeto usando 4. Atribuir um

ao ;

5. Anexar o ao grafo de cenas; de [Sun Microsystems, 2002]) usa a classe Esta animao consiste em rotacionar um cubo um nmero innito de vezes, onde cada rotao gasta 4 segundos.

para criar uma animao.

exemplo

apresentado

seguir

(adaptado


35

Existem ainda as classes e (Level of Detail) que tambm permitem especicar animaes, mas neste conjunto de classes as alteraes so guiadas segundo a orientao ou posio da vista. Para maiores detalhes consultar [Sun Microsystems, 2002]. 5 Comparando OpenGL, Open Inventor e Java 3D Open Inventor e Java 3D so toolkits orientadas a objetos e de alto nvel de abstrao no que tange programao grca 3D. Ambas foram projetadas de forma muito semelhante, incorporando o conceito de grafo de cena para representao de objetos 3D. Alm de utilizar a OpenGL para renderizao da cena, estas toolkits tambm dispem de funcionalidades para construo de interface grca 2D com o usurio (janelas,botes, menus, etc.) (Figura 23).

Aplicao Java 3D OpenGL

Aplicao Open Inventor OpenGL

Figura 23: Relao entre OpenGL, Java 3D e Open Inventor. Normalmente, utiliza-se a linguagem C++ para programao com Open Inventor, Java para programao com Java 3D e a linguagem C para programao de aplicaes com OpenGL. No entanto, existem implementaes destas bibliotecas e de suas APIs em outras linguagens de programao, como Delphi, Ada e Modula-3. Alm disso, a interoperabilidade natural entre C e C++ possibilita o desenvolvimento de aplicaes em C++ utilizando a OpenGL. A OpenGL no faz qualquer referncia interface grca com o usurio (isto ca a cargo do programador). Desta forma, Open Inventor e Java 3D oferecem grandes facilidades para a construo de aplicaes grcas 3D interativas e tiram proveito da OpenGL para renderizao da cena. J a OpenGL oferece uma API com mais baixo nvel de abstrao, tendo a seu favor a independncia do sistema de janelas e a possibilidade de acelerao da renderizao atravs do acesso implementao de rotinas em hardware (placas de vdeo aceleradoras). A escolha de qual ferramenta utilizar depende da natureza do seu projeto. Vejamos algumas dicas: se voc est querendo exercitar os conceitos bsicos de computao grca ou, se o aplicativo a ser desenvolvido simples, utilize a OpenGL. Seno, se o seu aplicativo de mdio ou grande porte, Open Inventor e Java 3D oferecem APIs 36

de programao mais produtivas, dispondo de funcionalidades para programao de interfaces grcas e o grafo de cena para representao da informao grca. Alm disso, tanto Open Inventor quanto Java 3D possuem rotinas para converter o grafo de cena em primitivas da OpenGL de forma otimizada. Entre Open Inventor e Java 3D, a escolha passa pela linguagem a ser utilizada, respectivamente C++ ou Java. Programas em C++ geralmente so mais rpidos do que em Java, isto quando falamos de interface grca 2D. No entanto, C++ uma linguagem mais complexa do que Java. Em relao a cena 3D no h diferena entre as toolkits, pois ambas utilizam OpenGL para a renderizao. Para melhor ilustrar esta comparao, apresentamos a seguir um aplicativo, que exibe um cilindro vermelho na tela, implementado utilizando OpenGL, Open Inventor e Java 3D (Figura 24).

Figura 24: Um cilindro vermelho. Implementao com OpenGL

37

38

Implementao com Open Inventor


39

Implementao com Java 3D


40

41

6 Concluso Este tutorial mostrou uma viso geral de algumas tecnologias para programao grca. As tecnologias aqui apresentadas foram escolhidas por serem populares e de fcil acesso (gratuitas e de cdigo aberto). Existe, no entanto, um amplo espectro de ferramentas similares e em nveis de abstrao ainda mais baixos (por exemplo, o X Toolkit [McCormack , 1994]) e mais altos (por exemplo, a VRML [Web 3D Consortium, 2001]) que as aqui apresentadas. Para a apresentao das tecnologias selecionadas, foi adotada uma abordagem bottom-up, partindo da programao de mais baixo nvel de abstrao para a de mais alto nvel. medida que o nvel de abstrao aumenta, a programao torna-se mais simples, o que leva possibilidade de implementar aplicaes mais sosticadas. Por outro lado, s a programao de mais baixo nvel prov a exibilidade necessria em certas situaes. Por esta razo, a abordagem passando por todos estes nveis mostra uma viso abrangente das tecnologias existentes e permite mostrar que, apesar de diferentes, elas no so antagnicas, pelo contrrio, so complementares, como ca evidenciado pelos elos que as unem. 7 Onde encontrar os softwares GNU - Java - Java 3D - Mesa 3D (clone da OpenGL) - . Motif/Lesstif - Open Inventor - OpenGL - e Referncias [ANSI, 1985a] ANSI. Computer Graphics-Graphical Kernel System (GKS) Function Description. Technical report, American National Standards Institute for Information Processing Systems, 1985a. [ANSI, 1985b] ANSI. Programmers Hierarchical Interactive Graphics System (PHIGS). Technical report, American National Standards Institute for Information Processing Systems, 1985b. [Angel, 1997] E. Angel. Interactive computer graphics: a top-down approach with OpenGL (Addison Wesley Longman, Inc., 1997). [GTK+, 2002] GTK+ The GIMP Toolkit. , 2002. [Sowirzal, 1998] H.A. Sowirzal, D. N. and M.Bailey. Introduction to Programming with Java 3D ( , 1998). [McCormack , 1994] J. McCormack and P. Asente and R. Swick and D. Converse. X Toolkit Intrinsics - C Language Interface. Digital Equipment Corporation/X Consortium, 1994. [Neider, 1993] J. Neider, T. Davis and W. Mason. OpenGL Programming Guide (Addison Wesley, 1993). [Wernecke, 1994] J. Wernecke. The Inventor Mentor (Addison Wesley, 1994). [Brown, 1999] K. Brown, and P. Daniel. Ready-to-Run Java 3D (Wiley Computer Publishing, 1999). [Kilgard, 1994] M. J. Kilgard. OpenGL and X, Part 1:An Introduction. Technical report, SGI, , 1994.

[Kilgard, 1996] M. J. Kilgard. The OpenGL Utility Toolkit (GLUT) Programming Interface API Version 3. Technical report, SGI, , 1996.

42

[Segal, 1994] M. Segal and K. Akeley. The OpenGL Graphics Interface. Technical report, Silicon Graphics Inc, , 1994. [Segal, 1996] M. Segal and K. Akeley. The Design of the OpenGL Graphics Interface. Technical report, Silicon Graphics Inc, [on-line] , 1996. [Strauss, 1992] P. S. Strauss and R. Carey. An ObjectOriented 3D Graphics Toolkit. In Siggraph92, pages 341352 (ACM, Chicago, 1992). [Strauss, 1993] Paul S. Strauss. IRIS Inventor, A 3D Graphics Toolkit. In ACM OOPSLA, pages 192200 (ACM, 1993). [Sowizral, 1999] Sowizral, H. A. and Deering, M. The Java 3D API and Virtual Reality. IEEE Computer Graphics and Applications, 19(3):192200, 1999. [Sun Microsystems, 2002] Sun Microsystems. Java 3D API Collateral. , 2002.

[Sun Microsystems, 2001] Sun Microsystems. Java 3D API Specication. , 2001.

[Web 3D Consortium, 2001] Web 3D Consortium. The Virtual Reality Modeling Language, International Standard ISO/IEC DIS 14772-1. , 2001.

43