Você está na página 1de 88

UNIJU Universidade Regional do Noroeste do Estado do Rio Grande do Sul DeTec Departamento de Tecnologia Bacharelado em Informtica

Tutorial

V R M L 2.0

Marcos Carrard

Iju (RS), 2000/2001

Apresentao

Este texto apresenta um apostila ou tutorial para o uso da linguagem VRML Virtual Reality Modeling Language. Conforme ser visto, est uma linguagem de uso muito frequente e amplo quando da descrio de mundos e ambientes para realidade virtual atravs de uma rede de computadores de velocidade relativamente baixa, como a internet. No o objetivo deste material se caracterizar como tendo um contedo novo e indito. Pelo contrrio, como o prprio nome diz, ele uma apostila ou tutorial e, portanto, o seu contedo foi retirado de algumas publicaes e pginas na internet, especialmente o livro do autor Andrea Ames, David Nadeau e John Moreland ([ANM96]). Esta uma publicao bastante completa e recomendada a todos que desejam conhecer profundamente o VRML. Esta apostila traz o seu contedo e uma boa parte dos seus exemplos na sequncia, forma e contedo apresentados por este livro. Qualquer dvida, correo, sugesto ou acrscimo de contedo para este material muito bem vinda e pode ser enviada atravs do endereo carrad@detec.unijui.tche.br ou atravs da pgina http://labinf.detec.unijui.tche.br/~carrard .

Sumrio

Apresentao Sumrio 1 Aspectos Iniciais 1.1 Introduo 1.2 Sistema de Coordenadas 1.3 Arquivo VRML 1.4 Descrevendo Figuras 1.5 Eventos e Rotas 2 Construo das Figuras 2.1 Nodo Shape 2.2 Nodo Appearance 2.3 Nodo Material 2.4 Primitivos Geomtricos 2.5 Agrupando Figuras 3 Inserindo Texto 3.1 Introduo 3.2 Nodo Text 3.3 Nodo FontStyle 4 Transformando Figuras 4.1 Introduo 4.2 Nodo Transform 4.3 Translao 4.3.1 Vetores em 3D 4.3.2 Transformao de translao 4.4 Rotao 4.5 Escala 5 Animando o Posicionamento, Orientao e Escala das Figuras 5.1 Introduo 5.2 Processo de Animao 5.3 Nodo TimeSensor 5.4 Nodo PositionInterpolator 5.5 Nodo OrientationInterpolator
3

5.6 Exemplos 6 Interagindo com os Objetos 6.1 Introduo 6.2 Nodo TouchSensor 6.3 Nodo PlaneSensor 6.4 Nodo SphereSensor 6.5 Nodo CylinderSensor 6.6 Exemplos 7 Controlando a Aparncia das Figuras 7.1 Introduo 7.2 8 Agrupando Nodos 8.1 Introduo 8.2 9 Incluindo Arquivos 9.1 Introduo 9.2 10 Construindo com Pontos, Linhas e Faces 10.1 Introduo 10.2 11 Grids de Elevao 11.1 Introduo 11.2 12 Figuras de Extruso 12.1 Introduo 12.2 13 Construo de Cores 13.1 Introduo 13.2 14 Mapeamento de Textura 14.1 Introduo 14.2 15 Luz e Sombra 15.1 Introduo 15.2 16 Adicionando Fundo e Fumaa 16.1 Introduo 16.2 17 Adicionando Som 17.1 Introduo 17.2 18 Controle de Detalhes 18.1 Introduo 18.2 19 Definindo Pontos de Vista 19.1 Introduo 19.2
4

20 Adicionando ncoras e Informaes ao Mundo Virtual 20.1 Introduo 20.2 21 Criando Scripts 21.1 Introduo 21.2 22 Criando Novos Tipos de Dados 22.1 Introduo 22.2 Anexo I Tabela de Cores do Modelo RGB Bibliografia

1
Aspectos Iniciais

1.1 Introduo
VRML a abreviao para Virtual Reality Modeling Language ou Linguagem para Modelagem em Realidade Virtual. Seu objetivo a descrio de objetos e mundos tridimensionais interativos atravs da World Wide Web na internet. Esta linguagem indente de plataforma e permite a criao de ambiente virtuais por onde se pode passear, visualizar objetos e interagir com eles. VRML foi apresentada pela primeira vez em 1994 durante a conferncia sobre WWW com o propsito de atingir os objetivos acima sem necessitar de uma rede de alta velocidades para dar suporte as atividades. Nesta ocasio ela foi apresentada como um subconjunto de um formato de arquivos ASCII do software Open Inventor da Silicon Graphics. Esta verso, conhecida como VRML 1.0, trabalha principalmente com a geometria 3D dos objetos que so elaborados em polgonos e primitivos como cones, esferas, cilindros e esferas. Ela suporta ainda algumas transformaes com estes objetos e permite o ajuste da complexidade dos objetos dependendo da distncia do observador do ambiente. A verso atual da linguagem, denominada de Moving Worlds VRML 2.0 agrega todas as definies existentes na verso anterior e amplia as possibilidades de representao e interao neste mundo e com outros mundos virtuais. Nelas os objetos podem mover-se e reagir a eventos originrios do usurio ou de alguma outra forma de controle. Alm disto, esta verso permite o uso de objetos multimdia nos ambientes, assim possvel integrar sons e filmes nas cenas. Conforme [Kir97] as caractersticas do VRML 2.0 podem ser agrupadas em quatro reas principais: melhoria dos mundos estticos, interao, animao e comportamento baseado em scripts, alm da prototipao de novos objetos. A linguagem VRML no reconhecido de forma padronizada pelos navegadores da HTML como o Netscape e o Internet Explorer. Desta forma, necessrio configurar o navegador para que ele compreenda o contedo do arquivo que est recebendo. Para isto
6

necessrio um navegador VRML que dever, tipicamente, ser adicionado ao navegador HTML na forma de plug-in. Plug-in nada mais so do que programas que trabalham de forma associada ao navegador HTML para que este entenda arquivos de tipos diferenciados. Sugere-se que antes de continuar na leitura deste tutorial, o leitor adquira um navegador VRML (esto disponveis na internet de forma gratuita) para poder avaliar os exemplos propostos. Todos eles forma escritos e testados utilizando o software Cosmo Player 2.1 e o navegador HTML Nestcape 4.7.

1.2 Sistema de Coordenadas


A linguagem VRML utiliza o sistema de coordenadas cartesiano para a representao espacial, ou seja, um sistema baseado em 3 eixos de deslocamento vetorial. Veja a figura 1.1 para a descrio desta representao.

Figura 1.1 Sistema de coordenadas cartesiano Ainda sobre esta questo, existem duas convenes que so relevantes na definio do mundo virtual e na sua possibilidade de conexo com outros mundos. A primeira delas que adotado a regra da mo direita para definio dos eixos do sistema e seu sentido de crescimento. Nesta regra, toma-se a mo direita e aponta-se os dedos polegar, indicador e mdio de forma que fiquem com 90 graus entre si, aproximadamente (veja a figura 1.2). Nesta disposio, o dedo polegar representa o eixo X, o indicador o eixo Y e o dedo mdio, o eixo Z, crescendo no sentido que os dedos apontam. Alm disso, a definio original do mundo virtual, utilizada em casos default, coloca o observador da cena no sentido do eixo +Z.

Figura 1.2 Regra da mo direita.


7

A segunda conveno adotada, no pela linguagem mas pelos seus usurios, o uso da unidade de medidas metros para o sistema de coordenadas. A razo desta conveno permitir facilmente a integrao de mundos virtuais escritos por usurios diferentes sem que ocorram problemas de proporo nas figuras.

1.3 Arquivo VRML


Os mundos virtuais so descritos atravs de um arquivo texto com extenso .wrl que pode ser criado com qualquer editor de programas fontes. importante notar que no pode ser utilizado um editor de textos comum, como o Word, e sim um editor de programas fontes, como o Notepad do Windows. Nesta seo vamos discutir alguns aspectos bsicos e introdutrios a respeito do contedo destes arquivos. Para tanto ser utilizado o arquivo do exemplo 1.1.
#VRML V2.0 utf8 # Primeiro exemplo Group{ children[ # Desenha o cilindro da base Shape{ appearance DEF Azul Appearance{ material Material{ diffuseColor 0.0 0.0 1.0 } } geometry Cylinder{ height 2.0 radius 2.0 } }, # Desenha o cone da cobertura Transform{ translation 0.0 2.0 0.0 children Shape{ appearance USE Azul geometry Cone{ height 2.0 bottomRadius 2.5 } } } ] }

Exemplo 1.1: Primeiro arquivo VRML

a) Cabealho VRML O cabealho est presente em todos os arquivos VRML e obrigatrio. Seu formato : #VRML V2.0 utf8 onde: VRML indica que o arquivo que segue a descrio de um ambiente virtual; V2.0 identifica a verso ou especificao 2.0 da linguagem VRML; utf8 identifica um arquivo que utiliza o conjunto de caracteres UTF-8; Para a descrio de um arquivo fonte utilizando a verso 1.0 da linguagem VRML, tambm h um cabealho, com o mesmo sentido na composio das suas partes, mas descrito diferentemente: #VRML V1.0 ascii

b) Comentrios Aps o cabealho do arquivo VRML, toda e qualquer sequncia de caracteres que iniciar ou contiver o caracter #, tratada como comentrio e ignorada pelo navegador. Por exemplo: # Desenha o cilindro da base

c) Nodos O arquivo VRML formado por nodos (nodes) que descrevem as figuras contidas nele e as suas propriedade no mundo virtual. O nodo a estrutura sinttica bsica de composio deste tipo de arquivo e, tipicamente, contm: Exemplo: Cylinder { height 2.0 radius 2.0 } Neste exemplo, Cylinder o tipo do nodo e height e radius dois campos com seus valores que especificam a altura e dimetro do cilindro a ser desenhado. o tipo de nodo (obrigatrio); um par de chaves (obrigatrio); um conjunto de campos e seus atributos (opcional);

d) Tipo de valores Existe um conjunto pr-definido de tipos de dados ou valores que so aceitos como atributo dos campos de um nodo. importante ressaltar que a no presena de um destes campos no nodo implica no uso de um valor default, mas sempre dentro das especificaes da linguagem. A tabela a seguir apresenta os tipos de dados possveis na linguagem VRML. Nesta tabela os tipos obedecem a um padronizao de nomenclatura, iniciando-se sempre com SF ou MF: - SF: Single value types indica um nico valor para o tipo a ser utilizado no dado; - MF: Multiple value types indica o uso de mltiplos valores para o dado deste tipo; Tipo de Valor SFBool SFColor MFColor SFFloat MFFloat SFImage SFInt32 MFInt32 SFNode MFNode SFRotation MFRotation Descrio Descreve um valor booleano: verdadeiro (TRUE) ou falso (FALSE) Grupo de trs valores reais descrevendo as componente vermelho (red), verde (green) e azul (blue) do modelo de cores RGB Descreve valores reais ou de ponto flutuante. Uma lista de valores descrevendo as cores de uma imagem digital Valores inteiros de 32 bits Identifica um dado do tipo node VRML (nodo) Descreve um grupo de quatro valores reais onde os trs primeiros identificam um eixo o sistema de representao e o ltimo um ngulo medido em radianos. Estes valores definem uma transformao geomtrica de rotao. Descreve uma lista de caracteres, que devem estar obrigatoriamente entre aspas, caracterizando uma string. Descreve um valor real para a medida absoluta de tempo, em segundos, contados a partir da 00:00hs do dia 01/01/1970. Dois valores reais descrevendo um ponto ou vetor bidimensional no plano cartesiano. Trs valores reais descrevendo um ponto ou vetor tridimensional no espao cartesiano.

SFString MFString SFTime

SFVec2f MFVec2f SFVec3f MFVec3f

10

Os tipos de dados descritos acima iro aparecer na descrio formal dos campos dos nodos que a linguagem VRML comporta a serem vistos mais tarde. Por exemplo, a descrio formal do campo height do nodo Cylinder : height 2.0 # SFFloat

Esta descrio indica que o campo height tem um calor default de 2.0 e este dado do tipo SFFloat, portanto, admitindo somente valores reais na sua descrio.

e) Nomes de nodos Todos os nodos no ambiente virtual podem ser nominados. Os nomes podem ser compostas de qualquer sequncia de letras, nmeros e underscore. Os nomes compostos diferenciam letras maisculas e minsculas (case sensitives) e no podem iniciar com um nmero. A definio de um nome para um nodo VRML tem a funo de identific-lo para novo uso posterior. Para fazer este uso, o nodo deve ser definido previamente com a seguinte definio: DEF nome_do_nodo tipo_do_nodo {...} Exemplo: DEF Meu_Cilindro Cylinder{ height 2.0 radius 2.0 } Aps a definio do nodo ele pode ser utilizado sempre que se fizer necessrio. Para esta utilizao, o nome definido ao nodo deve aparecer precedido pela palavra chave USE: USE nome_do_nodo Exemplo: geometry USE Meu_Cilindro

1.4 Descrevendo Figuras


A construo do ambiente virtual realizada com figuras (shapes) descritas pelos nodos e por seus atributos. Desta maneira, a figura VRML tem uma forma ou geometria (geometry) que define a sua estrutura tridimensional. Alm disto, esta figura tem sua aparncia baseada no material com o qual feita (material) e na textura da sua superfcie (texture). Assim, geometry e appearance so os campos do nodo Shape:
11

Exemplo: Shape { Appearance DEF Azul Appearance { material Material { diffuseColor 0.0 0.0 1.0 } } geometry Cylinder { height 2.0 radius 2.0 } }

# Campo da aparncia # da figura

# Definio da sua # forma 3D

A linguagem VRML suporta vrios tipos de primitivos geomtricos para as figuras de forma pr-definida, como caixas, cilindros, cones e esferas. Alm disto existem vrias figuras geomtricas avanadas como figuras de extruso e grids de elevao. Com base nestes tipos, a linguagem VRML permite que as figuras sejam agrupadas e reagrupadas sempre que necessrio para formar figuras mais complexas. O agrupamento das figuras se d atravs do nodo Group. O nodo que agrupa outras figuras e nodos chamado de pai (parent) e as figuras que fazem parte de um grupo so chamadas de filhos (children). Neste contexto, noh limite para o nmero de filhos existentes em um grupo.

1.5 Eventos e Rotas


A linguagem VRML permite a criao de mundos dinmicos. Para fazer isto, os arquivos VRML devem prever instrues para a construo do mundo. Estas instrues descrevem como conectar nodos para atuao conjunta ou condicionada. Por exemplo, abrir uma porta quando o mouse clica em um certo objeto ou acender uma lmpada nas mesmas condies. Estes eventos so mecanismos de troca de mensagens entre os objetos e envolvem: - um par de nodos para atuar conjuntamente; - uma rota de comunicao entre os dois nodos envolvidos; Uma vez a rota tendo sido definida entre os dois nodos, o primeiro deles pode enviar mensagens ao segundo. Esta mensagens, chamada de event (evento) contm valores que foraro o nodo receptor a reagir. Existe inclusive a possibilidade de agrupar vrios nodos criando um circuito de comunicao. Cada tipo de nodo apresenta acionadores (jacks) de entrada e sada com os quais as mensagens atuam. Por exemplo, o nodo que cria uma luz (lmpada) tem um acionador de entrada que pode lig-la ou deslig-la (on/off). Acionando-o, atravs do envio de uma mensagem, possvel ligar e desligar esta luz a distncia.
12

importante salientar que nodos podem ter vrios acionadores para interao entre nodos do circuito. Por outro lado, estes acionadores so de entrada (input) e sada (output). Os acionadores de entrada so chamados de eventIn e ou acionadores de sada so chamados de eventOut. Tambm importante notar que estes acionadores tem um tipo de dado definido para receber ou enviar atravs dele. Neste contexto, o circuito necessita descrever uma rota (route) de um acionador eventOut de um dado nodo para um acionador eventIn de outro nodo. O circuito permanecer inativo at que um evento seja enviado entre os nodos. A reao do segundo nodo depende: - do tipo de nodo que est recebendo o evento; - do acionador de entrada que foi ativado; - do valor contido no evento; - da atividade do nodo no momento do recebimento da mensagem;

13

2
Construo das Figuras

2.1 Nodo Shape


O nodo Shape utilizado na linguagem VRML para descrever as figuras presentes no ambiente virtual atravs da sua estrutura tridimensional, definido sua forma geomtrica e sua aparncia neste mundo. Sua sintaxe : Shape { appearance geometry }

NULL NULL

# SFNode # SFNode

O valor do campo geometry define a forma tridimensional do objeto. Normalmente ele define uma das primitivas geomtrica: Box, Cone, Cylinder ou Sphere. O valor default do campo, indicado como nulo, caracteriza a ausncia de forma para um objeto. O valor do campo geometry pode ser alterado atravs de um evento enviado ao campo eventIn set_geometry. A respostas, aps a alterao da forma do objeto, se dar atravs do campo eventOut geometry_changed. O campo appearance define a aparncia do objeto descrito naquele nodo. Este campo tipicamente inclui o nodo Appearance que, quando nulo, define um objeto com aparncia esbranquiada. O valor do campo appearance pode ser mudado com um evento para o campo evenIn set_appearance e a resposta da mudana da aparncia do objeto ser enviada atravs do campo eventOut appearance_changed.

2.2 Nodo Appearance


Conforme mencionado, este nodo tem a funo de descrever a aparncia do objeto a ele associado. Sua sintaxe :

14

Appearance { material texture textureTransform }

NULL NULL NULL

# SFNode # SFNode # SFNode

O campo material define os atributos de aparncia do material que compem a figura. O valor NULL define um material sem aparncia. A este campo sempre est associado um outro nodo VRML que traz as propriedades do material. O campo texture define uma textura a ser aplicada sobre o objeto e textureTransform indica as transformaes que esta textura sofrer durante o processo de mapeamento. Veja o captulo 14 para maiores informaes.

2.3 Nodo Material


Este nodo indica as propriedades da simulao fsica do material que compor o objeto em questo. Sua sintaxe : Material { ambienteIntensity diffuseColor emissiveColor shininess specularColor transparency }

0.2 0.8 0.8 0.8 0.0 0.0 0.0 0.2 0.0 0.0 0.0 0.0

# SFFloat # SFColor # SFColor # SFFloat # SFColor # SFFLoat

A funo de cada um destes campos ser descrita detalhadamente no captulo 7 deste material. Em linhas gerais so: ambienteIntensity: intensidade de luz ambiente; diffuseColor: cor difusa do objeto (cor aparente do mesmo); emissiveColor: cor emitida pelo objeto; shininess: coeficiente de brilho daquele objeto; specularColor: coeficiente de reflexo especular da luz para o objeto; transparency: ndice de transparncia do objeto.

2.4 Primitivos Geomtricos


A linguagem VRML traz alguns primitivos geomtricos pr-definidos que so utilizados para a composio das figuras presentes nos mundos virtuais. Estes primitivos so: caixa, cone, cilindro e esfera. importante notar que estes primitivos so, por definio da linguagem, sempre ocos, ou seja, a parte interna dos mesmos vazia.
15

a) Nodo Box Este primitivo define uma caixa (prisma regular de quatro lados) e sua sintaxe : Box { size } O campo size define o tamanho da caixa a ser criada no sentido de cada um dos eixos do sistema. O primeiro valor define o tamanho no sentido do eixo X, o segundo do eixo Y e o terceiro, do eixo Z. Esta caixa ser sempre criada de forma centralizada na origem do sistema de coordenadas, ou seja, no ponto (0,0,0). O exemplo 2.1 apresenta o cdigo necessrio para a criao de uma caixa com os valores default, ou seja, quadrada com 2m de lado. O exemplo 2.2, por sua vez, apresenta uma caixa com 1m no sentido do eixo X, 3m no sentido do eixo Y e 5m no sentido do eixo Z.
#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Box{} }

2.0 2.0 2.0

# SFVec3f

Exemplo 2.1: Criao de uma caixa default.


#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Box{ size 1.0 3.0 5.0 } }

Exemplo 2.2: Definio de uma caixa de 1x3x5 metros.

b) Nodo Cone Este nodo define uma figura geomtrica com a forma de um cone. Sua sintaxe :

16

Cone { bottomRadius height side bottom } O cone a ser criado no mundo virtual estar com a sua base centrada na origem do sistema, no ponto (0,0,0), e seu pice ser projetado no sentido positivo do eixo Y. Os campos presentes no nodo tem a seguinte funo: bottomRadius: define o raio da base do cone. Seu valor deve ser sempre maior do zero; height: define a altura do cone no sentido positivo do eixo Y. Tambm deve ter valor maior do que zero; side: campo booleano, verdadeiro ou falso, que define se o lado do cone (paredes alterais) sero ou no desenhadas no mundo virtual; bottom: tem natureza idntica ao campo side, mas define se a base do cone ser apresentada ou no no mundo virtual. 1.0 2.0 TRUE TRUE # SFFloat # SFFloat # SFBool # SFBool

O exemplo 2.3 apresenta a criao de um cone com os valores default e o exemplo 2.4 um cone com 3.5m de raio na base e 1.5m de altura.

#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Cone {} }

Exemplo 2.3: Um cone com os valores default.

#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Cone { bottomRadius 3.5 height 1.5 } }

Exemplo 2.4: Um cone com 3.5m de base e 1.5m de altura.


17

c) Nodo Cylinder Este primitivo define um cilindro no mundo virtual e sua sintaxe : Cylinder { radius height side top bottom }

1.0 2.0 TRUE TRUE TRUE

# SFFloat # SFFloat # SFBool # SFBool # SFBool

O cilindro a ser criado estar localizado ao longo do eixo Y do sistema. Seu raio a distncia entre este eixo e a borda do cilindro e sua altura centralizada na origem, ou seja, um cilindro de 2m de altura ter 1m acima do eixo X e 1m abaixo deste mesmo eixo. Os campos presentes e sua funo so: radius: define o raio do cilindro. Deve ter um valor maior do que zero; height: define a altura do cilindro no sentido do eixo Y e seu valor tambm deve ser maior do que zero; side, top e bottom: so campos booleanos que definem se os lados, topo e base do cilindro, respectivamente, sero ou no apresentados no mundo virtual durante o desenho do primitivo.

Os exemplos 2.5 e 2.6 apresentam dois cilindros. O primeiro deles criado com os valores default para os campos e o segundo com 4m de raio e 1m de altura. J o exemplo 2.7 mostra um cilindro onde somente ser desenhado o lado do mesmo, ficando a base e o topo sem serem vistos.

#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Cylinder {} }

Exemplo 2.5: Um cilindro com valores default.

18

#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Cylinder { radius 4.0 height 1.0 } }

Exemplo 2.6: Define um cilindro de 1m de altura e 4m de raio.

#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Cylinder { radius 4.0 height 1.0 top FALSE bottom FALSE side TRUE } }

Exemplo 2.7: Apresenta um cilindro sem a base e o topo (cano).

d) Nodo Sphere Este primitivo define uma figura geomtrica com a forma de uma esfera. Sua sintaxe : Sphere { radius }

1.0

# SFFloat

Esta esfera tem um raio definido pelo campo radius e seu valor devem sempre ser maior do que zero. A esfera ser, assim como as demais figuras, criada centrada no ponto (0,0,0), ou seja, na origem do sistema. Os exemplo 2.8 e 2.9 apresentam duas esferas. A primeira criada com o valor default do raio (1m) e a segunda com 3.5m de raio.

19

#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Sphere {} }

Exemplo 2.8: Uma esfera de 1m de raio.


#VRML V2.0 utf8 Shape{ appearance Appearance{ material Material {} } geometry Sphere { radius 3.5 } }

Exemplo 2.9: Apresenta uma esfera de 3.5m de raio.

2.5 Agrupando Figuras


As figuras criadas no mundo virtual podem ser agrupadas para formar novos e mais complexos nodos que, por sua vez, podem vir a ser agrupados para criar novas figuras. Para esta funo a linguagem VRML define um nodo denominado de Group. Sua sintaxe : Group { children bboxCenter bboxSize addChildren removeChildren }

[] 0.0 0.0 0.0 -1.0 1.0 1.0

# MFNode # SFVec3f # SFVec3f # eventIn MFNode # eventOut MFNode

O valor do campo children especifica a lista de nodos filhos que sero includos neste grupo. Seus componentes so nodos Shape ou outros nodos Group. Os campos bboxCenter e bboxSize especificam o centro e o tamanho (no sentido de cada eixo) de uma caixa suficientemente grande para envolver todo o grupo. Os valores default listados acima indicam que o navegados VRML deve calcular automaticamente esta caixa, se necessrio. Veja o captulo XX para mais informaes.

20

Os campos addChildren e removeChildren so para tratar os eventos de adio e remoo de um filho ou nodo do grupo em questo. O exemplo 2.10 apresenta um agrupamento de trs figuras geomtricas do tipo box, apresentando o sentido de deslocamento dos eixos do sistema de coordenadas. O exemplo 2.11 mostra o agrupamento de vrios tipos de figuras com o intuito de espelhar como podem ser compostos objetos mais complexos a partir de figuras mais simples.

#VRML V2.0 utf8 Group{ children[ Shape{ appearance DEF Branco Appearance{ material Material {} } geometry Box{ size 25.0 2.0 2.0 } }, Shape{ appearance USE Branco geometry Box{ size 2.0 25.0 2.0 } }, Shape{ appearance USE Branco geometry Box{ size 2.0 2.0 25.0 } } ] }

Exemplo 2.10: Exemplo do agrupamento de trs caixas.

21

#VRML V2.0 utf8 Group{ children[ Shape{ appearance DEF Branco Appearance{ material Material {} } geometry Box{ size 10.0 10.0 10.0 } }, Shape{ appearance USE Branco geometry Sphere{ radius 7.0 } }, Shape{ appearance USE Branco geometry Cylinder{ radius 12.5 height 0.5 } }, Shape{ appearance USE Branco geometry Cylinder{ radius 4.0 height 20.0 } }, Shape{ appearance USE Branco geometry Cylinder{ radius 3.0 height 30.0 } }, Shape{ appearance USE Branco geometry Cylinder{ radius 1.0 height 60.0 } } ] }

Exemplo 2.11: Exemplo do agrupamento de vrias figuras geomtricas.


22

3
Inserindo Texto

3.1 Introduo
A apresentao de textos em VRML especificada em dois nodos. O primeiro deles destinado apresentao geomtrica do texto (nodo Text) e o segundo destinado s propriedades deste texto (nodo FontStyle). O nodo Text permite o controle do texto a ser impresso, seu tamanho em linhas ou colunas e o tamanho de cada uma delas, alm do tipo de fonte a ser utilizado. O nodo FontStyle faz o controle da aparncia do texto a ser apresentado, definindo a famlia de fontes, o estilo, tamanho, espaamento e justificao, entre outras caractersticas. A linguagem VRML faz uso do conjunto de caracteres utf8 e, portanto, somente aqueles caracteres presentes neste padro sero possveis de serem utilizados no nodo Text. Este padro definido na especificao ISSO 10646-1:1993.

3.2 Nodo Text


O nodo Text, conforme mencionado, define a geometria do texto e pode ser utilizado como valor para o campo geometry do nodo Shape. Sua sintaxe : Text { string length maxExtent fontStyle } O valor do campo string especifica uma ou mais linhas de texto a serem apresentadas no mundo virtual. Cada uma das linhas deve ser expressa com o uso de aspas duplas. Os vrios textos presentes neste campo devem ser separados por vrgulas. O valor deste campo pode ser modificado atravs do campo eventIn set_string. Quando este evento recebido o campo string modificado para o novo valor e uma mensagem enviada pelo
23

[] [] 0.0 NULL

# MFString # MFFloat # SFFloat # SFNode

campo eventOut string_changed. O texto criado ser localizado sobre o plano XY do sistema de coordenadas (Z=0) e ser descrito no sentido crescente do eixo X, ou seja, se olharmos de algum ponto positivo sob o eixo Z, o texto iniciar-se- na origem e ser escrito para a sua direito, como em qualquer outro local. O campo length especifica o comprimento desejado para cada linha do texto, segundo a medida padro do sistema VRML. Uma vez especificada uma medida, as linhas so comprimidas ou expandidas, atravs da mudana do tamanho do caracter ou do espaamento, para atingirem o tamanho desejado. O valor default de 0.0 especifica que o texto deve ser apresentado de maneira natural, sem preocupao com compresso ou expanso. Este campo admite vrios valores, sendo que cada um deles tem validade para uma das linhas do texto, na ordem que aparecerem, ou seja, o primeiro valor para a primeira linha, o segundo valor para a segunda linhas, e assim por diante. Se o nmero de valores presentes for inferior ao nmero de linhas, aquelas que excederem este nmero (as ltimas) sero apresentadas como se o seu comprimento default. Finalmente, o valor deste campo pode ser alterado atravs de um campo eventIn set_length e, o resultado, retorna atravs do campo evnetOut length_changed. O campo maxExtent define o comprimento mximo possvel admissvel ao texto, para qualquer linha ou coluna. As linhas que atingirem um comprimento maior do que o especificado neste campo so comprimidas at que atinjam o limite. Este tamanho medido horizontalmente para textos horizontais e verticalmente para textos verticais. A este campo est associado outro campo eventIn chamado de set_maxExtent que redefine o comprimento mximo. A resposta a este evento dada no campo eventOut maxExtent_changed. O campo fontStyle define as caractersticas que sero utilizadas para apresentar o texto presente no nodo, ou seja, para definir a sua aparncia. Normalmente este campo tem como valor um nodo FontStyle a ser visto a seguir. Na ausncia deste campo, o valor default de NULL, instrui o navegador a apresentar um texto no sentido esquerda para a direita no caso de texto horizontal e de cima para baixo no caso de texto vertical, justificado pela esquerda e utilizando o tipo de fonte serif. Este campo pode ser alterado atravs do campo eventIn set_fontSytle e a resposta se dar pelo campo eventOut fontStyle_changed. Observe o exemplo 3.1 para a criao de um texto simples, utilizando os valores default dos campos, exceto a string.
#VRML V2.0 utf8 Shape { appearance Appearance { material Material { } } geometry Text { string "Programando em VRML" } }

Exemplo 3.1: Descrevendo um texto simples.


24

possvel tambm a criao de mltiplos campos textos que sero distribudos em linhas no ambiente virtual. Veja isto no exemplo 3.2.
#VRML V2.0 utf8 Shape { appearance Appearance { material Material { } } geometry Text { string [ "Programando", "em VRML" ] } }

Exemplo 3.2: Distribuindo o texto em linhas.

No exemplo 3.3 o texto mostrado no primeiro exemplo comprimido para que tenha comprimento igual a 5 unidades. Caso tenhamos um texto disposto em linhas, isto pode ser feito com a determinao de vrios valores para o campo length. Veja isto no exemplo 3.4.

#VRML V2.0 utf8 Shape { appearance Appearance { material Material { } } geometry Text { string "Programando em VRML" length 5.0 } }

Exemplo 3.3: Definindo o comprimento do texto.

#VRML V2.0 utf8 Shape { appearance Appearance { material Material { } } geometry Text { string [ "Programando", length [ 4.0, 3.0 ] } }

"em VRML" ]

Exemplo 3.4: Definindo o comprimento de cada linha do texto. Finalmente, no exemplo 3.5, caracterizada a opo de determinar o comprimento mximo admissvel ao texto. Neste exemplo, qualquer valor para o campo length que for maior do que aquele explicitado para o comprimento mximo ser ignorado.
25

#VRML V2.0 utf8 Shape { appearance Appearance { material Material { } } geometry Text { string "Programando em VRML" maxExtent 5.0 } }

Exemplo 3.5: Definindo o comprimento mximo de um texto.

3.3 Nodo FontStyle


O nodo FontStyle controla a aparncia de um texto criado pelo nodo Text. O nodo FontStyle pode ser utilizado como valor para o campo fontStyle deste ltimo citado. Sua sintaxe : FontStyle { family style size spacing justify horizontal leftToRight topToBottom language }

SERIF PLAIN 1.0 1.0 BEGIN TRUE TRUE TRUE

# SFString # SFString # SFFloat # SFFloat # SFString # SFBool # SFBool # SFBool # SFString

O campo family especifica a famlia de fontes que a linguagem VRML ir adotar para apresentar aquele texto. O valor default para o campo a famlia serif e todas esto listadas na seguinte tabela: Nome da Famlia SERIF SANS TYPEWRITER Descrio Fonte de tamanho varivel, semelhante ao tipo Times Roman Fonte de tamanho varivel, semelhante ao tipo Helvetica Fonte de tamanho fixo, semelhante ao tipo Courier

O campo style define qual ser o estilo de apresentao do texto proposto. O seu valor um dos presentes na seguinte tabela, sendo o estilo plain o default:
26

Nome do Estilo PLAIN BOLD ITALIC BOLDITALIC

Descrio Texto normal, sem estilo especial Texto apresentado em negrito Texto apresentado em itlico Texto apresentado em negrito e itlico ao mesmo tempo

O campo size especifica a altura dos caracteres com valor medido em unidades do sistema de coordenadas utilizado no ambiente VRML. A altura default dos caracteres de 1 unidade (metro). O valor do campo spacing determina o espaamento vertical entre as linhas que compem o texto em um texto horizontal. No case de um texto vertical, ele determina o espaamento entre as colunas do texto. O campo horizontal especifica se o texto ser apresentado no sentido horizontal (TRUE) ou vertical (FALSE). Todo o texto tem uma direo principal e uma direo secundria. A direo principal, para um texto horizontal, ao longo do eixo X, e a secundria, ao longo do eixo Y. Para um texto vertical, a direo principal ao longo do eixo Y e a secundria, ao longo do eixo X. Os campos leftToRight e topToBottom so utilizados em conjunto com o campo horizontal para controlar a disposio horizontal ou vertical do texto. Para um texto horizontal, o campo leftToRight especifica como os caracteres consecutivos sero dispostos ao longo da direo principal, da esquerda para a direita (TRUE), no sentido positivo do eixo X, ou da direita para a esquerda (FALSE), no sentido negativo do eixo X. Ainda no caso de textos horizontais, o campo topToBottom especifica como as linhas de texto sero dispostas, se de cima para baixo (TRUE),no sentido negativo do eixo Y, ou de baixo para cima, no sentido positivo do eixo Y. Quando o texto for vertical, o uso dos campos leftToRight e topToBottom anlogo, mas opera invertendo as direes principal e secundria do texto. O campo topToBottom determina se os caracteres sero dispostos de cima para baixo (TRUE) ou de baixo para cima (FALSE). J o campo leftToRight determina a disposio das colunas do texto, se elas sero colocadas da esquerda para a direita (TRUE) ou da direita para a esquerda (FALSE). O campo justify especifica como o bloco de texto ser disposto em relao aos eixos X e Y do sistema de coordenadas. Este campo pode receber dois valores de justificao, sendo o primeiro deles considerado como principal e o segundo como secundrio. O valor principal controla a disposio do texto ao longo da direo principal do texto e o secundrio faz o mesmo em relao a direo secundria do texto. Os valores possveis para este campo vem da seguinte tabela e o seu efeito depende dos campos leftToRight e topToBottom:

27

Nome da Justificao FIRST

Valor do campo leftToRight TRUE FALSE

Descrio Coloca o lado esquerdo do bloco de texto no eixo Y Coloca o lado direito do bloco de texto no eixo Y Coloca o lado esquerdo do bloco de texto no eixo Y Coloca o lado direito do bloco de texto no eixo Y Coloca o meio do bloco de texto no eixo Y Coloca o meio do bloco de texto no eixo Y Coloca o lado direito do bloco de texto no eixo Y Coloca o lado esquerdo do bloco de texto no eixo Y

BEGIN

TRUE FALSE

MIDDLE END

TRUE FALSE TRUE FALSE

Nome da Justificao FIRST BEGIN MIDDLE END

Valor do campo topToBottom TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE

Descrio Coloca o topo do texto no eixo X Coloca a base do texto no eixo X Coloca o topo do texto no eixo X Coloca a base do texto no eixo X Coloca o meio do texto no eixo X Coloca o meio do texto no eixo X Coloca o lado direito do bloco de texto no eixo X Coloca o lado esquerdo do bloco de texto no eixo X

O campo language especifica o contexto de linguagem a ser utilizado para apresentao do bloco de texto. Os valores vlidos para este campo so baseados no local de apresentao do texto e respeitam padres internacionais. Os valores vlidos vem da seguinte tabela:

28

Valor do campo ar de de_DE de_CH en en_US en_GB hi jp ru sa sw zh zh_TW zh_CN Linguagem Arbico Alemo Alemo Alemo Ingls Ingls Ingls Hind Japons Russo Sanscrito Swahili Chins Chins Chins

Descrio Territrio Alemanha Sua

Estados Unidos Inglaterra

Taiwan China

O exemplo 3.6 apresenta a disposio de um texto controlando a famlia dos caracteres e o estilo de apresentao. J o exemplo 3.7 controla o tamanho dos caracteres a serem apresentados segundo aquele estilo de fonte. O exemplo 3.8 mostra como pode ser realizado o controle do espaamento entre as linhas de um texto e o exemplo 3.9, apresenta um texto composto de duas partes a serem apresentadas com estilos de fonte diferentes.

#VRML V2.0 utf8 Shape { appearance Appearance { material Material { } } geometry Text { string "Programando em VRML" fontStyle FontStyle { family "SERIF" style "BOLD" } } }

Exemplo 3.6: Controlando a famlia e estilo do texto. O exemplo 3.10 dispem um texto utilizando o campo de justificativa e o exemplo 3.11 apresenta como possvel definir e utilizar posteriormente um estilo de fonte.
29

#VRML V2.0 utf8 Shape { appearance Appearance { material Material { } } geometry Text { string "Programando em VRML" fontStyle FontStyle { size 0.5 } } }

Exemplo 3.7: Controlando a altura dos caracteres do texto.

#VRML V2.0 utf8 Shape { appearance Appearance { material Material { } } geometry Text { string [ "Programando", "em VRML" ] fontStyle FontStyle { spacing 0.5 } } }

Exemplo 3.8: Controlando o espaamento entre linhas de um texto.

30

#VRML V2.0 utf8 Group { children [ Shape { appearance DEF Branco Appearance { material Material { } } geometry Text { string "Programando" fontStyle FontStyle { family "SERIF" style "ITALIC" justify "END" size 1.0 } } }, Shape { appearance USE Branco geometry Text { string "em VRML" fontStyle FontStyle { family "SANS" style "BOLD" justify "BEGIN" size 1.0 } } } ] }

Exemplo 3.9: Apresentando um texto com vrias estilos de fonte.

31

#VRML V2.0 utf8 Group { children [ Shape { appearance DEF Branco Appearance { material Material { } } geometry Text { string [ "Acima", "Abaixo" ] fontStyle FontStyle { justify "MIDDLE" } } }, Shape { appearance USE Branco geometry Box { size 5.0 0.01 2.0 } } ] }

Exemplo 3.10: Controlando a justificao do texto.

32

#VRML V2.0 utf8 Group { children [ Shape { appearance DEF Branco Appearance { material Material { } } geometry Text { string [ "Programando", "em VRML" ] fontStyle DEF Meu_Estilo FontStyle { size 3.0 family "TYPEWRITER" justify "MIDDLE" } } }, Shape { appearance USE Branco geometry Text { string [ "-----------", "-------" ] fontStyle USE Meu_Estilo } } ] }

Exemplo 3.11: Definindo e reutilizando estilos de fonte.

33

4
Transformando Figuras

4.1 Introduo
Como pode ser observado nas sees anteriores esta, os figuras primitivas bsicas e os textos so criados em locais pr-definidos do sistema de coordenadas. Por exemplo, uma esfera criada, originalmente, centrada na origem do sistema, no ponto (0,0,0). Por outro lado, na quase totalidade dos casos, a necessidade de localizao destas figuras geomtricas no est situada nestes pontos pr-definidos. Neste caso, apresenta-se a necessidade de levar a figura para a posio desejada, ou seja, de fazermos uma translao. O mesmo raciocnio pode ser feito para o tamanho e para a orientao da figura. Quando acontece a mesma situao, na qual a geometria no nos satisfaz, pode ser aplicada uma transformao de escala ou uma rotao para resolver o problema.

4.2 Nodo Transform


Em qualquer um dos casos citados acima, quando se faz necessrio alterar geometricamente a figura a ser colocada no ambiente tridimensional, deve ser aplicado a ela um nodo Transform: Transform { children translation rotation scale scaleOrientation bboxCenter bboxSize center addChildren removeChildren }

[] 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 1.0 1.0 0.0 0.0 0.0

# MFNode # SFVec3f # SFRotation # SFVec3f # SFRotation # SFVec3f # SFVec3f # SFVec3f # EventIn MFNode # EventIn MFNode

34

Neste nodo, o campo children defini as figuras que sofrero as transformaes a serem definidas. Os valores admissveis para este campo so componentes dos nodos Shape e Group. Os campos translation, rotation e scale definem as transformaes de translao, rotao e escala, respectivamente. O campo scaleOrientation tambm est envolvido com o processo de escala, assim como o campo center participa do processo de rotao. Os campos bbocCenter e bboxSize definem a localizao e o tamanho de um caixa suficientemente grande para envolver toda a figura transformada. Os valores default listados no nodo indicam que esta caixa dever ser calculada automaticamente pelo navegador se for necessrio. A necessidade e aplicao desta caixa ser discutida mais adiante. Finalmente, os campos eventIn addChildren e removeChildren acrescentam um novo nodo para a lista de figuras a serem transformadas e removem um nodo previamente existente nesta lista. Estes campos tambm sero trabalhados oportunamente.

4.3 Translao
4.3.1 Vetores em 3D A realizao de uma operao de translao baseada na definio de um vetor tridimensional. Considerando dois pontos no espao, um vetor um segmento de reta orientado que tem origem em um destes pontos e destino no outro. Em especial, vamos considerar aqueles vetores que tem origem no ponto (0,0,0), ou seja, na origem do sistema de coordenadas. Todo o vetor definido por trs componentes: direo, sentido e comprimento. A noo de direo idntica aquela dada para uma reta, ou seja, o ngulo pelo qual esta reta corta os eixos do sistema. Como o vetor um segmento de reta, ele possu uma dada direo. A componente sentido informa, dados os dois pontos que definem este segmento, qual ser a origem e qual ser o destino do vetor. Finalmente, a componente direo estabelece a distncia existente entre estes dois ponto. Note que a definio de um vetor independente da localizao deste vetor. Na verdade existe um nmero infinito de vetores que possuem a mesma direo, sentido e comprimento e, portanto, so iguais. Em especial perceba que o vetor que tem origem no ponto (0,0,0) idntico aos demais.

4.3.2 Operao de Translao Transladar um objeto, em qualquer circunstncia significa modificar a sua posio no espao, trocando-o de local. Se fizermos uma analogia com o mundo real, sempre que trocamos algum objeto de local, ou seja, fizemos uma translao, implicitamente definimos
35

esta operao como tendo uma direo, um sentido de deslocamento e uma distncia. Como estes elementos so exatamente aqueles que definem geometricamente um vetor, este elemento tem papel fundamental na definio desta operao. Retornando ao nodo Transform, o campo translation o que caracteriza a existncia de uma translao a ser aplicada ao conjunto de objetos listados no campo children e tambm como so os parmetros desta operao. Note que ele sucedido por trs valores reais (um campo do tipo SFVec3f) onde deve ser colocado o vetor de translao. A definio deste vetor pode ser realizada tomando-se como origem do mesmo o ponto (0,0,0) e o destino como um ponto qualquer (Px, Py, Pz). So justamente os valores deste ponto que devem ser listados como valores do campo translation. Por exemplo, se os valores listados forem (-3.0,2.0,2.5), a figura ser translada na direo, sentido e comprimento deste vetor, ou seja, 3.0 unidades no sentido negativo do eixo X, 2.0 unidades no sentido positivo do eixo Y e 2.5 unidades no sentido positivo do eixo Z.
#VRML V2.0 utf8 Transform { translation 2.0 0.0 0.0 children [ Shape { appearance Appearance { material Material {} } geometry Cylinder {} } ] }

Exemplo 4.1: Deslocando um cilindro no sentido positivo de X. Quando deseja-se fazer um deslocamento preservando um ou mais eixos do sistema, basta colocar o valor zero (0.0) no seu respectivo campo. Por exemplo, o vetor (2.0, 0.0, 0.0) faz com que a figura a ser translada no altere as suas coordenadas em Y e Z, apenas deslocando o valor da coordenada X e duas unidades.
#VRML V2.0 utf8 Transform { translation -2.0 0.0 0.0 children [ Shape { appearance Appearance { material Material {} } geometry Cylinder {} } ] }

Exemplo 4.2: Deslocando o cilindro em X.


36

Os exemplos 4.1 e 4.2 fazem com que a figura de um cilindro seja transladada duas unidades na direo do eixo X. O primeiro exemplo o faz no sentido de X positivo e o segundo, em X negativo. O exemplo 4.3 desloca a mesma figura duas unidades em Y positivo e o exemplo 4.4 faz isto em Z positivo.
#VRML V2.0 utf8 Transform { translation 0.0 2.0 0.0 children [ Shape { appearance Appearance { material Material {} } geometry Cylinder {} } ] }

Exemplo 4.3: Transladando no sentido de Y positivo.


#VRML V2.0 utf8 Transform { translation 0.0 0.0 2.0 children [ Shape { appearance Appearance { material Material {} } geometry Cylinder {} } ] }

Exemplo 4.4: Transladando em +Z. Existe ainda a possibilidade de estabelecermos deslocamentos em mltiplos eixos. o que acontece no exemplo 4.5 onde a figura deslocada 2 unidades em X positivo, 1 em Y positivo e 2 em Z negativo.
#VRML V2.0 utf8 Transform { translation 2.0 1.0 -2.0 children [ Shape { appearance Appearance { material Material {} } geometry Cylinder {} } ] }

Exemplo 4.5: Transladando em mltiplas direes combinadas.


37

#VRML V2.0 utf8 Group { children [ # Chao Shape { appearance DEF Branco Appearance { material Material {} } geometry Box { size 25.0 0.1 25.0 } }, # Coluna da esquerda Transform { translation -2.0 3.0 0.0 children Shape { appearance USE Branco geometry Cylinder { radius 0.3 height 6.0 } } }, # Coluna da direita Transform { translation 2.0 3.0 0.0 children Shape { appearance USE Branco geometry Cylinder { radius 0.3 height 6.0 } } }, # Cobertura Transform { translation 0.0 6.05 0.0 children Shape { appearance USE Branco geometry Box { size 4.6 0.4 0.6 } } } ] }

Exemplo 4.6: Deslocamentos mltiplos de vrias figuras.


38

Uma vez compreendido o processo de mltiplas translaes, possvel compor figuras mais complexas atravs de vrios deslocamentos realizados em figuras diferentes. O exemplo 4.6 define duas colunas (cilindros), desloca-as para os lados esquerdo e direito do observador e para cima (+Y), criando a base para uma espcie de prtico. Feito isto, o exemplo cria uma caixa que ser utilizada na cobertura do prtico e a coloca na parte de cima das colunas. No exemplo 4.7 criada a mesma figura do exemplo 4.6 e feita uma segunda cpia da mesma que, por sua vez, deslocada duas unidades no sentido negativo do eixo Z.

#VRML V2.0 utf8 Group { children [ # Chao Shape { appearance DEF Branco Appearance { material Material {} } geometry Box { size 25.0 0.1 25.0 } }, # Coluna da esquerda DEF ColunaE Transform { translation -2.0 3.0 0.0 children Shape { appearance USE Branco geometry Cylinder { radius 0.3 height 6.0 } } }, # Coluna da direita DEF ColunaD Transform { translation 2.0 3.0 0.0 children Shape { appearance USE Branco geometry Cylinder { radius 0.3 height 6.0 } } }, # Cobertura DEF Cobertura Transform { translation 0.0 6.05 0.0 39

children Shape { appearance USE Branco geometry Box { size 4.6 0.4 0.6 } } }, # Segundo objeto Transform { translation children [ USE USE USE ] } ] }

0.0 0.0 -2.0 ColunaE ColunaD Cobertura

Exemplo 4.7: Faz uma cpia da figura do exemplo anterior e coloca-a em outra posio.

4.4 Rotao
A operao de rotao definida no campo rotation do nodo Transform. Este campo estabelece quatro valores reais. Os trs primeiros deles representam um eixo imaginrio no sistema de coordenadas em torno do qual a figura ir girar. O quarto e ltimo parmetro representa o ngulo de rotao. A definio de um eixo dentro do sistema de coordenadas no qual acontecer a rotao necessria em razo desta operao acontecer sempre em volta de algum segmento. A definio deste eixo segue os mesmos princpios dos vetores utilizados na translao. Aqui, entretanto, o comprimento do vetor no considerado e sim a sua direo e sentido de crescimento. A rotao ir acontecer em torno deste eixo por um ngulo medido sempre em radianos1 e orientada tambm pela regra da mo direita. Considere que, com a mo direita envolvemos o eixo de rotao, com o polegar apontando no sentido positivo de crescimento do mesmo. Se este ngulo for positivo, a figura ir girar no sentido em que apontam os demais dedos da mo. Se o ngulo for negativo, acontece o contrrio. Existe ainda a possibilidade de especificarmos um centro de rotao para a figura atravs do campo center do nodo Transform. Por definio, o centro de rotao das figuras a origem do sistema de coordenadas, ou seja, o ponto (0,0,0). Com o uso deste campo voc especifica um outro sistema de coordenadas (outro ponto de referncia) que servir de base para a rotao. Isto necessrio quando possumos figuras articuladas como a juno de braos e pernas, onde o movimento fora o giro em torno de um outro ponto que no a origem do sistema.
1

Radianos = ( Graus * 3.141592)/180 40

Os exemplos 4.8, 4.9, 4.10 e 4.11 fazem com que uma caixa seja rotacionada em 0,785 radianos (45 graus) em torno dos eixos +X, +X, +Y e +Z, respectivamente. No segundo exemplo o ngulo de rotao negativo e a figura girar no sentido contrrio ao do exemplo 4.8.
#VRML V2.0 utf8 Transform { rotation 1.0 0.0 0.0 0.785 children [ Shape { appearance Appearance { material Material {} } geometry Box {} } ] }

Exemplo 4.8: Girar um caixa por 45 graus em torno do eixo X.

#VRML V2.0 utf8 Transform { rotation 1.0 0.0 0.0 -0.785 children [ Shape { appearance Appearance { material Material {} } geometry Box {} } ] }

Exemplo 4.9: Girar um caixa por 45 graus em torno do eixo X.

#VRML V2.0 utf8 Transform { rotation 0.0 1.0 0.0 0.785 children [ Shape { appearance Appearance { material Material {} } geometry Box {} } ] }

Exemplo 4.10: Girar a mesma caixa em torno do eixo Y.

41

#VRML V2.0 utf8 Transform { rotation 0.0 0.0 1.0 -0.785 children [ Shape { appearance Appearance { material Material {} } geometry Box {} } ] }

Exemplo 4.11: A caixa ir girar em torno do eixo Z.

#VRML V2.0 utf8 Group { children [ DEF Coluna Shape { appearance Appearance { material Material {} } geometry Cylinder { height 1.0 radius 0.1 }

}, Transform { rotation 1.0 0.0 0.0 children USE Coluna }, Transform { rotation 1.0 0.0 0.0 children USE Coluna } ] }

1.047

2.094

Exemplo 4.12: Girando vrios objetos.

Os exemplo 4.12 e 4.13 criam uma figura mais complexa que formada por primitivos simples (cilindros) rotacionados convenientemente. O exemplo 4.14 toma o prtico construdo no exemplo 4.6 e coloca uma cobertura no mesmo girando duas caixas que formaro o telhado.

42

#VRML V2.0 utf8 Group { children [ DEF Coluna1 Shape { appearance Appearance { material Material {} } geometry Cylinder { height 1.0 radius 0.1 }

}, DEF Coluna2 Transform { rotation 1.0 0.0 0.0 children USE Coluna1 }, DEF Coluna3 Transform { rotation 1.0 0.0 0.0 children USE Coluna1 }, Transform { rotation 0.0 1.0 0.0 children [ USE Coluna2, USE Coluna3 ] } ] }

1.047

2.094

1.785

Exemplo 4.13: Agregando mais objetos ao exemplo 4.12.

#VRML V2.0 utf8 Group { children [ # Chao Shape { appearance DEF Branco Appearance { material Material {} } geometry Box { size 25.0 0.1 25.0 } }, # Coluna da Esquerda DEF ColunaE Transform { 43

translation -2.0 3.0 0.0 children DEF Coluna Shape { appearance USE Branco geometry Cylinder { radius 0.3 height 6.0 } } }, # Coluna da Direita DEF ColunaD Transform { translation 2.0 3.0 0.0 children USE Coluna }, # Cobertura DEF Cobertura Transform { translation 0.0 6.05 0.0 children Shape { appearance USE Branco geometry Box { size 4.6 0.4 0.6 } } }, # Telhado DEF TelhadoE Transform { translation -1.15 7.12 0.0 rotation 0.0 0.0 1.0 0.524 children DEF Telha Shape { appearance USE Branco geometry Box { size 2.86 0.4 0.6 } } }, DEF TelhadoD Transform { translation 1.15 7.12 0.0 rotation 0.0 0.0 1.0 -0.524 children USE Telha

} ] }

Exemplo 4.14: Colocando telhado no prtico do exemplo 4.6.

O exemplo 4.15 constri um abajur estilizado. Note que para formar a articulao de juno das duas partes do brao do abajur necessrio estabelecer um centro de rotao diferente da origem. Neste caso o ponto escolhido (0.0, 0.15, 0.0).

44

#VRML V2.0 utf8 Group { children [ # Base da lampada Shape { appearance DEF Branco Appearance { material Material {} } geometry Cylinder { radius 0.1 height 0.01 } }, # Braco da lampada Transform { translation 0.0 0.15 0.0 rotation 1.0 0.0 0.0 -0.7 center 0.0 -0.15 0.0 children [ DEF Braco Shape { appearance USE Branco geometry Cylinder { radius 0.01 height 0.3 } }, Transform { translation 0.0 0.3 0.0 rotation 1.0 0.0 0.0 1.9 center 0.0 -0.15 0.0 children USE Braco } ] } ] }

Exemplo 4.15: Desenho de um abajur.

4.5 Escala
A operao de escala faz com que as dimenses de uma figura sejam ampliadas ou reduzidas conforme a necessidade. Ela realizada atravs do campo scale do nodo Transform. Este campo representado por trs valores reais que especificam os fatores de escala para cada um dos eixos do sistema de coordenadas. O primeiro deles nos diz o

45

quanto desejamos aumentar ou diminuir a figura no sentido do eixo X; o segundo, em Y; e, o terceiro em Z. Os fatores de escala so valores maiores do que zero (0) necessariamente. Se eles esto no intervalo ] 0 ; 1 [, acontece uma reduo proporcional ao valor. Por exemplo, o valor de 0.5 reduz a figura a metade do seu tamanho original naquele eixo. Se os valores forem maiores do que 1, ocorre uma ampliao desta figura. O valor de 1 para a escala no acarreta em modificaes da figura. Se os fatores de escala forem iguais, esta operao acontece de forma uniforme, ou seja, preservando as propores originais da figura. O mesmo no acontece se estes valores forem diferentes. Em algumas situaes no suficiente ou desejvel aplicar a escala tendo como referncia os eixos X, Y e Z do sistema de coordenadas. Para estes casos previsto um outro campo do nodo Transform chamado de scalaOrientation, que descreve um novo sistema de coordenadas para aplicao da escala atravs da rotao do sistema original. Os seus parmetros so os mesmos e tem a mesma funo daqueles utilizados na operao de rotao. Ainda possvel especificar um novo centro de referncia para a operao de escala atravs do campo center. Assim como na rotao, este campo especifica um ponto que a origem deste novo centro. Observando a aplicao da transformao de escala, nos exemplos 4.16, 4.17, 4.18, 4.19 e 4.20, apresentada a transformao de uma esfera em um processo de escala no uniforme, ou seja, o resultado final topologicamente equivalente a uma esfera, mas a sua forma no idntica.

#VRML V2.0 utf8 Transform { scale 2.0 1.0 1.0 children [ Shape { appearance Appearance { material Material {} } geometry Sphere {} } ] }

Exemplo 4.16: Transformao em escala de uma esfera.

46

#VRML V2.0 utf8 Transform { scale 0.5 1.0 1.0 children [ Shape { appearance Appearance { material Material {} } geometry Sphere {} } ] }

Exemplo 4.17: Outra transformao da esfera.

#VRML V2.0 utf8 Transform { scale 1.0 2.0 1.0 children [ Shape { appearance Appearance { material Material {} } geometry Sphere {} } ] }

Exemplo 4.18: A esfera ampliada diferenciadamente nos eixos do sistema.

#VRML V2.0 utf8 Transform { scale 1.0 1.0 0.5 children [ Shape { appearance Appearance { material Material {} } geometry Sphere {} } ] }

Exemplo 4.19: A esfera reduzia a metade no eixo Z.

47

#VRML V2.0 utf8 Transform { scale 2.0 0.5 4.0 children [ Shape { appearance Appearance { material Material {} } geometry Sphere {} } ] }

Exemplo 4.20: A esfera reduzida no eixo Y e ampliada nos demais.


#VRML V2.0 utf8 Group { children [ DEF Corpo Transform { scale 0.5 1.0 1.5 children Shape { appearance DEF Branco Appearance { material Material {} } geometry Cylinder { radius 1.0 height 0.025 } } }, DEF Fuselagem Transform { scale 2.0 0.2 0.5 children Shape { appearance USE Branco geometry Sphere {} } }, Transform { scale 0.3 2.0 0.75 children [ USE Corpo USE Fuselagem ] } ] }

Exemplo 4.21: Desenho de um avio.

48

O exemplo 4.21 desenha um avio estilizado utilizando-se apenas da deformao de figuras bsicas como esferas e cilindros. O exemplo 4.22 faz cpias do prtico utilizado no exemplo 4.14 e reduz estas cpias a metade do tamanho original. Note que os fatores de escala deste exemplo so iguais, portanto a escala uniforme e o resultado uma figura com as mesmas propores da original

#VRML V2.0 utf8 Group { children [ # Chao Shape { appearance DEF Branco Appearance { material Material {} } geometry Box { size 25.0 0.1 25.0 } }, DEF Casa Group { children [ # Coluna da Esquerda DEF ColunaE Transform { translation -2.0 3.0 0.0 children DEF Coluna Shape { appearance USE Branco geometry Cylinder { radius 0.3 height 6.0 } } }, # Coluna da Direita DEF ColunaD Transform { translation 2.0 3.0 0.0 children USE Coluna }, # Cobertura DEF Cobertura Transform { translation 0.0 6.05 0.0 children Shape { appearance USE Branco geometry Box { size 4.6 0.4 0.6 } } }, 49

# Telhado DEF TelhadoE Transform { translation -1.15 7.12 0.0 rotation 0.0 0.0 1.0 0.524 children DEF Telha Shape { appearance USE Branco geometry Box { size 2.86 0.4 0.6 } } }, DEF TelhadoD Transform { translation 1.15 7.12 0.0 rotation 0.0 0.0 1.0 0.524 children USE Telha

} ] }, # Faz copias de tamanho diferente Transform { translation -4.0 0.0 0.0 scale 0.5 0.5 0.5 children USE Casa }, Transform { translation 4.0 0.0 0.0 scale 0.5 0.5 0.5 children USE Casa } ] }

Exemplo 4.22: Criando duas cpias do prtico do exemplo 4.14.

A figura do exemplo 4.23 transformada tendo como base um novo centro de referncia no ponto (0,-1,0), o que faz com que a rvore da figura aumente seu tamanho tendo como base o ponto dado e no a origem do sistema. Por ltimo, o exemplo 4.24 apresenta uma transformao de escala definida como uma orientao diferente do usual, o que faz com que a rvore incline para o lado indicado pelo novo eixo de orientao.

50

#VRML V2.0 utf8 Group { children [ Shape { appearance DEF Branco Appearance { material Material {} } geometry Box { size 12.0 0.1 12.0 } }, Transform { translation 0.0 1.0 0.0 scale 1.0 2.0 1.0 center 0.0 -1.0 0.0 children [ Shape { appearance USE Branco geometry Cylinder { radius 0.5 height 2.0 } }, Transform { translation 0.0 3.0 0.0 children Shape { appearance USE Branco geometry Cone { bottomRadius 2.0 height 4.0 } } } ] } ] }

Exemplo 4.23: Definio de um novo centro de referncia para a escala.

51

#VRML V2.0 utf8 Group { children [ Shape { appearance DEF Branco Appearance { material Material {} } geometry Box { size 12.0 0.1 12.0 } }, Transform { translation 0.0 1.0 0.0 scale 1.0 2.0 1.0 scaleOrientation 0.0 0.0 1.0 -0.785 center 0.0 -1.0 0.0 children [ Shape { appearance USE Branco geometry Cylinder { radius 0.5 height 2.0 } }, Transform { translation 0.0 3.0 0.0 children Shape { appearance USE Branco geometry Cone { bottomRadius 2.0 height 4.0 } } } ] } ] }

Exemplo 4.24: Definio de um novo eixo de orientao para a escala.

52

5
Animando o Posicionamento, Orientao e Escala das Figuras

5.1 Introduo
Para adicionar movimento ao mundo virtual, uma das alternativas animar o posicionamento, orientao e escala de uma cena. Se o sistema de coordenadas desta cena se move, todas as figuras construdas nela tambm se movero. Neste contexto, entende-se como animao qualquer modificao da figura que ocorre em um determinado intervalo de tempo. Os dois elementos bsicos deste processo so um relgio que controla a animao no tempo e a descrio do que ir e como ir mudar neste intervalo de tempo. A linguagem VRML fornece o nodo TimeSensor para criar o relgio e os nodos PositionInterpolator e OrientationInterpolator para controlar as modificaes. Estes ltimos tem a funo de definir a orientao ou posio correta da figura a partir das informaes de tempo obtidas do relgio. O nodo TimeSensor age como um relgio real, contabilizando o tempo a partir do momento da sua inicializao. Sempre que estiver ativo, o tempo corrente disponibilizado pelo seu campo eventOut time. Para fazermos o controle da animao, estes eventos de sada (tempo) devem ser roteados para os nodos que controlam as modificaes. Quando trabalha nestas condies, o resultado do nodo TimeSensor uma unidade de tempo absoluto, medido em segundos, desde a 00:00 hora do dia 1 de janeiro de 1970. Nesta situao, o segundo 0 (zero) aconteceu nesta data, o segundo 1 logo a seguir e assim por diante. Atravs disto, possvel programar o nodo TimeSensor para agir em datas e horas especficas. Isto acontece quando o tempo especfico de incio e fim da atuao do nodo informado aos campos startTime e stopTime. Apesar de fornecer um bom mecanismo de controle, a medida do tempo de forma absoluta nem sempre conveniente ao trabalho. Muitas vezes, seno a maioria delas, necessita-se apenas animar uma figura num certo intervalo de tempo que independe da data e da hora exata. Este tempo conhecido como tempo fracional. Nele a animao comea no
53

tempo 0 (zero) e termina o tempo 1 (um), podendo ser fracionada neste intervalo como for necessrio. Como isto, na maioria das vezes, no o suficiente, possvel ainda colocar este tempo em um loop e repet-lo tanto quanto seja necessrio.

5.2 Processo de Animao


Conforme mencionado, o resultado do cmputo do tempo utilizado nos nodos de interpolao para calcular o valor exato da translao ou rotao a ser informado ao nodo Transform. Este tem a responsabilidade de apresentar a figura, como visto anteriormente. Neste processo, uma descrio da animao deve fornecer a posio ou orientao para cada nova unidade de tempo fracional pertencente ao intervalo listado. De forma mais simples podemos dizer que esta descrio funciona como uma tabela, havendo uma entrada de descrio para cada entrada de tempo existente. Os valores de posicionamento ou orientao calculados para estes tempos so chamados de valores de chave (key values). O interpolador VRML utiliza estes valores de chave e os de tempo para construir um modelo ou rascunho da animao e preenche os valores entre aqueles especificados por conta prpria, se necessrio. Por exemplo, caso se deseje fazer com que um carro v da esquerda para a direita, pode-se mencionar apenas os valores 0.0 e 1.0 como tempos fracionais, pois se tratando de uma reta, o interpolador no ter dificuldades em encontrar os valores intermedirios necessrios. Nesta situao, o tempo fracionrio 0.5 ter seus valores calculados pelo interpolador e corresponder ao meio do caminho. Por outro lado, se desejamos fazer com que o carro faa um curva, ser necessrio fornecer mais valores no intervalo para que o mesmo descreva esta curva de forma suave. Assim sendo, os nodos PositionInterpolator e OrientationInterpolator utilizam os valores listados de tempo fracional e valores de chave para descrever a animao. Os tempos fracionais so descritos no campo key e os valores chave no campo keyValue. Ambos os campos podem ter qualquer quantidade de valores, mas sempre na correspondncia de um para um. Para finalizar, o interpolador VRML utiliza-se sempre de uma interpolao linear entre dois valores de chave listados, ou seja, o caminho encontrado entre os dois ser sempre uma reta. Todos os pontos calculados neste intervalo faro parte deste segmento. Desta forma, para descrever um caminho curvo, vrios pontos de interpolao devero ser descritos, em quantidade tanta quanto for a preciso desejada. Durante a aplicao, quando necessrio fazer uma interpolao de posicionamento, o interpolador calcula os respectivos valores para as coordenadas X, Y e Z dos pontos necessrio ao processo. J para realizar uma animao de rotao, alm do eixos de rotao X, Y e Z, necessrio interpolar tambm o ngulo de rotao.

54

O valor computado pelo nodo PositionInterpolator do tipo SFVec3f e projetado para ser utilizado como entrada de valores de translaes ou coordenadas tridimensionais. O nodo Transform, por exemplo, utiliza um valor deste como definio do campo translation e, por tanto, o interpolador de posies pode control-lo. De forma analgica, podemos fazer a mesma relao para o interpolador de orientao, pois o seu resultado no mesmo formato necessrio ao campo rotation. Seguindo esta linha de raciocnio, todo o campo que necessite de um valor SFVec3f como entrada candidato a ser animado atravs do interpolador de posicionamento. O mesmo para a orientao. Em especial, este procedimento pode ser adotado para o campo scale do nodo Transform que controla a escala aplicada a um objeto e tem um campo no formato SFVec3f. Atravs do PositionInterpolator podemos ento animar fatores de escala para um dado objeto.

5.3 Nodo TimeSensor


O nodo TimeSensor, mencionado nas sees anteriores o responsvel pelo controle do relgio que gera os eventos para a animao. Sua sintaxe : TimeSensor { enable startTime stopTime cycleInterval loop isActive time cycleTime fraction_changed }

TRUE 0.0 0.0 1.0 FALSE

# SFBool # SFTime # SFTime # SFTime # SFBool # eventOut SFBool # eventOut SFTime # eventOut SFTime # eventOut SFFloat

O valor do campo enable especifica se o relgio est ativado ou no. Se o seu valor TRUE, o relgio est ligado e o restante dos campos do nodo so utilizados para controlar este funcionamento. Se o seu valor FALSE, o relgio est desligado e nenhuma sada produzida em intervalos de tempo. Os campos startTime e stopTime especificam os tempos nos quais o relgio deve ser ligado ou desligado, respectivamente. O campo cycleInterval especifica a quantidade de tempo no qual o interpolador dever levar para ir do tempo fracionrio 0.0 para o tempo 1.0. Por exemplo, podemos especificar apenas os dois extremos do intervalo para animar uma figura, mas desejamos ir do primeiro para o ltimo em 30 segundos ou em 10 segundos. Este ltimo ser o valor do campo cycleInterval.

55

O campo loop especifica se o relgio ir entrar em lao ou no. Quando o seu valor TRUE o fracionar ao chegar no final do intervalo (1.0) retornar ao valor 0.0 e reinicia o processo. Quando o valor do campo FALSE, no acontece este retorno. Os campos startTime, stopTime, cycleInterval e loop podem trabalhar de forma conjunta para controlar o resultado de sada do relgio. Uma vez ativado, o relgio permanece em aguardo at que o startTime seja alcanado. Neste momento, o sensor ativado e inicia a gerar eventos. Se o campo loop FALSE, ento o sensor gera eventos at que o tempo stopTime seja atingido ou um ciclo completo seja completado em startTime + cycleInterval, o que acontecer primeiro. Se o campo loop TRUE, ento o sensor gera eventos continuamente at que o tempo final seja atingido, se acontecer. Com isto podem ser criados loops infinitos. A tabela a seguir apresenta as possveis combinaes entre estes campos e seus efeitos: Valor do Relacionamento entre os campo loop campos de tempo TRUE stopTime <= startTime TRUE startTime < stopTime FALSE FALSE FALSE Efeito

No termina a execuo. Executa at atingir o tempo stopTime stopTime <= startTime e Executa um ciclo e para no cycleInterval tempo startTime+cycleInterval startTime < (startTime+ Executa um ciclo e para no cycleInterval) <= stopTime tempo startTime+cycleInterval startTime < stopTime < Executa pelo menos um ciclo e (startTime+cycleInterval) para no tempo stopTime

O campo isActive eventOut e retorna um dado booleano TRUE quando o sensor ativado e inicia a gerao de eventos. Um sinal FALSE enviado por este campo quando o sensor pra a gerao de eventos e se torna inativo. O campo time tambm eventOut e atravs dele possvel obter o valor do tempo absoluto enquanto o sensor estiver gerando eventos. O campo eventOut cycleTime informa o valor do tempo absoluto cada vez que o ciclo de tempo reiniciado. Se o campo loop FALSE, ento a sada do valor informado apenas na incio do primeiro e nico ciclo. Finalmente, o campo eventOut fraction_chaged informa um valor de tempo fracional, entre 0.0 e 1.0, que como o sensor progride pelo ciclo. Se o campo loop FALSE, os valores so informados apenas durante um nico ciclo. Caso contrrio, os valores so informados repetidamente, a cada novo ciclo. O valor do campo enable pode ser modificado atravs de um evento roteado para o campo eventIn set_enable. A informao enviado no evento do tipo booleano e ativa (TRUE) ou desativa (FALSE) o relgio. O resultado da operao informado atravs de um campo eventOut enable_changed.
56

De forma semelhante, o valor do campo loop pode ser modificado atravs de um evento roteado para o campo eventIn set_loop. Este evento igualmente booleano e ativa (TRUE) ou desativa (FALSE) a entrada do relgio em lao. O resultado da operao informado atravs do campo eventOut loop_changed. Os valores dos campos startTime, stopTime e cycleInterval podem ser modificados por eventos para os campos eventIn set_startTime, set_stopTime e set_cycleInterval, respectivamente. Quando a operao finalizada, o resultado informado atravs dos campos eventOut starTime_changed, stopTime_changed e cycleInterval_changed, respectivamente. Estas operaes somente tero efeito se o relgio estiver desativado. Caso contrrio, o novo valor informado ignorado. O nodo TimeSensor no cria nenhuma figura no mundo virtual e no h nenhum efeito visvel de sua presena. Ele pode ser utilizado como filho de qualquer grupo de nodos, mas totalmente independente do sistema de coordenadas utilizado.

5.4 Nodo PositionInterpolator


O nodo PositionInterpolator descreve uma srie de posies chave disponveis para o uso no processo de animao. Sua sintaxe : PositionInterpolator { key keyValue set_fraction value_changed }

[] []

# MFFloat # MFVec3f # eventIn SFFloat # eventOut SFVec3f

O campo key especifica uma lista de valores chave, fracionais, tipicamente entre 0.0 e 1.0, tais como aqueles produzidos na sada o nodo TimeSensor. Estes valores podem ser positivos ou negativos, de qualquer tamanho, e devem ser expressos em ordem crescente. O campo keyValue tambm composto de uma lista de valores, cada um deles contendo uma valor para cada coordenada do sistema (X, Y e Z). Os valores desta lista e da primeira, do campo key, so utilizados em conjunto tal que o primeiro valor da primeira lista especifica o tempo para o primeiro valor da segunda lista, de posies. Estas listas, conjuntamente so capazes de especificar qualquer nmero de tempo e posies, mas ambas devem conter a mesma quantidade de valores. Quando o nodo PositionInterpolator recebe um tempo fracional atravs do campo set_fraction, ele calcula a nova posio baseada na lista de posies chaves e seus tempos fracionais correspondentes. O resultado informado atravs do campo value_changed. Tipicamente os tempos fracionais so informados ao campo set_fraction atravs de um evento roteado do campo eventOut fraction_changed do nodo TimeSensor. Estes tempos
57

fracionais tambm podem ser gerados por outros meios caso venha a ser necessrio, mas sempre dentro dos formatos especificados. O nodo PositionInterpolator tambm no cria nenhuma figura e no tem efeito visvel. Ele pode ser includo como um filho de qualquer grupo, mas independente do sistema de coordenadas utilizado.

5.5 Nodo OrientationInterpolator


O nodo OrientationInterpolator trabalha de forma assemelhada ao nodo de interpolao de posies, mas ele descreve uma srie de valores chave de rotaes que esto disponveis para uma animao. Sua sintaxe : OrientationInterpolator { key keyValue set_fraction value_changed }

[] []

# MFFloat # MFRotation # eventIn SFFloat # eventOut SFRotation

Essencialmente, os campos e a funo de cada um deles a mesma que descrita para o nodo PositionInterpolator. A nica diferena de maior monta quanto ao contedo do campo keyValue que agora tem cada uma das entradas composta de quatro valores onde os trs primeiros descrevem um eixo de rotao e o quarto o ngulo, da mesma forma que na transformao de rotao.

5.6 Exemplos
Para melhorar a compreenso do processo de animao, vamos comentar alguns exemplos. O exemplo 5.1 faz com que uma caixa fique pulando ou saltitando pela tela do navegador. Neste exemplo, o relgio atual em lao infinito e cada interao deste lao tem a durao de 4 segundos, conforme o campo cycleInterval. No campo key do interpolador so estabelecidos os intervalos do tempo fracionrio correspondentes as posies estabelecidas no campo keyValue. Conforme foi mencionado, as demais posies so interpoladas linearmente pelo interpolador. Ao final do exemplo existem duas linhas que definem as rotas nas quais os eventos iro circular. A primeira linha utiliza a sada de tempo fracionrio do relgio como entrada para o campo set_fraction do interpolador da caixa. Este por sua vez, ao recalcular o novo valor o envia pelo campo value_changed que , por sua vez, informado como entrada para a transformao de translao da caixa.
58

#VRML V2.0 utf8 Group { children [ # Define a caixa que sera animada DEF Cubo Transform { children Shape { appearance Appearance { material Material { diffuseColor 0.0 0.0 1.0 } } geometry Box { size 1.0 1.0 1.0 } } }, # Define o relgio DEF Clock TimeSensor { cycleInterval 5.0 loop TRUE }, # Descreve o caminha da animacao DEF CaminhoCubo PositionInterpolator { key [ 0.00, 0.11, 0.17, 0.22, 0.33, 0.44, 0.50, 0.55, 0.66, 0.77, 0.83, 0.88, 0.99 ] keyValue [ 0.0 0.0 0.0, 1.0 1.96 1.0, 1.5 2.21 1.5, 2.0 1.96 2.0, 3.0 0.0 3.0, 2.0 1.96 3.0, 1.5 2.21 3.0, 1.0 1.96 3.0, 0.0 0.0 3.0, 0.0 1.96 2.0, 0.0 2.21 1.5, 0.0 1.96 1.0, 0.0 0.0 0.0 ] } ] } # Define a rota dos eventos ROUTE Clock.fraction_changed ROUTE CaminhoCubo.value_changed

TO CaminhoCubo.set_fraction TO Cubo.set_translation

Exemplo 5.1: Animao de um cubo saltando na tela.

O exemplo 5.2 trabalha de forma bastante semelhante ao exemplo anterior, mas utiliza o resultado do interpolador de orientao como informao para a definio da nova
59

orientao de um cilindro. Na prtica, ela faz com que o cilindro gira pela tela sistematicamente. Observe que os valores de chave do campo key do interpolador esto em menor nmero. Isto devido ao fato de que, sendo uma rotao, so calculadas posies para todas os ngulos do crculo trigonomtrico.

#VRML V2.0 utf8 Group { children [ # Cilindro girando DEF Coluna Transform { rotation 0.0 0.0 1.0 0.0 children Shape { appearance Appearance { material Material { diffuseColor 0.0 1.0 0.0 } } geometry Cylinder { height 1.0 radius 0.2 } } }, # Define o relgio DEF Clock TimeSensor { cycleInterval 4.0 loop TRUE }, # Descreve o caminho da animacao DEF CaminhoColuna OrientationInterpolator { key [ 0.0, 0.50, 1.0 ] keyValue [ 0.0 0.0 1.0 0.0, 0.0 0.0 1.0 3.14, 0.0 0.0 1.0 6.28 ] } ] } # Define rotas dos eventos ROUTE Clock.fraction_changed ROUTE CaminhoColuna.value_changed

TO CaminhoColuna.set_fraction TO Coluna.set_rotation

Exemplo 5.2: Animao de um cilindro girando na tela.

60

O exemplo 5.3 faz o uso do interpolador de posicionamento para alimentar a entrada da transformao em escala do nodo que define a esfera. Esta operao, com os valores definidos, faz com que a esfera mostrada aumente de tamanho e, logo em seguida, diminua, de forma a representar que est pulsando na tela.
#VRML V2.0 utf8 Group { children [ # Define bola pulsante DEF Bola Transform { children Shape { appearance Appearance { material Material { diffuseColor 1.0 0.0 0.0 } } geometry Sphere {} } }, # Define o relogio DEF Clock TimeSensor { cycleInterval 2.0 loop TRUE }, # Descreve o caminho da animacao DEF CaminhoBola PositionInterpolator { key [ 0.0, 0.20, 0.65, 1.0 ] keyValue [ 1.0 1.0 1.0, 1.5 1.5 1.5, 1.1 1.1 1.1, 1.0 1.0 1.0 ] } ] } # Define rota dos eventos ROUTE Clock.fraction_changed ROUTE CaminhoBola.value_changed

TO CaminhoBola.set_fraction TO Bola.set_scale

Exemplo 5.3: Uma esfera pulsando na tela. O exemplo 5.4 mostra como pode ser utilizado um nico interpolador para manipular vrias figuras. Neste caso, este interpolador faz com que trs caixa pulem sincronizadamente na tela. Este sincronsmo vem do uso deste nico gerador de posies.

61

#VRML V2.0 utf8 Group { children [ # Primeiro cubo DEF Cubo1 Transform { children DEF TipoCubo Shape { appearance Appearance { material Material { diffuseColor 1.0 0.0 0.0 } } geometry Box { size 1.0 1.0 1.0 } } }, # Segundo cubo Transform { translation -2.0 0.0 0.0 children DEF Cubo2 Transform { children USE TipoCubo } }, # Terceiro cubo Transform { translation 2.0 0.0 0.0 children DEF Cubo3 Transform { children USE TipoCubo } }, # Define o relogio DEF Clock TimeSensor { cycleInterval 4.0 loop TRUE }, # Descreve o caminho da animacao DEF CaminhoCubo PositionInterpolator { key [ 0.00, 0.11, 0.17, 0.22, 0.33, 0.44, 0.50, 0.55, 0.66, 0.77, 0.83, 0.88, 0.99 ] keyValue [ 0.0 0.0 0.0, 1.0 1.96 1.0, 1.5 2.21 1.5, 2.0 1.96 2.0, 3.0 0.0 3.0, 2.0 1.96 3.0, 1.5 2.21 3.0, 1.0 1.96 3.0, 0.0 0.0 3.0, 0.0 1.96 2.0, 0.0 2.21 1.5, 0.0 1.96 1.0, 62

0.0 0.0 ] } ] } # Define rotas dos eventos ROUTE Clock.fraction_changed ROUTE CaminhoCubo.value_changed ROUTE CaminhoCubo.value_changed ROUTE CaminhoCubo.value_changed

0.0

TO TO TO TO

CaminhoCubo.set_fraction Cubo1.set_translation Cubo2.set_translation Cubo3.set_translation

Exemplo 5.4: Uso de vrios figuras sendo interpoladas por um nico interpolador. O exemplo 5.5, em contraponto ao exemplo anterior, faz o uso de mltiplos interpoladores para controlar diferentes figuras. Isto faz com que as trs figuras presentes no texto girem de forma no sincronizada. Finalmente o exemplo 5.6 apresenta o uso de mltiplos relgios para controlar mltiplos interpoladores e mltiplas figuras. Neste exemplo, esta ao faz com que um sistema solar simulado tenha os seus planetas (figuras diferentes) girando em torno do seu sol com rbitas diferentes (interpoladores diferentes) e a velocidades diferentes (relgios diferentes).
#VRML V2.0 utf8 Group { children [ # Primeira barra giratria DEF Barra1 Transform { children Shape { appearance DEF CorBarra Appearance { material Material { diffuseColor 1.0 1.0 0.0 } } geometry Box { size 1.5 0.2 0.2 } } }, # Segunda barra DEF Barra2 Transform { children Shape { appearance USE CorBarra geometry Box { size 0.2 1.5 0.2 } } },

63

# Terceira Barra DEF Barra3 Transform { children Shape { appearance USE CorBarra geometry Box { size 0.2 0.2 1.5 } } }, # Define o relogio DEF Clock TimeSensor { cycleInterval 4.0 loop TRUE }, # Descreve o caminho da animacao DEF CaminhoBarra1 OrientationInterpolator { key [ 0.0, 0.50, 1.0 ] keyValue [ 0.0 0.0 1.0 0.0, 0.0 0.0 1.0 3.14, 0.0 0.0 1.0 6.28 ] }, DEF CaminhoBarra2 OrientationInterpolator { key [ 0.0, 0.50, 1.0 ] keyValue [ 1.0 0.0 0.0 0.0, 1.0 0.0 0.0 3.14, 1.0 0.0 0.0 6.28 ]

}, DEF CaminhoBarra3 OrientationInterpolator { key [ 0.0, 0.50, 1.0 ] keyValue [ 0.0 1.0 0.0 0.0, 0.0 1.0 0.0 3.14, 0.0 1.0 0.0 6.28 ]

} ] } # Descreve as rotas dos eventos ROUTE Clock.fraction_changed TO CaminhoBarra1.set_fraction ROUTE Clock.fraction_changed TO CaminhoBarra2.set_fraction ROUTE Clock.fraction_changed TO CaminhoBarra3.set_fraction ROUTE CaminhoBarra1.value_changed TO Barra1.set_rotation ROUTE CaminhoBarra2.value_changed TO Barra2.set_rotation ROUTE CaminhoBarra3.value_changed TO Barra3.set_rotation

Exemplo 5.5: Uso de mltiplos interpoladores.

64

#VRML V2.0 utf8 Group { children [ # Sistema planetario # Sol Shape { appearance Appearance { material Material { diffuseColor 1.0 1.0 0.0 } } geometry Sphere {} }, # Planetas DEF Planeta1 Transform { translation 2.0 0.0 0.0 center -2.0 0.0 0.0 children Shape { appearance DEF CorPlaneta Appearance { material Material { diffuseColor 1.0 1.0 1.0 } } geometry Sphere { radius 0.2 } } }, DEF Planeta2 Transform { translation 3.0 0.0 0.0 center -3.0 0.0 0.0 children Shape { appearance USE CorPlaneta geometry Sphere { radius 0.3 } } }, DEF Planeta3 Transform { translation 4.0 0.0 0.0 center -4.0 0.0 0.0 children Shape { appearance USE CorPlaneta geometry Sphere { radius 0.5 } } },

65

# Define um relogio para cada planeta DEF Clock1 TimeSensor { cycleInterval 2.0 loop TRUE } DEF Clock2 TimeSensor { cycleInterval 3.5 loop TRUE

} DEF Clock3 TimeSensor { cycleInterval 5.0 loop TRUE

} # Descreve os caminhos da animacao. Um para cada planeta DEF CaminhoPlaneta1 OrientationInterpolator { key [ 0.0, 0.50, 1.0 ] keyValue [ 0.0 0.0 1.0 0.0, 0.0 0.0 1.0 3.14, 0.0 0.0 1.0 6.28 ] }, DEF CaminhoPlaneta2 OrientationInterpolator key [ 0.0, 0.50, 1.0 ] keyValue [ 0.0 0.0 1.0 0.0, 0.0 0.0 1.0 3.14, 0.0 0.0 1.0 6.28 ] {

}, DEF CaminhoPlaneta3 OrientationInterpolator key [ 0.0, 0.50, 1.0 ] keyValue [ 0.0 0.0 1.0 0.0, 0.0 0.0 1.0 3.14, 0.0 0.0 1.0 6.28 ] {

} ] } # Define as rotas dos eventos ROUTE Clock1.fraction_changed TO ROUTE Clock2.fraction_changed TO ROUTE Clock3.fraction_changed TO ROUTE CaminhoPlaneta1.value_changed TO ROUTE CaminhoPlaneta2.value_changed TO ROUTE CaminhoPlaneta3.value_changed TO

CaminhoPlaneta1.set_fraction CaminhoPlaneta2.set_fraction CaminhoPlaneta3.set_fraction Planeta1.set_rotation Planeta2.set_rotation Planeta3.set_rotation

Exemplo 5.6: Uso de mltiplos relgios com mltiplos interpoladores.

66

6
Interagindo com os Objetos

6.1 Introduo
O processo descrito no captulo anterior a este fazia com que os objetos ou figuras do mundo virtual adquirissem a possibilidade movimentar-se por este mundo, tendo uma participao mais dinmica no mesmo. Por outro lado, esta animao era caracterizada por ser completamente independente do observador ou usurio, pois este no interagia com os objetos. possvel tornar o mundo virtual ainda mais dinmico. Para isto, o VRML propicia outros recursos de animao que so dependentes da ao do usurio. Em outras palavras, a animao acontece somente quando o usurio executa algum tipo pr-determinado de evento. Este eventos, monitorados pela linguagem, dizem respeito a ao de dispositivos de apontamento ou indicao, como mouse, touchpad, joystick, entre outros. Tipicamente, com estes dispositivos realizamos trs tipos de tarefas: movimento, seleo (click) e arrasto (drag). Assim, o VRML fica atento a estas aes e, para cada uma delas, determina a resposta desejada. O princpio bsico da animao determinado no captulo anterior ser mantido, ou seja, existir um interpolador que calcular fraes de posicionamento (translao, escala e rotao) que sero repassadas para o objeto em questo na forma de transformaes o que modificar sua apresentao. O principal detalhe a ser alterado neste novo processo de animao com a interao do usurio, ser que o interpolador ou o relgio, quanto estiver presente, de gerao de fraes para o interpolador, sero ativados somente quando o usurio executar a ao no objeto. Neste contexto, a linguagem VRML propicia dois de sensores para monitorar a ao do usurio. O primeiro tipo, composto pelo nodo TouchSensor, um sensor sensvel ao toque. A sua funo perceber que o usurio moveu-se, clicou sobre ou arrastou o objeto e avisar sobre isto. O seu aviso consiste de uma informao booleana verdadeira ou falsa caracterizando o tipo de ao e o tempo em que ela ocorreu. O segundo tipo de sensores formado por aqueles sensveis ao movimento, como os nodos CylinderSensor, PlaneSensor e SphereSensor. Eles so similares ao sensor de toque, mas tambm fornecem uma sada
67

projetada para o uso no controle de movimento e orientao de figuras. Utilizando-os ser possvel clicar sobre e movimentar figuras no mundo virtual. necessrio um comentrio sobre a conduta dos sensores de movimento. Quando o usurio clica e arrasta uma figura, o sensor produz na sua sada uma srie de valores que so tipicamente roteados para um nodo Transform, causando o movimento. Quando o usurio libera o objeto, a produo de valores cessa. Supondo que, logo a seguir, ele torna a clicar sobre o objeto e arrast-lo, qual ser o ponto de partida: o situao atual do objeto ou a sua situao original? As duas condutas so permitidas e existe um campo nestes nodos que as determina. Este campo chamado de autoOffset e, quando verdadeiro (TRUE), o sensor parte a animao da situao atual. Caso seja falso, a gerao dos valores partir da situao inicial do objeto. Finalmente, se um dos sensores for instanciado atravs do uso das palavras chaves DEF e USE, ele monitorar aes do usurio em qualquer figura que estiver no grupo pai de qualquer uma das instncias do sensor.

6.2 Nodo TouchSensor


O nodo TouchSensor define um sensor capaz de detectar aes do usurio sobre o objeto e produzir a sada correspondente a ao desejada. Sua sintaxe : TouchSensor{ enabled TRUE isActive isOver touchTime hitPoint_changed hitNormal_changed hitTexCoord_changed }

# SFBool # eventOut SFBool # eventOut SFBool # eventOut SFTime # eventOut SFVec3f # eventOut SFVec3f # eventOut SFVec2f

O valor do campo enabled define se o sensor est ativado ou no. Se o valor TRUE, o sensor est ativado e gera valores nas sadas. O valor deste campo pode ser alterado atravs de um campo eventIn chamado de set_enabled e a resposta da alterao apresentada no campo eventOut enabled_changed. Quando o usurio move o cursor sobre uma figura que est sendo monitorada pelo nodo TouchSensor, o sensor envia um sinal TRUE atravs do campo eventOut isOver. Quando o cursor sai da figura monitorada, o sensor envia um sinal FALSE por este mesmo campo. Sempre que o cursor estiver sobre a figura, o ponto no qual ele est posicionado fornecido atravs do campo hitPoint_changed. Neste mesmo ponto de contato, o sensor fornece os valores do vetor normal e das coordenadas da textura que foi mapeada, se houver, atravs dos campos hitNormal_changed e hit_TexCoord_changed, respectivamente.
68

Se o usurio clicar o cursor sobre a figura, o sensor produz uma sada atravs do campo isActive. Quando o boto de seleo for liberado, este campo produz um sinal de FALSE. Os campos de posicionamento na objeto, normal e textura mencionados acima, continuam produzindo os mesmos resultados, mas referentes os ponto da seleo.

6.3 Nodo PlaneSensor


O nodo PlaneSensor cria um sensor para detectar as aes do usurios e convertlas em uma sada adequada para operaes de manipulao (transformao) das figuras se elas movem-se a longo de um plano 2D. Sua sintaxe : PlaneSensor{ enabled autoOffset offset maxPosition minPosition isActive translation_changed trackPoint_changed }

TRUE TRUE 0.0 0.0 0.0 -1.0 1.0 0.0 0.0

# SFBool # SFBool # SFVec3f # SFVec2f # SFVec2f # eventOut SFBool # eventOut SFVec3f # eventOut SFVec3f

O campo enabled deste nodo tem funo idntica aquela descrita para o nodo TouchSensor, inclusive com os mesmos atributos e formas de acesso. O mesmo indicativo vale para o campo isActive, que tambm idntico ao j descrito. Quando o usurio move o cursor sobre o objeto monitorado pelo PlaneSensor existe um ponto de contato localizado em um plano imaginrio sobre o qual a figura ter condies de ser animada. Este plano chamado de track plane e orienta o seu eixo +X para o lado direito da tela de observao e o eixo +Y para o lado de cima da tela. A origem deste plano e, consequentemente, do sistema de coordenadas que ele estabelece esto localizados sobre o objeto. Cada vez que o observador move o objeto com o boto do cursor pressionado ocorre uma mudana da localizao do ponto de contato em relao ao plano imaginrio. Nesta situao, o novo ponto de contato fornecido atravs do campo eventOut trackPoint_changed. Os campos autoOffset, offset, maxPosition e minPosition trabalham de forma conjunta para converter o ponto de contato, originalmente no sistema de coordenadas do plano imaginrio, para valores de translao (vetores 3D) que sero fornecidos atravs do campo translation_changed. O valor do campo autoOffset (TRUE/FALSE) especifica se o deslocamento dever ter ou no um offset, ou seja, se ele tomar como referncia a posio original do objeto no mundo virtual ou a posio atual do mesmo. Se o seu valor for TRUE, os valores das translaes so armazenados no campo offset que ser adicionado ao resultado a ser produzido. Se o valor FALSE, o contedo do campo offset ignorado.
69

Os valores do campos maxPosition e minPosition especificam os limites mximos e mnimos aceitos para as translaes nos eixos X e Y do plano imaginrio. O campo minPosition fornece os valores mnimos para os eixos X e Y, enquanto que maxPosition fornece os valores mximos. As condies para uso destes valores so: se o valor mnimo para o eixo for menor que o valor mximo, a translao, em relao ao eixo em questo, estar limitada entre o mnimo e o mximo; se os valores para mnimo e mximo forem iguais, a translao estar limitada a este valor; se o valor mnimo for maior do que o mximo, para um dado eixo, ento a translao no sofre qualquer restrio naquele eixo. Os valores dos campos citados acima podem ser alterados atravs dos campos eventIn set_autoOffset, set_offset, set_minPosition e set_maxPosition. Quando os valores dos campos forem alterados, o novo valor produzido num dos campos a seguir, respectivos aquele onde ocorreu a alterao: autoOffset_changed, offset_changed, minPosition_changed e maxPosition_changed.

6.4 Nodo SphereSensor


O nodo VRML SphereSensor cria um sensor capaz de detectar as aes do usurio e, a partir destas, produzir sadas em formato adequado a manipulao de figuras tal como se elas estivessem girando em torno de uma esfera. Sua sintaxe : SphereSensor { enabled TRUE autoOffset TRUE offset 0.0 1.0 0.0 0.0 isActive rotation_changed trackPoint_changed }

# SFBool # SFBool # SFRotation # eventOut SFBool # eventOut SFRotation # eventOut SFVec3f

Os campos enabled e isActive tem a mesma funo e sintaxe que foi apresentada com o nodo TouchSensor e PlaneSensor. O valor do campo autoOffset especifica se a rotao calculado dever ter um valor de rotao base. Caso ele seja TRUE, o valor calculado ser adicionado ao valor do campo offset antes de ser fornecido atravs do campo rotation_changed. Quando o autoOffset FALSE, o valor do campo offset no utilizado, e a sada produzida a partir da situao original da figura. Quando o usurio libera o boto do cursos e o campo autoOffset TRUE, o ltimo valor de rotao calculado armazenado no campo offset para ser utilizado na prxima operao.

70

Os valores dos campos autoOffset e offset podem ser alterados pelos campos eventIn set_autoOffset e set_offset, produzindo um aviso correspondente a mudana atravs dos campos eventOut autoOffset_changed e offset_changed. Finalmente, o campo trackPoint_changed trabalha conforme j descrito na seo que trata o nodo PlaneSensor. Assim como os demais sensores, o nodo SphereSensor pode ser utilizado como filho de qualquer grupo e monitora as aes em todas as figuras pertencentes a este grupo, inclusive aqueles que se localizam em grupos mais internos quele onde ele est. Sua sada , normalmente, roteada para um nodo do tipo Transform de forma a que seja aplicada uma rotao na figura desejada.

6.5 Nodo CylinderSensor


O nodo CylinderSensor criar um sensor que atua de forma muito semelhante ao sensor SphereSensor. A principal diferena entre os dois que rotao produzida na sada ser calculada conforme se a figura estivesse girando em torno de um cilindro, ou seja, em torno de um nico eixo que, neste caso, o eixo Y do sistema de coordenadas do grupo pai do sensor. Sua sintaxe : CylinderSensor{ enabled TRUE diskAngle 0.262 autoOffset TRUE offset 0.0 maxAngle -1.0 minAngle 0.0 isActive rotation_changed trackPoint_changed }

# SFBool # SFFloat # SFBool # SFFloat # SFFloat # SFFloat # eventOut SFBool # eventOut SFRotation # eventOut SFVec3f

Os campos enabled, isActive, rotation_changed e trackPoint so idntico aqueles utilizados nos sensores das sees anteriores. O mesmo acontece com os campos autoOffset e offset, exceto pelo fato que o offset, neste caso, composto de um nico valor que representar o ngulo de rotao aplicado na figura na sua ltima ao. De qualquer forma, a sua aplicao, juntamente com o autoOffset mantida. Os campos maxAngle e minAngle trabalham no sentido de terminar limites mximo e mnimo para a rotao a ser aplicada s figuras monitoradas. Caso o valor mnimo seja menor do que o valor mximo, a rotao estar limitada entre estes valores de ngulo. Quando o valor mnimo for maior do que o mximo, no haver limite para a rotao. Se ambos forem iguais, a rotao da figura ficar limitada a este valor e ela no ir girar.
71

O nodo CylinderSensor converte os movimentos do cursos sobre a figura monitorada em rotaes em torno do eixo Y do sistema de coordenadas do sensor (definido pelo seu grupo pai), conforme foi dito. Neste movimento so necessrios dois tipos de conduta do sensor que dependem da posio do observador sobre a cena. A seleo entre os dois possveis tipos feita de acordo com o ngulo existente entre o eixo Y mencionado e uma reta imaginria que parte do cursor e vai ao objeto (linha de observao) que ser comparado com o valor do campo diskAngle. Quando o ngulo entre a linha e o eixo menor do que o diskAngle, o observador deve estar acima ou abaixo da figura e o sensor converte o movimento circular do cursor em uma rotao de sada. Por outro lado, quando o ngulo entre o eixo e a linha imaginaria maior do que o diskAngle, o observador deve estar orientado na frente ou atras da figura, olhando-a perpendicularmente ao eixo. Nesta situao, o sensor deve converte o movimento do cursor de uma lado para outro em uma rotao de sada. Em ambos os casos, o valor de rotao produzido fornecido atravs do campo rotation_changed. Assim, o valor do campo diskAngle que determina ao navegador VRML a partir de que ponto ele deve determinar que o observador se encontra olhando a figura de forma inclinada ou quase perpendicular a ela. Isto faz com que o tipo de movimento do cursos que ele precisa perceber mude. Alm dos campos mencionados, o nodo CylinderSensor possui os campos eventIn set_autoOffset, set_offset, set_minAngle e set_maxAngle que fazem com que os valores dos campos autoOffset, offset, minAngle e maxAngle, respectivamente, sejam alterados. A resposta desta alterao vem atravs de um conjunto de campos eventOut que so autoOffset_changed, offset_changed, minAngle_changed e maxAngle_changed. As aplicaes e possibilidades de utilizao do nodo CylinderSensor seguem as mesmas regras e condies mencionadas para o sensor SphereSensor na seo anterior.

6.6 Exemplos
Vamos discutir agora alguns exemplos de aplicao dos sensores mencionados neste captulo. O exemplo 6.1 apresentar uma caixa que comea a girar em torno do seu eixo Y cada vez que o cursor for movimentado para sobre ela. Neste exemplo, o sensor TouchSensor percebe o movimento do cursor e notifica-o atravs do seus campo isOver, com o sinal TRUE. Este campo (e o valor), por sua vez, roteado para um relgio (TimeSensor) que inicia o seu funcionamento que ativar um interpolador encarregado de calcular as posies das rotaes que sero aplicadas na caixa. Quando o cursor deixa a caixa, enviado ao relgio um sinal FALSE, fazendo com que o movimento pare. Neste exemplo, o sensor atua somente como uma espcie de liga-desliga do movimento da caixa.

72

#VRML V2.0 utf8 Group { children [ DEF Cubo Transform { children Shape { appearance Appearance { material Material {} } geometry Box {} }

}, DEF DEF Sensor TouchSensor {}, Relogio TimeSensor { enabled FALSE cycleInterval 4.0 loop TRUE

}, DEF CaminhoCubo OrientationInterpolator { key [ 0.0, 0.5, 1.0 ] keyValue [ 0.0 1.0 0.0 0.0, 0.0 1.0 0.0 3.14, 0.0 1.0 0.0 6.28 ]

} ] } ROUTE Sensor.isOver ROUTE Relogio.fraction_changed ROUTE CaminhoCubo.value_changed TO Relogio.set_enabled TO CaminhoCubo.set_fraction TO Cubo.set_rotation

Exemplo 6.1: Fazendo uma caixa girar sempre que o cursor estiver sobre ela.

J o exemplo 6.2 executa uma tarefa semelhante, fazendo a mesma caixa girar. Por outro lado, ela far isto somente quando o usurio clicar o cursor sobre a mesma. Neste momento, o relgio ser ativado pelo prazo de 4 segundo e a caixa, aps isto, ir parar a espera de outro clique. Para fazer isto, lana-se mo do campo touchTime do sensor que utilizado para inicializar o campo startTime do relgio.

73

#VRML V2.0 utf8 Group { children [ DEF Cubo Transform { children Shape { appearance Appearance { material Material {} } geometry Box {} }

}, DEF DEF }, DEF CaminhoCubo OrientationInterpolator { key [0.0, 0.5, 1.0 ] keyValue [ 0.0 1.0 0.0 0.0, 0.0 1.0 0.0 3.14, 0.0 1.0 0.0 6.28 ] Sensor TouchSensor {},

Relogio TimeSensor { cycleInterval 4.0

} ] } ROUTE Sensor.touchTime ROUTE Relogio.fraction_changed ROUTE CaminhoCubo.value_changed TO Relogio.set_startTime TO CaminhoCubo.set_fraction TO Cubo.set_rotation

Exemplo 6.2: Fazendo a caixa girar quando houver um clique do cursor.

No exemplo 6.3 a caixa transladada atravs de um sensor PlaneSensor. Quando ela for clicada e arrastada, ir se movimentar atravs de um plano alinhado com a tela de observao. Note que no possvel desloc-la para frente ou para trs, apenas para os lado e para cima/baixo, exatamente onde est o plano mencionado. O exemplo 6.4 anlogo, mas estabelece valore mximo e mnimo para o deslocamento neste plano atravs dos campos minPosition e maxPosition do sensor, limitando a translao da caixa.

74

#VRML V2.0 utf8 Group { children [ DEF Cubo Transform { children Shape { appearance Appearance { material Material {} } geometry Box {} }

}, DEF ] } ROUTE Sensor.translation_changed TO Cubo.set_translation Sensor PlaneSensor {}

Exemplo 6.3: Movimentando uma caixa com o PlaneSensor.


#VRML V2.0 utf8 Group { children [ DEF Cubo Transform { children Shape { appearance Appearance { material Material {} } geometry Box {} } }, DEF Sensor PlaneSensor { minPosition -2.0 -2.0 maxPosition 2.0 2.0

} ] } ROUTE Sensor.translation_changed TO Cubo.set_translation

Exemplo 6.4: Limitando os movimentos da caixa do exemplo 6.3. O exemplo 6.5 faz uso de mltiplos sensores PlaneSensor para fazer com que quatro caixas movimentem-se independentemente. Neste exemplo, o campo offset de cada sensor utilizado para marcar o valor inicial de localizao de cada caixa de forma a fazlas se movimentarem a primeira vez tendo como base a posio do desenho.

75

#VRML V2.0 utf8 Group { children [ Group { children [ DEF Bloco1 Transform { children Shape { appearance Appearance { material Material { diffuseColor 1.0 0.0 0.0 } } geometry Box {} } SensorBloco1 PlaneSensor { offset 0.0 0.0 0.0

}, DEF } ] }, Group { children [ DEF

Bloco2 Transform { translation 2.5 0.0 0.0 children Shape { appearance Appearance { material Material { diffuseColor 0.0 1.0 0.0 } } geometry Box {} } SensorBloco2 PlaneSensor { offset 2.5 0.0 0.0

}, DEF } ] }, Group { children [ DEF

Bloco3 Transform { translation 1.5 2.0 0.0 children Shape { appearance Appearance { material Material { diffuseColor 0.0 0.0 1.0 76

} } geometry Box {} } }, DEF } ] }, Group { children [ DEF Bloco4 Transform { translation 0.75 4.0 0.0 children Shape { appearance Appearance { material Material { diffuseColor 1.0 0.0 1.0 } } geometry Box {} } SensorBloco4 PlaneSensor { offset 0.75 4.0 0.0 SensorBloco3 PlaneSensor { offset 1.5 2.0 0.0

}, DEF } ] } ] } ROUTE ROUTE ROUTE ROUTE

SensorBloco1.translation_changed SensorBloco2.translation_changed SensorBloco3.translation_changed SensorBloco4.translation_changed

TO TO TO TO

Bloco1.set_translation Bloco2.set_translation Bloco3.set_translation Bloco4.set_translation

Exemplo 6.5: Movimentado vrias caixas com sensores diferentes.

Os exemplo 6.6 e 6.7 fazem com uma caixa e um cone girem atravs de sensores do tipo esfera (SphereSensor) e cilindro (CylinderSensor). O exemplo 6.6 aplica nestas figuras um sensor SphereSensor que faz com que elas girem livremente em torno de uma esfera imaginria que as contm. J no outro exemplo, com um CylinderSensor, este movimento limitado fazendo com que as figuras girem em torno de um eixo localizado paralelamente ao eixo Y da tela.

77

#VRML V2.0 utf8 Group { children [ Group { children [ DEF

Figura1 Transform { children Shape { appearance DEF Branco Appearance { material Material {} } geometry Box {} } SensorFigura1 SphereSensor {}

}, DEF ] }, Group { children [ DEF

Figura2 Transform { translation 2.5 0.0 0.0 children Shape { appearance USE Branco geometry Cone {} } SensorFigura2 SphereSensor {}

}, DEF ] } ] }

ROUTE SensorFigura1.rotation_changed TO ROUTE SensorFigura2.rotation_changed TO

Figura1.set_rotation Figura2.set_rotation

Figura 6.6: Animando com um sensor do tipo esfera.

O exemplo 6.8 aplica em uma caixa dois sensores, de tipo diferentes. O primeiro deles um sensor de toque (TouchSensor) que detecta o posicionamento do cursor sobre a caixa, fazendo-a girar como no exemplo 6.1. O segundo sensor que atua sobre a caixa um PlaneSensor que permite que ela seja levada para os lado e para cima/baixo, mesmo enquanto estiver girando.

78

#VRML V2.0 utf8 Group { children [ Group { children [ DEF

Figura1 Transform { children Shape { appearance DEF Branco Appearance { material Material {} } geometry Box {} } SensorFigura1 CylinderSensor {}

}, DEF ] }, Group { children [ DEF

Figura2 Transform { translation 2.5 0.0 0.0 children Shape { appearance USE Branco geometry Cone {} } SensorFigura2 CylinderSensor {}

}, DEF ] } ] }

ROUTE SensorFigura1.rotation_changed TO ROUTE SensorFigura2.rotation_changed TO

Figura1.set_rotation Figura2.set_rotation

Figura 6.7: Animando os objetos do exemplo 6.6 com um sensor cilndrico.

79

#VRML V2.0 utf8 Group { children [ DEF Cubo Transform { children Shape { appearance Appearance { material Material {} } geometry Box {} }

}, DEF DEF DEF Arrasto PlaneSensor Toque TouchSensor {}, Relogio TimeSensor { enabled FALSE cycleInterval 4.0 loop TRUE {},

}, DEF CaminhoCubo OrientationInterpolator { key [ 0.0, 0.50, 1.00 ] keyValue [ 0.0 1.0 0.0 0.0, 0.0 1.0 0.0 3.14, 0.0 1.0 0.0 6.28 ]

} ] } ROUTE ROUTE ROUTE ROUTE Toque.isOver Relogio.fraction_changed CaminhoCubo.value_changed Arrasto.translation_changed TO TO TO TO Relogio.set_enabled CaminhoCubo.set_fraction Cubo.set_rotation Cubo.set_translation

Figura 6.8: Controlando um mesmo objeto com vrios sensores.

Finalmente, o exemplo 6.9 apresenta uma luminria composta de elementos articulados e com movimentao plena. Observe que cada um dos elementos desta cena possui o seu prprio sensor e sua prpria resposta de movimentao. Estes sensores so esfricos com exceo da base da luminria que se movimenta em um plano.

80

#VRML V2.0 utf8 Group { children [ DEF MoveLampada PlaneSensor {}, DEF Lampada Transform { children [ # Base da lampada Shape { appearance DEF CorLampada Appearance { material Material {} } geometry Cylinder { radius 0.1 height 0.01 } }, # Braco Group { children [ DEF MoveBraco1 SphereSensor { offset 1.0 0.0 0.0 -0.7 }, DEF Braco1 Transform { translation 0.0 0.15 0.0 rotation 1.0 0.0 0.0 -0.7 center 0.0 -0.15 0.0 children [ DEF BracoLampada Shape { appearance USE CorLampada geometry Cylinder { radius 0.01 height 0.3 } }, # Uniao dos dois bracos Group { children [ DEF MoveBraco2 SphereSensor { offset 1.0 0.0 0.0 1.9 }, DEF Braco2 Transform { translation 0.0 0.3 0.0 rotation 1.0 0.0 0.0 1.9 center 0.0 -0.15 0.0 children [ # Segundo braco USE BracoLampada # Juncao com quebra-luz Group { children [ DEF MoveQuebraLuz SphereSensor { offset 1.0 0.0 0.0 -1.25 }, DEF QuebraLuz Transform { translation 0.0 0.075 0.0 rotation 1.0 0.0 0.0 -1.25 81

center 0.0 0.075 0.0 children [ # Quebra-luz Shape { appearance USE CorLampada geometry Cone{ height 0.15 bottomRadius 0.12 bottom FALSE } }, # Lampada Transform { translation 0.0 -0.05 0.0 children Shape { appearance USE CorLampada geometry Sphere { radius 0.05 } } } ] } ] } ] } ] } ] } ] } ] } ] } ROUTE ROUTE ROUTE ROUTE MoveLampada.translation_changed MoveBraco1.rotation_changed MoveBraco2.rotation_changed MoveQuebraLuz.rotation_changed TO TO TO TO Lampada.set_translation Braco1.set_rotation Braco2.set_rotation QuebraLuz.set_rotation

Figura 6.9: Descrio de uma luminria com movimentao ampla.

82

7
Controlando a Aparncia das Figuras

7.1 Introduo
possvel, em VRML, controlar a aparncia de qualquer figura especificando atributos que definem o material com o qual ela feita. Conforme vimos, uma figura definida pela sua aparncia e sua geometria. A aparncia da figura utiliza-se dos nodos Appearance e Material. Com eles poderemos fazer estas definies que caracterizaro as figuras apresentadas no mundo virtual. Alm destes, existe ainda o nodo Texture que ser apresentado mais tarde. Em algumas situaes a definio de caractersticas fsicas aos objetos no o suficiente e elas necessitam ser variadas em um intervalo de tempo. Para estes casos a soluo dada por interpoladores semelhantes aqueles utilizados no controle da animao dos objetos. A linguagem VRML dispem de dois interpoladores que atuam em consonncia com o controle da aparncia dos objetos que so o ColorInterpolator e ScalarInterpolator. O primeiro deles produz valores de cores, segundo o modelo RGB, como resultado, enquanto que o ltimo o faz atravs de valores escalares.

7.2 Nodo Material


O nodo Material o responsvel, como valor do campo material do nodo Appearance, por definir as propriedades que caracterizaro fisicamente o objeto a ele agregado. Sua sintaxe : Material { diffuseColor emissiveColor transparency ambientIntensity specularColor shininess }

0.8 0.8 0.8 0.0 0.0 0.0 0.0 0.2 0.0 0.0 0.0 0.2
83

# SFColor # SFColor # SFFloat # SFFloat # SFColor # SFFloat

Conforme j foi mencionado, o campo diffuseColor especifica a cor que ser atribuida ao objeto em questo. Os valores expressos neste campo esto de acordo com o modelo de representao de cores RGB que define um valor entre 0 (zero) e 1 (um) para cada um das componentes de cores vermelho, verde e azul. No anexo I deste texto encontra-se uma tabela com algumas cores neste modelo e os seus respectivos valores. possvel em VRML fazer com que um objeto simule a existncia de uma fonte de luz fazendo-o brilhar como esta, ou seja, simulando a emisso de luz em uma determinada cor. A existncia desta emisso de luz e a sua cor so os atributos do campo emissiveColor. Em seu valor default, no h emisso de luz. Os valores colocados a ele tambm so cores segundo o modelo RGB. Note, entretanto, que no ocorre a produo de luz, nem a iluminao de objetos nas vizinhanas. Apenas possvel fazer com que um dado objeto simule esta caracterstica. O campo transparency especifica o fator de transparncia do objetos agregado ao nodo Material. O valor de transparncia 0.0 (zero), que o valor default, define um objeto completamente opaco, enquanto que um valor 1.0 (um) para a transparncia ir apresentar um objeto completamente transparente. Os demais graus de transparncia so valores encontrados entre estes dois extremos. Por exemplo, para definirmos um objeto 50% transparente, o valor do campo transparency ser 0.5, e assim por diante. O valor do campo ambientIntensity controla a maneira pela qual o material afetado pelo nvel de luz ambiente existente no mundo virtual. Valores altos fazem com que o material seja altamente afetado por esta luz, enquanto que valores baixos fazem o contrrio. De qualquer forma, estes valores devem estar no intervalo 0 (zero) 1 (um). A luz ambiente uma forma de modelarmos as quantidades de luz que chegam aos objetos de forma indireta, fazendo com que estes, mesmo que no sendo iluminados por nenhuma funte de luz, sejam vistos. O campo specularColor define com o material que est sendo definido se comporte em relao a reflexo especular da luz. Ela controla a polidez dos objetos, caractersticas acentudas em superfcies que se comportam como espelhos. De forma mais geral, esta reflexo tende a agregar fortemente a cor da luz que a iluminou. Por outro lado, quando a superfcie silmular um metal, a tendncia a cor do material (diffuseColor) ganhar importncia e contribuir mais fortemente para o resultado final. A cor default para este campo o preto (0.0 0.0 0.0) que caracteriza um material sem polidez. O contrrio acontece com um valor de cor branco (1.0 1.0 1.0). Finalmente, o campo shininess controla o brilho do material. O valor 0.0 (zero) para este campo define um objeto spero e sem brilho enquanto que valores mais altos tornam o objeto mais brilhante. No h limite superior para este campo e o valor defaul caracteriza um superfcie moderadamente brilhante. Note que este campo necessita trabalhar em conjunto com o campo specularColor e no podem anular-se mutuamente. Os valores dos campos mencionados acima podem ser alterados atravs dos campos eventIn set_diffuseColor, set_emissiveColor, set_transparency, set_ambientIntensity,
84

set_specularColor e set_shininess. Quando os valores so alterados, produzida um sada atravs dos respectivos campos eventOut: diffuseColor_changed, emissiveColor_changed, transparency_changed, ambientIntensity_changed, specularColor_changed e shininess_changed. Maiores informao sobre conceitos e uso dos elementos dos campos do nodo Material para tratar a aparncia de figuras podem ser encontradas em [Car98] ou em vrios livros de computao grfica.

7.3 Nodo ColorInterpolator


O nodo ColorInterpolator produz um srie de valores de cores a serem utilizados na animao da aparncia das figuras. Sua sintaxe : ColorIntepolator { key [ ] keyValue [ ] set_fraction value_changed }

# MFFloat # MFColor # eventIn SFFloat # eventOut SFColor

A forma de proceder deste interpolador anloca aos intepoladores PositionInterpolator e OrientationIntepolator j discutidos no captulo 5, ou seja, so acionados atravs de um relgio que produz uma frao de tempo e respondem com um valor em uma dada especificao. Neste caso, a resposta constituida de uma cor no modelo RGB.

85

Anexo I Tabela de Cores do Modelo RGB

Nome da Cor
Aquamarine Black Blue Blue violet Brown Cadet blue Coral Cornflower blue Cyan Dark green Dark olive green Dark orchid Dark slate blue Dark slate gray Dark turquoise Dim gray Firebrick Forest green Gold Goldenrod Gray Green Green yellow Indian red Khaki Light blue Light gray Light steel blue Lime green Magenta Maroon Medium aquamarine Medium blue 86

Red
0.439216 0.000000 0.000000 0.623529 0.647059 0.372549 1.000000 0.258824 0.000000 0.184314 0.309804 0.600000 0.419608 0.184314 0.439216 0.329412 0.556863 0.137255 0.800000 0.858824 0.752941 0.000000 0.576471 0.309804 0.623529 0.749020 0.658824 0.560784 0.196078 1.000000 0.556863 0.196078 0.196078

Green
0.858824 0.000000 0.000000 0.372549 0.164706 0.623529 0.498039 0.258824 1.000000 0.309804 0.309804 0.196078 0.137255 0.309804 0.576471 0.329412 0.137255 0.556863 0.498039 0.858824 0.752941 1.000000 0.858824 0.184314 0.623529 0.847059 0.658824 0.560784 0.800000 0.000000 0.137255 0.800000 0.196078

Blue
0.576471 0.000000 1.000000 0.623529 0.164706 0.623529 0.000000 0.435294 1.000000 0.184314 0.184314 0.800000 0.556863 0.309804 0.858824 0.329412 0.137255 0.137255 0.196078 0.439216 0.752941 0.000000 0.439216 0.184314 0.372549 0.847059 0.658824 0.737255 0.196078 1.000000 0.419608 0.600000 0.800000

Medium forest green Medium goldenrod Medium orchid Medium sea green Medium slate blue Medium spring green Medium turquoise Medium violet red Midnight blue Navy Orange Orange red Orchid Pale green Pink Plum Red Salmon Sea green Sienna Sky blue Slate blue Spring blue Steel blue Tan Thistle Turquoise Violet Violet red Wheat White Yellow Yellow green

0.419608 0.917647 0.576471 0.258824 0.498039 0.498039 0.439216 0.858824 0.184314 0.137255 0.800000 1.000000 0.858824 0.560784 0.737255 0.917647 1.000000 0.435294 0.137255 0.556863 0.196078 0.000000 0.000000 0.137255 0.858824 0.847059 0.678431 0.309804 0.800000 0.847059 0.988235 1.000000 0.600000

0.556863 0.917647 0.439216 0.435294 0.000000 1.000000 0.858824 0.439216 0.184314 0.137255 0.196078 0.000000 0.439216 0.737255 0.560784 0.678431 0.000000 0.258824 0.556863 0.419608 0.600000 0.498039 1.000000 0.419608 0.576471 0.749020 0.917647 0.184314 0.196078 0.847059 0.988235 1.000000 0.800000

0.137255 0.678431 0.858824 0.258824 1.000000 0.000000 0.858824 0.576471 0.309804 0.556863 0.196078 0.498039 0.858824 0.560784 0.560784 0.917647 0.000000 0.258824 0.419608 0.137255 0.800000 1.000000 0.498039 0.556863 0.439216 0.847059 0.917647 0.309804 0.600000 0.749020 0.988235 0.000000 0.196078

87

Bibliografia

[ANM96] Andrea Ames, David Nadeau and John Moreland. VRML 2.0 Sourcebook, 2nd edition. John Wiley & Sons, 1996. [Car98] Marcos Carrard. Cor e Iluminao. Ed. Uniju, 1998. Disponvel em http://labinf.detec.unijui.tche.br/~carrard/artigos/cadernos/caderno05.html (em novembro/2000). [Ipo96] Juliano Iplito. Tutorial VRML 1.0. Disponvel em http://www.dc.ufscar.br/ ~grv/vrml/tutoriais/vrml10/index.html (em agosto/2000).

[Ipo97] Juliano Iplito. Realidade Virtual. Disponvel em http://www.dc.ufscar.br/ ~juliano/rv/introducao.html (em agosto/2000). [Jac94] Linda Jacobson. Realidade Virtual em Casa. Berkeley, 1994. [Kir97] Cludio Kirner. Sistemas de Realidade Virtual. Disponvel http://www.dc.ufscar.br/~grv/tutrv/tutrv.htm (em agosto/2000). em

[RCR97] Bernie Roehl, Justin Couch, Cindy Reed-Ballreich, Tim Rohaly and Geoff Brown. Late Night VRML 2.0 with Java. Ziff-Davis Press, 1997.

88