tutorial vrml

88
UNIJUÍ Universidade Regional do Noroeste do Estado do Rio Grande do Sul DeTec Departamento de Tecnologia Bacharelado em Informática Tutorial V R M L 2.0 Marcos Carrard Ijuí (RS), 2000/2001

Upload: everson-alyson-crvg

Post on 10-Aug-2015

70 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Tutorial Vrml

UNIJUÍ Universidade Regional do Noroeste do Estado do Rio Grande do SulDeTec Departamento de TecnologiaBacharelado em Informática

Tutorial

V R M L 2.0

Marcos Carrard

Ijuí (RS), 2000/2001

Page 2: Tutorial Vrml

2

Apresentação

Este texto apresenta um apostila ou tutorial para o uso da linguagem VRML –Virtual Reality Modeling Language. Conforme será visto, está é uma linguagem de usomuito frequente e amplo quando da descrição de mundos e ambientes para realidade virtualatravés de uma rede de computadores de velocidade relativamente baixa, como a internet.

Não é o objetivo deste material se caracterizar como tendo um conteúdo novo einédito. Pelo contrário, como o próprio nome diz, ele é uma apostila ou tutorial e, portanto,o seu conteúdo foi retirado de algumas publicações e páginas na internet, especialmente olivro do autor Andrea Ames, David Nadeau e John Moreland ([ANM96]). Esta é umapublicação bastante completa e recomendada a todos que desejam conhecer profundamenteo VRML. Esta apostila traz o seu conteúdo e uma boa parte dos seus exemplos nasequência, forma e conteúdo apresentados por este livro.

Qualquer dúvida, correção, sugestão ou acréscimo de conteúdo para este material émuito bem vinda e pode ser enviada através do endereç[email protected] atravésda páginahttp://labinf.detec.unijui.tche.br/~carrard.

Page 3: Tutorial Vrml

3

Sumário

ApresentaçãoSumário1 Aspectos Iniciais

1.1 Introdução1.2 Sistema de Coordenadas1.3 Arquivo VRML1.4 Descrevendo Figuras1.5 Eventos e Rotas

2 Construção das Figuras2.1 Nodo Shape2.2 Nodo Appearance2.3 Nodo Material2.4 Primitivos Geométricos2.5 Agrupando Figuras

3 Inserindo Texto3.1 Introdução3.2 Nodo Text3.3 Nodo FontStyle

4 Transformando Figuras4.1 Introdução4.2 Nodo Transform4.3 Translação

4.3.1 Vetores em 3D4.3.2 Transformação de translação

4.4 Rotação4.5 Escala

5 Animando o Posicionamento, Orientação e Escala das Figuras5.1 Introdução5.2 Processo de Animação5.3 Nodo TimeSensor5.4 Nodo PositionInterpolator5.5 Nodo OrientationInterpolator

Page 4: Tutorial Vrml

4

5.6 Exemplos6 Interagindo com os Objetos

6.1 Introdução6.2 Nodo TouchSensor6.3 Nodo PlaneSensor6.4 Nodo SphereSensor6.5 Nodo CylinderSensor6.6 Exemplos

7 Controlando a Aparência das Figuras7.1 Introdução7.2

8 Agrupando Nodos8.1 Introdução8.2

9 Incluindo Arquivos9.1 Introdução9.2

10 Construindo com Pontos, Linhas e Faces10.1 Introdução10.2

11 Grids de Elevação11.1 Introdução11.2

12 Figuras de Extrusão12.1 Introdução12.2

13 Construção de Cores13.1 Introdução13.2

14 Mapeamento de Textura14.1 Introdução14.2

15 Luz e Sombra15.1 Introdução15.2

16 Adicionando Fundo e Fumaça16.1 Introdução16.2

17 Adicionando Som17.1 Introdução17.2

18 Controle de Detalhes18.1 Introdução18.2

19 Definindo Pontos de Vista19.1 Introdução19.2

Page 5: Tutorial Vrml

5

20 Adicionando Âncoras e Informações ao Mundo Virtual20.1 Introdução20.2

21 Criando Scripts21.1 Introdução21.2

22 Criando Novos Tipos de Dados22.1 Introdução22.2

Anexo I – Tabela de Cores do Modelo RGBBibliografia

Page 6: Tutorial Vrml

6

1Aspectos Iniciais

1.1 Introdução

VRML é a abreviação para Virtual Reality Modeling Language ou Linguagem paraModelagem em Realidade Virtual. Seu objetivo é a descrição de objetos e mundostridimensionais interativos através da World Wide Web na internet. Esta linguagem éindente de plataforma e permite a criação de ambiente virtuais por onde se pode passear,visualizar objetos e interagir com eles.

VRML foi apresentada pela primeira vez em 1994 durante a conferência sobreWWW com o propósito de atingir os objetivos acima sem necessitar de uma rede de altavelocidades para dar suporte as atividades. Nesta ocasião ela foi apresentada como umsubconjunto de um formato de arquivos ASCII do software Open Inventor da SiliconGraphics.

Esta versão, conhecida como VRML 1.0, trabalha principalmente com a geometria3D dos objetos que são elaborados em polígonos e primitivos como cones, esferas,cilindros e esferas. Ela suporta ainda algumas transformações com estes objetos e permite oajuste da complexidade dos objetos dependendo da distância do observador do ambiente.

A versão atual da linguagem, denominada deMoving Worlds VRML 2.0agregatodas as definições existentes na versão anterior e amplia as possibilidades de representaçãoe interação neste mundo e com outros mundos virtuais. Nelas os objetos podem mover-se ereagir a eventos originários do usuário ou de alguma outra forma de controle. Além disto,esta versão permite o uso de objetos multimídia nos ambientes, assim é possível integrarsons e filmes nas cenas.

Conforme [Kir97] as características do VRML 2.0 podem ser agrupadas em quatroáreas principais: melhoria dos mundos estáticos, interação, animação e comportamentobaseado em scripts, além da prototipação de novos objetos.

A linguagem VRML não é reconhecido de forma padronizada pelos navegadores daHTML como o Netscape e o Internet Explorer. Desta forma, é necessário configurar onavegador para que ele compreenda o conteúdo do arquivo que está recebendo. Para isto é

Page 7: Tutorial Vrml

7

necessário um navegador VRML que deverá, tipicamente, ser adicionado ao navegadorHTML na forma de plug-in. Plug-in nada mais são do que programas que trabalham deforma associada ao navegador HTML para que este entenda arquivos de tiposdiferenciados. Sugere-se que antes de continuar na leitura deste tutorial, o leitor adquira umnavegador VRML (estão disponíveis na internet de forma gratuita) para poder avaliar osexemplos propostos. Todos eles forma escritos e testados utilizando o software CosmoPlayer 2.1 e o navegador HTML Nestcape 4.7.

1.2 Sistema de Coordenadas

A linguagem VRML utiliza o sistema de coordenadas cartesiano para arepresentação espacial, ou seja, um sistema baseado em 3 eixos de deslocamento vetorial.Veja a figura 1.1 para a descrição desta representação.

Figura 1.1 – Sistema de coordenadas cartesiano

Ainda sobre esta questão, existem duas convenções que são relevantes na definiçãodo mundo virtual e na sua possibilidade de conexão com outros mundos. A primeira delas éque é adotado a regra da mão direita para definição dos eixos do sistema e seu sentido decrescimento. Nesta regra, toma-se a mão direita e aponta-se os dedos polegar, indicador emédio de forma que fiquem com 90 graus entre si, aproximadamente (veja a figura 1.2).Nesta disposição, o dedo polegar representa o eixo X, o indicador o eixo Y e o dedo médio,o eixo Z, crescendo no sentido que os dedos apontam. Além disso, a definição original domundo virtual, utilizada em casos default, coloca o observador da cena no sentido do eixo+Z.

Figura 1.2 – Regra da mão direita.

Page 8: Tutorial Vrml

8

A segunda convenção adotada, não pela linguagem mas pelos seus usuários, é o usoda unidade de medidasmetrospara o sistema de coordenadas. A razão desta convenção épermitir facilmente a integração de mundos virtuais escritos por usuários diferentes semque ocorram problemas de proporção nas figuras.

1.3 Arquivo VRML

Os mundos virtuais são descritos através de um arquivo texto com extensão.wrlque pode ser criado com qualquer editor de programas fontes. É importante notar que nãopode ser utilizado um editor de textos comum, como o Word, e sim um editor de programasfontes, como o Notepad do Windows.

Nesta seção vamos discutir alguns aspectos básicos e introdutórios a respeito doconteúdo destes arquivos. Para tanto será utilizado o arquivo do exemplo 1.1.

#VRML V2.0 utf8

# Primeiro exemplo

Group{

children[

# Desenha o cilindro da baseShape{

appearance DEF Azul Appearance{material Material{

diffuseColor 0.0 0.0 1.0}

}geometry Cylinder{

height 2.0radius 2.0

}},

# Desenha o cone da coberturaTransform{

translation 0.0 2.0 0.0children Shape{

appearance USE Azulgeometry Cone{

height 2.0bottomRadius 2.5

}}

}

]}

Exemplo 1.1: Primeiro arquivo VRML

Page 9: Tutorial Vrml

9

a) Cabeçalho VRML

O cabeçalho está presente em todos os arquivos VRML e é obrigatório. Seu formatoé:

#VRML V2.0 utf8

onde: VRMLÿ indica que o arquivo que segue é a descrição de um ambiente virtual;V2.0ÿ identifica a versão ou especificação 2.0 da linguagem VRML;utf8 ÿ identifica um arquivo que utiliza o conjunto de caracteres UTF-8;

Para a descrição de um arquivo fonte utilizando a versão 1.0 da linguagem VRML,também há um cabeçalho, com o mesmo sentido na composição das suas partes, masdescrito diferentemente:

#VRML V1.0 ascii

b) Comentários

Após o cabeçalho do arquivo VRML, toda e qualquer sequência de caracteres queiniciar ou contiver o caracter #, é tratada como comentário e é ignorada pelo navegador. Porexemplo:

# Desenha o cilindro da base

c) Nodos

O arquivo VRML é formado por nodos (nodes) que descrevem as figuras contidasnele e as suas propriedade no mundo virtual. O nodo é a estrutura sintática básica decomposição deste tipo de arquivo e, tipicamente, contém:

- o tipo de nodo (obrigatório);- um par de chaves (obrigatório);- um conjunto de campos e seus atributos (opcional);

Exemplo:Cylinder {

height 2.0radius 2.0

}

Neste exemplo,Cylinder é o tipo do nodo eheighte radius dois campos com seusvalores que especificam a altura e diâmetro do cilindro a ser desenhado.

Page 10: Tutorial Vrml

10

d) Tipo de valores

Existe um conjunto pré-definido de tipos de dados ou valores que são aceitos comoatributo dos campos de um nodo. É importante ressaltar que a não presença de um destescampos no nodo implica no uso de um valor default, mas sempre dentro das especificaçõesda linguagem.

A tabela a seguir apresenta os tipos de dados possíveis na linguagem VRML. Nestatabela os tipos obedecem a um padronização de nomenclatura, iniciando-se sempre com SFou MF:

- SF: Single value types – indica um único valor para o tipo a ser utilizadono dado;

- MF: Multiple value types – indica o uso de múltiplos valores para o dadodeste tipo;

Tipo de Valor DescriçãoSFBool Descreve um valor booleano: verdadeiro (TRUE) ou

falso (FALSE)SFColorMFColor

Grupo de três valores reais descrevendo ascomponente vermelho (red), verde (green) e azul(blue) do modelo de cores RGB

SFFloatMFFloat

Descreve valores reais ou de ponto flutuante.

SFImage Uma lista de valores descrevendo as cores de umaimagem digital

SFInt32MFInt32

Valores inteiros de 32 bits

SFNodeMFNode

Identifica um dado do tiponode VRML(nodo)

SFRotationMFRotation

Descreve um grupo de quatro valores reais onde ostrês primeiros identificam um eixo o sistema derepresentação e o último um ângulo medido emradianos. Estes valores definem uma transformaçãogeométrica de rotação.

SFStringMFString

Descreve uma lista de caracteres, que devem estarobrigatoriamente entre aspas, caracterizando umastring.

SFTime Descreve um valor real para a medida absoluta detempo, em segundos, contados a partir da 00:00hs dodia 01/01/1970.

SFVec2fMFVec2f

Dois valores reais descrevendo um ponto ou vetorbidimensional no plano cartesiano.

SFVec3fMFVec3f

Três valores reais descrevendo um ponto ou vetortridimensional no espaço cartesiano.

Page 11: Tutorial Vrml

11

Os tipos de dados descritos acima irão aparecer na descrição formal dos campos dosnodos que a linguagem VRML comporta a serem vistos mais tarde. Por exemplo, adescrição formal do campoheightdo nodoCylinderé:

height 2.0 # SFFloat

Esta descrição indica que o campoheighttem um calor default de 2.0 e este dado édo tipo SFFloat, portanto, admitindo somente valores reais na sua descrição.

e) Nomes de nodos

Todos os nodos no ambiente virtual podem ser nominados. Os nomes podem sercompostas de qualquer sequência de letras, números e underscore. Os nomes compostosdiferenciam letras maiúsculas e minúsculas (case sensitives) e não podem iniciar com umnúmero.

A definição de um nome para um nodo VRML tem a função de identificá-lo paranovo uso posterior. Para fazer este uso, o nodo deve ser definido previamente com aseguinte definição:

DEF nome_do_nodo tipo_do_nodo {...}

Exemplo:DEF Meu_Cilindro Cylinder{

height 2.0radius 2.0

}

Após a definição do nodo ele pode ser utilizado sempre que se fizer necessário. Paraesta utilização, 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 construção do ambiente virtual é realizada com figuras (shapes)descritas pelosnodos e por seus atributos. Desta maneira, a figura VRML tem uma forma ou geometria(geometry) que define a sua estrutura tridimensional. Além disto, esta figura tem suaaparência baseada no material com o qual é feita (material) e na textura da sua superfície(texture). Assim,geometrye appearancesão os campos do nodoShape:

Page 12: Tutorial Vrml

12

Exemplo:

Shape {Appearance DEF Azul Appearance { # Campo da aparência

material Material { # da figuradiffuseColor 0.0 0.0 1.0

}}geometry Cylinder { # Definição da sua

height 2.0 # forma 3Dradius 2.0

}}

A linguagem VRML suporta vários tipos de primitivos geométricos para as figurasde forma pré-definida, como caixas, cilindros, cones e esferas. Além disto existem váriasfiguras geométricas avançadas como figuras de extrusão e grids de elevação.

Com base nestes tipos, a linguagem VRML permite que as figuras sejam agrupadase reagrupadas sempre que necessário para formar figuras mais complexas. O agrupamentodas figuras se dá através do nodoGroup. O nodo que agrupa outras figuras e nodos échamado de pai (parent) e as figuras que fazem parte de um grupo são chamadas de filhos(children). Neste contexto, nãohá limite para o número de filhos existentes em um grupo.

1.5 Eventos e Rotas

A linguagem VRML permite a criação de mundos dinâmicos. Para fazer isto, osarquivos VRML devem prever “instruções” para a construção do mundo. Estas instruçõesdescrevem como conectar nodos para atuação conjunta ou condicionada. Por exemplo, abriruma porta quando o mouse clica em um certo objeto ou acender uma lâmpada nas mesmascondições.

Estes eventos são mecanismos de troca de mensagens entre os objetos e envolvem:- um par de nodos para atuar conjuntamente;- uma rota de comunicação entre os dois nodos envolvidos;

Uma vez a rota tendo sido definida entre os dois nodos, o primeiro deles podeenviar mensagens ao segundo. Esta mensagens, chamada deevent(evento) contém valoresque forçarão o nodo receptor a reagir. Existe inclusive a possibilidade de agrupar váriosnodos criando um circuito de comunicação.

Cada tipo de nodo apresenta acionadores (jacks) de entrada e saída com os quais asmensagens atuam. Por exemplo, o nodo que cria uma luz (lâmpada) tem um acionador deentrada que pode ligá-la ou desligá-la (on/off). Acionando-o, através do envio de umamensagem, é possível ligar e desligar esta luz a distância.

Page 13: Tutorial Vrml

13

É importante salientar que nodos podem ter vários acionadores para interação entrenodos do circuito. Por outro lado, estes acionadores são de entrada (input) e saída (output).Os acionadores de entrada são chamados deeventIn e ou acionadores de saída sãochamados deeventOut. Também é importante notar que estes acionadores tem um tipo dedado definido para receber ou enviar através dele.

Neste contexto, o circuito necessita descrever uma rota (route) de um acionadoreventOut de um dado nodo para um acionadoreventIn de outro nodo. O circuitopermanecerá inativo até que um evento seja enviado entre os nodos. A reação do segundonodo 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;

Page 14: Tutorial Vrml

14

2Construção das Figuras

2.1 Nodo Shape

O nodoShape é utilizado na linguagem VRML para descrever as figuras presentesno ambiente virtual através da sua estrutura tridimensional, definido sua forma geométricae sua aparência neste mundo. Sua sintaxe é:

Shape {appearance NULL # SFNodegeometry NULL # SFNode

}

O valor do campogeometrydefine a forma tridimensional do objeto. Normalmenteele define uma das primitivas geométrica: Box, Cone, Cylinder ou Sphere. O valor defaultdo campo, indicado como nulo, caracteriza a ausência de forma para um objeto.

O valor do campogeometrypode ser alterado através de um evento enviado aocampo eventIn set_geometry. A respostas, após a alteração da forma do objeto, se daráatravés do campo eventOutgeometry_changed.

O campoappearancedefine a aparência do objeto descrito naquele nodo. Estecampo tipicamente inclui o nodoAppearanceque, quando nulo, define um objeto comaparência “esbranquiçada”.

O valor do campoappearancepode ser mudado com um evento para o campoevenIn set_appearancee a resposta da mudança da aparência do objeto será enviadaatravés do campo eventOutappearance_changed.

2.2 Nodo Appearance

Conforme mencionado, este nodo tem a função de descrever a aparência do objeto aele associado. Sua sintaxe é:

Page 15: Tutorial Vrml

15

Appearance {material NULL # SFNodetexture NULL # SFNodetextureTransform NULL # SFNode

}

O campomaterial define os atributos de aparência do material que compõem afigura. O valor NULL define um material “sem aparência”. 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 etextureTransformindica as transformações que esta textura sofrerá durante o processo demapeamento. Veja o capítulo 14 para maiores informações.

2.3 Nodo Material

Este nodo indica as propriedades da simulação física do material que comporá oobjeto em questão. Sua sintaxe é:

Material {ambienteIntensity 0.2 # SFFloatdiffuseColor 0.8 0.8 0.8 # SFColoremissiveColor 0.0 0.0 0.0 # SFColorshininess 0.2 # SFFloatspecularColor 0.0 0.0 0.0 # SFColortransparency 0.0 # SFFLoat

}

A função de cada um destes campos será descrita detalhadamente no capítulo 7deste material. Em linhas gerais são:

- 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 reflexão especular da luz para o objeto;- transparency: índice de transparência do objeto.

2.4 Primitivos Geométricos

A linguagem VRML traz alguns primitivos geométricos pré-definidos que sãoutilizados para a composição das figuras presentes nos mundos virtuais. Estes primitivossão: caixa, cone, cilindro e esfera. É importante notar que estes primitivos são, pordefinição da linguagem, sempre ocos, ou seja, a parte interna dos mesmos é vazia.

Page 16: Tutorial Vrml

16

a) Nodo Box

Este primitivo define uma caixa (prisma regular de quatro lados) e sua sintaxe é:

Box {size 2.0 2.0 2.0 # SFVec3f

}

O camposizedefine o tamanho da caixa a ser criada no sentido de cada um doseixos do sistema. O primeiro valor define o tamanho no sentido do eixo X, o segundo doeixo Y e o terceiro, do eixo Z. Esta caixa será sempre criada de forma centralizada naorigem do sistema de coordenadas, ou seja, no ponto (0,0,0).

O exemplo 2.1 apresenta o código necessário para a criação de uma caixa com osvalores default, ou seja, quadrada com 2m de lado. O exemplo 2.2, por sua vez, apresentauma caixa com 1m no sentido do eixo X, 3m no sentido do eixo Y e 5m no sentido do eixoZ.

#VRML V2.0 utf8

Shape{

appearance Appearance{material Material {}

}geometry Box{}

}

Exemplo 2.1: Criação 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: Definição de uma caixa de 1x3x5 metros.

b) Nodo Cone

Este nodo define uma figura geométrica com a forma de um cone. Sua sintaxe é:

Page 17: Tutorial Vrml

17

Cone {bottomRadius 1.0 # SFFloatheight 2.0 # SFFloatside TRUE # SFBoolbottom TRUE # SFBool

}

O cone a ser criado no mundo virtual estará com a sua base centrada na origem dosistema, no ponto (0,0,0), e seu ápice será projetado no sentido positivo do eixo Y. Oscampos presentes no nodo tem a seguinte função:

- bottomRadius: define o raio da base do cone. Seu valor deve ser sempremaior do zero;

- height: define a altura do cone no sentido positivo do eixo Y. Tambémdeve ter valor maior do que zero;

- side: campo booleano, verdadeiro ou falso, que define se o lado do cone(paredes alterais) serão ou não desenhadas no mundo virtual;

- bottom: tem natureza idêntica ao camposide, mas define se a base docone será apresentada ou não no mundo virtual.

O exemplo 2.3 apresenta a criação de um cone com os valores default e o exemplo2.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.5height 1.5

}}

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

Page 18: Tutorial Vrml

18

c) Nodo Cylinder

Este primitivo define um cilindro no mundo virtual e sua sintaxe é:

Cylinder {radius 1.0 # SFFloatheight 2.0 # SFFloatside TRUE # SFBooltop TRUE # SFBoolbottom TRUE # SFBool

}

O cilindro a ser criado estará localizado ao longo do eixo Y do sistema. Seu raio é adistância 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. Oscampos presentes e sua função são:

- 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

também deve ser maior do que zero;- side, tope bottom: são campos booleanos que definem se os lados, topo e

base do cilindro, respectivamente, serão ou não apresentados no mundovirtual durante o desenho do primitivo.

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

#VRML V2.0 utf8

Shape{

appearance Appearance{material Material {}

}geometry Cylinder {}

}

Exemplo 2.5: Um cilindro com valores default.

Page 19: Tutorial Vrml

19

#VRML V2.0 utf8

Shape{

appearance Appearance{material Material {}

}geometry Cylinder {

radius 4.0height 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.0height 1.0top FALSEbottom FALSEside TRUE

}}

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

d) Nodo Sphere

Este primitivo define uma figura geométrica com a forma de uma esfera. Suasintaxe é:

Sphere {radius 1.0 # SFFloat

}

Esta esfera tem um raio definido pelo camporadius e seu valor devem sempre sermaior 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 valordefault do raio (1m) e a segunda com 3.5m de raio.

Page 20: Tutorial Vrml

20

#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 maiscomplexos nodos que, por sua vez, podem vir a ser agrupados para criar novas figuras. Paraesta função a linguagem VRML define um nodo denominado deGroup. Sua sintaxe é:

Group {children [ ] # MFNodebboxCenter 0.0 0.0 0.0 # SFVec3fbboxSize -1.0 –1.0 –1.0 # SFVec3faddChildren # eventIn MFNoderemoveChildren # eventOut MFNode

}

O valor do campochildren especifica a lista de nodos filhos que serão incluídosneste grupo. Seus componentes são nodosShapeou outros nodosGroup.

Os camposbboxCentere bboxSizeespecificam o centro e o tamanho (no sentido decada eixo) de uma caixa suficientemente grande para envolver todo o grupo. Os valoresdefault listados acima indicam que o navegados VRML deve calcular automaticamente estacaixa, se necessário. Veja o capítulo XX para mais informações.

Page 21: Tutorial Vrml

21

Os camposaddChildrene removeChildrensão para tratar os eventos de adição eremoção de um filho ou nodo do grupo em questão.

O exemplo 2.10 apresenta um agrupamento de três figuras geométricas do tipobox,apresentando o sentido de deslocamento dos eixos do sistema de coordenadas. O exemplo2.11 mostra o agrupamento de vários tipos de figuras com o intuito de espelhar comopodem 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 Brancogeometry Box{

size 2.0 25.0 2.0}

},

Shape{appearance USE Brancogeometry Box{

size 2.0 2.0 25.0}

}]

}

Exemplo 2.10: Exemplo do agrupamento de três caixas.

Page 22: Tutorial Vrml

22

#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 Brancogeometry Sphere{

radius 7.0}

},

Shape{appearance USE Brancogeometry Cylinder{

radius 12.5height 0.5

}},

Shape{appearance USE Brancogeometry Cylinder{

radius 4.0height 20.0

}},

Shape{appearance USE Brancogeometry Cylinder{

radius 3.0height 30.0

}},

Shape{appearance USE Brancogeometry Cylinder{

radius 1.0height 60.0

}}

]}

Exemplo 2.11: Exemplo do agrupamento de várias figuras geométricas.

Page 23: Tutorial Vrml

23

3Inserindo Texto

3.1 Introdução

A apresentação de textos em VRML é especificada em dois nodos. O primeiro delesé destinado à apresentação geométrica do texto (nodoText) e o segundo destinado àspropriedades deste texto (nodoFontStyle).

O nodoTextpermite o controle do texto a ser impresso, seu tamanho em linhas oucolunas e o tamanho de cada uma delas, além do tipo de fonte a ser utilizado. O nodoFontStylefaz o controle da aparência do texto a ser apresentado, definindo a família defontes, o estilo, tamanho, espaçamento e justificação, entre outras características.

A linguagem VRML faz uso do conjunto de caracteresutf8 e, portanto, somenteaqueles caracteres presentes neste padrão serão possíveis de serem utilizados no nodoText.Este padrão é definido na especificação ISSO 10646-1:1993.

3.2 Nodo Text

O nodo Text, conforme mencionado, define a geometria do texto e pode serutilizado como valor para o campogeometrydo nodoShape. Sua sintaxe é:

Text {string [ ] # MFStringlength [ ] # MFFloatmaxExtent 0.0 # SFFloatfontStyle NULL # SFNode

}

O valor do campostring especifica uma ou mais linhas de texto a seremapresentadas no mundo virtual. Cada uma das linhas deve ser expressa com o uso de aspasduplas. Os vários textos presentes neste campo devem ser separados por vírgulas. O valordeste campo pode ser modificado através do campo eventInset_string. Quando este eventoé recebido o campostring é modificado para o novo valor e uma mensagem é enviada pelo

Page 24: Tutorial Vrml

24

campo eventOutstring_changed. O texto criado será localizado sobre o plano XY dosistema de coordenadas (Z=0) e será descrito no sentido crescente do eixo X, ou seja, seolharmos de algum ponto positivo sob o eixo Z, o texto iniciar-se-á na origem e será escritopara a sua direito, como em qualquer outro local.

O campo length especifica o comprimento desejado para cada linha do texto,segundo a medida padrão do sistema VRML. Uma vez especificada uma medida, as linhassão comprimidas ou expandidas, através da mudança do tamanho do caracter ou doespaçamento, para atingirem o tamanho desejado. O valor default de 0.0 especifica que otexto deve ser apresentado de maneira natural, sem preocupação com compressão ouexpansão. Este campo admite vários valores, sendo que cada um deles tem validade parauma das linhas do texto, na ordem que aparecerem, ou seja, o primeiro valor para aprimeira linha, o segundo valor para a segunda linhas, e assim por diante. Se o número devalores presentes for inferior ao número de linhas, aquelas que excederem este número (asúltimas) serão apresentadas como se o seu comprimento default. Finalmente, o valor destecampo pode ser alterado através de um campo eventInset_lengthe, o resultado, retornaatravés do campo evnetOutlength_changed.

O campomaxExtentdefine o comprimento máximo possível admissível ao texto,para qualquer linha ou coluna. As linhas que atingirem um comprimento maior do que oespecificado neste campo são comprimidas até que atinjam o limite. Este tamanho é medidohorizontalmente para textos horizontais e verticalmente para textos verticais. A este campoestá associado outro campo eventIn chamado deset_maxExtentque redefine ocomprimento máximo. A resposta a este evento é dada no campo eventOutmaxExtent_changed.

O campofontStyledefine as características que serão utilizadas para apresentar otexto presente no nodo, ou seja, para definir a sua aparência. Normalmente este campo temcomo valor um nodoFontStylea ser visto a seguir. Na ausência deste campo, o valordefault de NULL, instrui o navegador a apresentar um texto no sentido esquerda para adireita no caso de texto horizontal e de cima para baixo no caso de texto vertical, justificadopela esquerda e utilizando o tipo de fonteserif. Este campo pode ser alterado através docampo eventInset_fontSytlee a resposta se dará pelo campo eventOutfontStyle_changed.

Observe o exemplo 3.1 para a criação de um texto simples, utilizando os valoresdefault dos campos, exceto astring.

#VRML V2.0 utf8

Shape {appearance Appearance {

material Material { }}geometry Text {

string "Programando em VRML"}

}

Exemplo 3.1: Descrevendo um texto simples.

Page 25: Tutorial Vrml

25

É possível também a criação de múltiplos campos textos que serão distribuídos emlinhas 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 quetenha comprimento igual a 5 unidades. Caso tenhamos um texto disposto em linhas, istopode ser feito com a determinação de vários valores para o campolength. Veja isto noexemplo 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", "em VRML" ]length [ 4.0, 3.0 ]

}}

Exemplo 3.4: Definindo o comprimento de cada linha do texto.

Finalmente, no exemplo 3.5, é caracterizada a opção de determinar o comprimentomáximo admissível ao texto. Neste exemplo, qualquer valor para o campolength que formaior do que aquele explicitado para o comprimento máximo será ignorado.

Page 26: Tutorial Vrml

26

#VRML V2.0 utf8

Shape {appearance Appearance {

material Material { }}geometry Text {

string "Programando em VRML"maxExtent 5.0

}}

Exemplo 3.5: Definindo o comprimento máximo de um texto.

3.3 Nodo FontStyle

O nodoFontStylecontrola a aparência de um texto criado pelo nodoText. O nodoFontStylepode ser utilizado como valor para o campofontStyledeste último citado. Suasintaxe é:

FontStyle {family “SERIF” # SFStringstyle “PLAIN” # SFStringsize 1.0 # SFFloatspacing 1.0 # SFFloatjustify “BEGIN” # SFStringhorizontal TRUE # SFBoolleftToRight TRUE # SFBooltopToBottom TRUE # SFBoollanguage “ ” # SFString

}

O campofamily especifica a família de fontes que a linguagem VRML irá adotarpara apresentar aquele texto. O valor default para o campo é a família serif e todas estãolistadas na seguinte tabela:

Nome da Família DescriçãoSERIF Fonte de tamanho variável, semelhante ao tipo

Times RomanSANS Fonte de tamanho variável, semelhante ao tipo

HelveticaTYPEWRITER Fonte de tamanho fixo, semelhante ao tipo

Courier

O campostyle define qual será o estilo de apresentação do texto proposto. O seuvalor é um dos presentes na seguinte tabela, sendo o estilo plain o default:

Page 27: Tutorial Vrml

27

Nome do Estilo DescriçãoPLAIN Texto normal, sem estilo especialBOLD Texto apresentado em negritoITALIC Texto apresentado em itálicoBOLDITALIC Texto apresentado em negrito e itálico ao

mesmo tempo

O camposizeespecifica a altura dos caracteres com valor medido em unidades dosistema de coordenadas utilizado no ambiente VRML. A altura default dos caracteres é de 1unidade (metro).

O valor do campospacingdetermina o espaçamento vertical entre as linhas quecompõem o texto em um texto horizontal. No case de um texto vertical, ele determina oespaçamento entre as colunas do texto.

O campohorizontal especifica se o texto será apresentado no sentido horizontal(TRUE) ou vertical (FALSE). Todo o texto tem uma direção principal e uma direçãosecundária. A direção principal, para um texto horizontal, é ao longo do eixo X, e asecundária, ao longo do eixo Y. Para um texto vertical, a direção principal é ao longo doeixo Y e a secundária, ao longo do eixo X.

Os camposleftToRighte topToBottomsão utilizados em conjunto com o campohorizontal para controlar a disposição horizontal ou vertical do texto. Para um textohorizontal, o campoleftToRightespecifica como os caracteres consecutivos serão dispostosao longo da direção principal, da esquerda para a direita (TRUE), no sentido positivo doeixo X, ou da direita para a esquerda (FALSE), no sentido negativo do eixo X. Ainda nocaso de textos horizontais, o campotopToBottomespecifica como as linhas de texto serãodispostas, se de cima para baixo (TRUE),no sentido negativo do eixo Y, ou de baixo paracima, no sentido positivo do eixo Y.

Quando o texto for vertical, o uso dos camposleftToRighte topToBottomé análogo,mas opera invertendo as direções principal e secundária do texto. O campotopToBottomdetermina se os caracteres serão dispostos de cima para baixo (TRUE) ou de baixo paracima (FALSE). Já o campoleftToRightdetermina a disposição das colunas do texto, se elasserão colocadas da esquerda para a direita (TRUE) ou da direita para a esquerda (FALSE).

O campojustify especifica como o bloco de texto será disposto em relação aos eixosX e Y do sistema de coordenadas. Este campo pode receber dois valores de justificação,sendo o primeiro deles considerado como principal e o segundo como secundário. O valorprincipal controla a disposição do texto ao longo da direção principal do texto e osecundário faz o mesmo em relação a direção secundária do texto. Os valores possíveispara este campo vem da seguinte tabela e o seu efeito depende dos camposleftToRightetopToBottom:

Page 28: Tutorial Vrml

28

Nome daJustificação

Valor do campoleftToRight

Descrição

TRUE Coloca o lado esquerdo do bloco de texto noeixo Y

FIRST

FALSE Coloca o lado direito do bloco de texto no eixoY

TRUE Coloca o lado esquerdo do bloco de texto noeixo Y

BEGIN

FALSE Coloca o lado direito do bloco de texto no eixoY

TRUE Coloca o meio do bloco de texto no eixo YMIDDLEFALSE Coloca o meio do bloco de texto no eixo YTRUE Coloca o lado direito do bloco de texto no eixo

YEND

FALSE Coloca o lado esquerdo do bloco de texto noeixo Y

Nome daJustificação

Valor do campotopToBottom

Descrição

TRUE Coloca o topo do texto no eixo XFIRSTFALSE Coloca a base do texto no eixo XTRUE Coloca o topo do texto no eixo XBEGINFALSE Coloca a base do texto no eixo XTRUE Coloca o meio do texto no eixo XMIDDLEFALSE Coloca o meio do texto no eixo XTRUE Coloca o lado direito do bloco de texto no eixo

XEND

FALSE Coloca o lado esquerdo do bloco de texto noeixo X

O campo language especifica o contexto de linguagem a ser utilizado paraapresentação do bloco de texto. Os valores válidos para este campo são baseados no localde apresentação do texto e respeitam padrões internacionais. Os valores válidos vem daseguinte tabela:

Page 29: Tutorial Vrml

29

DescriçãoValor do campoLinguagem Território

ar Arábicode Alemão Alemanhade_DE Alemão Suíçade_CH Alemãoen Inglêsen_US Inglês Estados Unidosen_GB Inglês Inglaterrahi Hindújp Japonêsru Russosa Sanscritosw Swahilizh Chinêszh_TW Chinês Taiwanzh_CN Chinês China

O exemplo 3.6 apresenta a disposição de um texto controlando a família doscaracteres e o estilo de apresentação. Já o exemplo 3.7 controla o tamanho dos caracteres aserem apresentados segundo aquele estilo de fonte.

O exemplo 3.8 mostra como pode ser realizado o controle do espaçamento entre aslinhas de um texto e o exemplo 3.9, apresenta um texto composto de duas partes a seremapresentadas 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 família e estilo do texto.

O exemplo 3.10 dispõem um texto utilizando o campo de justificativa e o exemplo3.11 apresenta como é possível definir e utilizar posteriormente um estilo de fonte.

Page 30: Tutorial Vrml

30

#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 espaçamento entre linhas de um texto.

Page 31: Tutorial Vrml

31

#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 Brancogeometry Text {

string "em VRML"fontStyle FontStyle {

family "SANS"style "BOLD"justify "BEGIN"size 1.0

}}

}]

}

Exemplo 3.9: Apresentando um texto com várias estilos de fonte.

Page 32: Tutorial Vrml

32

#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 Brancogeometry Box {

size 5.0 0.01 2.0}

}

]}

Exemplo 3.10: Controlando a justificação do texto.

Page 33: Tutorial Vrml

33

#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.0family "TYPEWRITER"justify "MIDDLE"

}}

},Shape {

appearance USE Brancogeometry Text {

string [ "-----------", "-------" ]fontStyle USE Meu_Estilo

}}

]}

Exemplo 3.11: Definindo e reutilizando estilos de fonte.

Page 34: Tutorial Vrml

34

4Transformando Figuras

4.1 Introdução

Como pode ser observado nas seções anteriores esta, os figuras primitivas básicas eos textos são criados em locais pré-definidos do sistema de coordenadas. Por exemplo, umaesfera é criada, originalmente, centrada na origem do sistema, no ponto (0,0,0).

Por outro lado, na quase totalidade dos casos, a necessidade de localização destasfiguras geométricas não está situada nestes pontos pré-definidos. Neste caso, apresenta-se anecessidade de levar a figura para a posição desejada, ou seja, de fazermos uma translação.

O mesmo raciocínio pode ser feito para o tamanho e para a orientação da figura.Quando acontece a mesma situação, na qual a geometria não nos satisfaz, pode ser aplicadauma transformação de escala ou uma rotação para resolver o problema.

4.2 Nodo Transform

Em qualquer um dos casos citados acima, quando se faz necessário alterargeometricamente a figura a ser colocada no ambiente tridimensional, deve ser aplicado aela um nodoTransform:

Transform {children [ ] # MFNodetranslation 0.0 0.0 0.0 # SFVec3frotation 0.0 0.0 1.0 0.0 # SFRotationscale 1.0 1.0 1.0 # SFVec3fscaleOrientation 0.0 0.0 1.0 0.0 # SFRotationbboxCenter 0.0 0.0 0.0 # SFVec3fbboxSize -1.0 –1.0 –1.0 # SFVec3fcenter 0.0 0.0 0.0 # SFVec3faddChildren # EventIn MFNoderemoveChildren # EventIn MFNode

}

Page 35: Tutorial Vrml

35

Neste nodo, o campochildren defini as figuras que sofrerão as transformações aserem definidas. Os valores admissíveis para este campo são componentes dos nodosShapee Group. Os campostranslation, rotation e scaledefinem as transformações de translação,rotação e escala, respectivamente. O camposcaleOrientationtambém está envolvido com oprocesso de escala, assim como o campocenterparticipa do processo de rotação.

Os camposbbocCentere bboxSizedefinem a localização e o tamanho de um caixasuficientemente grande para envolver toda a figura transformada. Os valores defaultlistados no nodo indicam que esta caixa deverá ser calculada automaticamente pelonavegador se for necessário. A necessidade e aplicação desta caixa será discutida maisadiante.

Finalmente, os campos eventInaddChildren e removeChildrenacrescentam umnovo nodo para a lista de figuras a serem transformadas e removem um nodo previamenteexistente nesta lista. Estes campos também serão trabalhados oportunamente.

4.3 Translação

4.3.1 Vetores em 3D

A realização de uma operação de translação é baseada na definição de um vetortridimensional. Considerando dois pontos no espaço, um vetor é um segmento de retaorientado que tem origem em um destes pontos e destino no outro. Em especial, vamosconsiderar aqueles vetores que tem origem no ponto (0,0,0), ou seja, na origem do sistemade coordenadas.

Todo o vetor é definido por três componentes: direção, sentido e comprimento. Anoção de direção é idêntica aquela dada para uma reta, ou seja, é o ângulo pelo qual estareta corta os eixos do sistema. Como o vetor é um segmento de reta, ele possuí uma dadadireção. 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 direçãoestabelece a distância existente entre estes dois ponto.

Note que a definição de um vetor é independente da localização deste vetor. Naverdade existe um número infinito de vetores que possuem a mesma direção, sentido ecomprimento e, portanto, são iguais. Em especial perceba que o vetor que tem origem noponto (0,0,0) é idêntico aos demais.

4.3.2 Operação de Translação

Transladar um objeto, em qualquer circunstância significa modificar a sua posiçãono espaço, trocando-o de local. Se fizermos uma analogia com o mundo real, sempre quetrocamos algum objeto de local, ou seja, fizemos uma translação, implicitamente definimos

Page 36: Tutorial Vrml

36

esta operação como tendo uma direção, um sentido de deslocamento e uma distância. Comoestes elementos são exatamente aqueles que definem geometricamente um vetor, esteelemento tem papel fundamental na definição desta operação.

Retornando ao nodoTransform, o campotranslationé o que caracteriza a existênciade uma translação a ser aplicada ao conjunto de objetos listados no campochildren etambém como são os parâmetros desta operação. Note que ele é sucedido por três valoresreais (um campo do tipo SFVec3f) onde deve ser colocado o vetor de translação.

A definição deste vetor pode ser realizada tomando-se como origem do mesmo oponto (0,0,0) e o destino como um ponto qualquer (Px, Py, Pz). São justamente os valoresdeste ponto que devem ser listados como valores do campotranslation.Por exemplo, se osvalores listados forem (-3.0,2.0,2.5), a figura será translada na direção, sentido ecomprimento deste vetor, ou seja, 3.0 unidades no sentido negativo do eixo X, 2.0 unidadesno 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.0children [

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 não altere as suas coordenadas em Y e Z, apenasdeslocando o valor da coordenada X e duas unidades.

#VRML V2.0 utf8

Transform {translation -2.0 0.0 0.0children [

Shape {appearance Appearance {

material Material {}}geometry Cylinder {}

}]

}

Exemplo 4.2: Deslocando o cilindro em –X.

Page 37: Tutorial Vrml

37

Os exemplos 4.1 e 4.2 fazem com que a figura de um cilindro seja transladada duasunidades na direção do eixo X. O primeiro exemplo o faz no sentido de X positivo e osegundo, em X negativo. O exemplo 4.3 desloca a mesma figura duas unidades em Ypositivo e o exemplo 4.4 faz isto em Z positivo.

#VRML V2.0 utf8

Transform {translation 0.0 2.0 0.0children [

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.0children [

Shape {appearance Appearance {

material Material {}}geometry Cylinder {}

}]

}

Exemplo 4.4: Transladando em +Z.

Existe ainda a possibilidade de estabelecermos deslocamentos em múltiplos eixos. Éo que acontece no exemplo 4.5 onde a figura é deslocada 2 unidades em X positivo, 1 em Ypositivo e 2 em Z negativo.

#VRML V2.0 utf8

Transform {translation 2.0 1.0 -2.0children [

Shape {appearance Appearance {

material Material {}}geometry Cylinder {}

}]

}

Exemplo 4.5: Transladando em múltiplas direções combinadas.

Page 38: Tutorial Vrml

38

#VRML V2.0 utf8

Group {

children [

# ChaoShape {

appearance DEF Branco Appearance {material Material {}

}geometry Box {

size 25.0 0.1 25.0}

},

# Coluna da esquerdaTransform {

translation -2.0 3.0 0.0children Shape {

appearance USE Brancogeometry Cylinder {

radius 0.3height 6.0

}}

},

# Coluna da direitaTransform {

translation 2.0 3.0 0.0children Shape {

appearance USE Brancogeometry Cylinder {

radius 0.3height 6.0

}}

},

# CoberturaTransform {

translation 0.0 6.05 0.0children Shape {

appearance USE Brancogeometry Box {

size 4.6 0.4 0.6}

}}

]}

Exemplo 4.6: Deslocamentos múltiplos de várias figuras.

Page 39: Tutorial Vrml

39

Uma vez compreendido o processo de múltiplas translações, é possível comporfiguras mais complexas através de vários deslocamentos realizados em figuras diferentes. Oexemplo 4.6 define duas colunas (cilindros), desloca-as para os lados esquerdo e direito doobservador e para “cima” (+Y), criando a base para uma espécie de pórtico. Feito isto, oexemplo cria uma caixa que será utilizada na cobertura do pórtico e a coloca na parte decima das colunas.

No exemplo 4.7 é criada a mesma figura do exemplo 4.6 e feita uma segunda cópiada mesma que, por sua vez, é deslocada duas unidades no sentido negativo do eixo Z.

#VRML V2.0 utf8

Group {

children [

# ChaoShape {

appearance DEF Branco Appearance {material Material {}

}geometry Box {

size 25.0 0.1 25.0}

},

# Coluna da esquerdaDEF ColunaE Transform {

translation -2.0 3.0 0.0children Shape {

appearance USE Brancogeometry Cylinder {

radius 0.3height 6.0

}}

},

# Coluna da direitaDEF ColunaD Transform {

translation 2.0 3.0 0.0children Shape {

appearance USE Brancogeometry Cylinder {

radius 0.3height 6.0

}}

},

# CoberturaDEF Cobertura Transform {

translation 0.0 6.05 0.0

Page 40: Tutorial Vrml

40

children Shape {appearance USE Brancogeometry Box {

size 4.6 0.4 0.6}

}},

# Segundo objetoTransform {

translation 0.0 0.0 -2.0children [

USE ColunaEUSE ColunaDUSE Cobertura

]}

]}

Exemplo 4.7: Faz uma cópia da figura do exemplo anterior e coloca-a em outra posição.

4.4 Rotação

A operação de rotação é definida no camporotation do nodo Transform. Estecampo estabelece quatro valores reais. Os três primeiros deles representam um eixoimaginário no sistema de coordenadas em torno do qual a figura irá girar. O quarto e últimoparâmetro representa o ângulo de rotação.

A definição de um eixo dentro do sistema de coordenadas no qual acontecerá arotação é necessária em razão desta operação acontecer sempre em volta de algumsegmento. A definição deste eixo segue os mesmos princípios dos vetores utilizados natranslação. Aqui, entretanto, o comprimento do vetor não é considerado e sim a sua direçãoe sentido de crescimento.

A rotação irá acontecer em torno deste eixo por um ângulo medido sempre emradianos1 e é orientada também pela regra da mão direita. Considere que, com a mãodireita envolvemos o eixo de rotação, com o polegar apontando no sentido positivo decrescimento do mesmo. Se este ângulo for positivo, a figura irá girar no sentido em queapontam os demais dedos da mão. Se o ângulo for negativo, acontece o contrário.

Existe ainda a possibilidade de especificarmos um centro de rotação para a figuraatravés do campocenterdo nodoTransform. Por definição, o centro de rotação das figurasé a origem do sistema de coordenadas, ou seja, o ponto (0,0,0). Com o uso deste campovocê especifica um outro sistema de coordenadas (outro ponto de referência) que servirá debase para a rotação. Isto é necessário quando possuímos figuras articuladas como a junçãode braços e pernas, onde o movimento força o giro em torno de um outro ponto que não aorigem do sistema.

1 Radianos = ( Graus * 3.141592)/180

Page 41: Tutorial Vrml

41

Os exemplos 4.8, 4.9, 4.10 e 4.11 fazem com que uma caixa seja rotacionada em0,785 radianos (45º graus) em torno dos eixos +X, +X, +Y e +Z, respectivamente. Nosegundo exemplo o ângulo de rotação é negativo e a figura girará no sentido contrário ao doexemplo 4.8.

#VRML V2.0 utf8

Transform {rotation 1.0 0.0 0.0 0.785children [

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.785children [

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.785children [

Shape {appearance Appearance {

material Material {}}geometry Box {}

}]

}

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

Page 42: Tutorial Vrml

42

#VRML V2.0 utf8

Transform {rotation 0.0 0.0 1.0 -0.785children [

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.0radius 0.1

}},

Transform {rotation 1.0 0.0 0.0 1.047children USE Coluna

},

Transform {rotation 1.0 0.0 0.0 2.094children USE Coluna

}]

}

Exemplo 4.12: Girando vários objetos.

Os exemplo 4.12 e 4.13 criam uma figura mais complexa que é formada porprimitivos simples (cilindros) rotacionados convenientemente. O exemplo 4.14 toma opórtico construído no exemplo 4.6 e coloca uma cobertura no mesmo girando duas caixasque formarão o telhado.

Page 43: Tutorial Vrml

43

#VRML V2.0 utf8

Group {

children [

DEF Coluna1 Shape {appearance Appearance {

material Material {}}geometry Cylinder {

height 1.0radius 0.1

}},

DEF Coluna2 Transform {rotation 1.0 0.0 0.0 1.047children USE Coluna1

},

DEF Coluna3 Transform {rotation 1.0 0.0 0.0 2.094children USE Coluna1

},

Transform {rotation 0.0 1.0 0.0 1.785children [

USE Coluna2,USE Coluna3

]}

]}

Exemplo 4.13: Agregando mais objetos ao exemplo 4.12.

#VRML V2.0 utf8

Group {

children [

# ChaoShape {

appearance DEF Branco Appearance {material Material {}

}geometry Box {

size 25.0 0.1 25.0}

},

# Coluna da EsquerdaDEF ColunaE Transform {

Page 44: Tutorial Vrml

44

translation -2.0 3.0 0.0children DEF Coluna Shape {

appearance USE Brancogeometry Cylinder {

radius 0.3height 6.0

}}

},

# Coluna da DireitaDEF ColunaD Transform {

translation 2.0 3.0 0.0children USE Coluna

},

# CoberturaDEF Cobertura Transform {

translation 0.0 6.05 0.0children Shape {

appearance USE Brancogeometry Box {

size 4.6 0.4 0.6}

}},

# TelhadoDEF TelhadoE Transform {

translation -1.15 7.12 0.0rotation 0.0 0.0 1.0 0.524children DEF Telha Shape {

appearance USE Brancogeometry Box {

size 2.86 0.4 0.6}

}},

DEF TelhadoD Transform {translation 1.15 7.12 0.0rotation 0.0 0.0 1.0 -0.524children USE Telha

}]

}

Exemplo 4.14: Colocando telhado no pórtico do exemplo 4.6.

O exemplo 4.15 constrói um abajur estilizado. Note que para formar a articulação dejunção das duas partes do braço do abajur é necessário estabelecer um centro de rotaçãodiferente da origem. Neste caso o ponto escolhido é (0.0, –0.15, 0.0).

Page 45: Tutorial Vrml

45

#VRML V2.0 utf8

Group {

children [

# Base da lampadaShape {

appearance DEF Branco Appearance {material Material {}

}geometry Cylinder {

radius 0.1height 0.01

}},

# Braco da lampadaTransform {

translation 0.0 0.15 0.0rotation 1.0 0.0 0.0 -0.7center 0.0 -0.15 0.0children [

DEF Braco Shape {appearance USE Brancogeometry Cylinder {

radius 0.01height 0.3

}},Transform {

translation 0.0 0.3 0.0rotation 1.0 0.0 0.0 1.9center 0.0 -0.15 0.0children USE Braco

}]

}]

}

Exemplo 4.15: Desenho de um abajur.

4.5 Escala

A operação de escala faz com que as dimensões de uma figura sejam ampliadas oureduzidas conforme a necessidade. Ela é realizada através do camposcale do nodoTransform.

Este campo é representado por três valores reais que especificam os fatores deescala para cada um dos eixos do sistema de coordenadas. O primeiro deles nos diz o

Page 46: Tutorial Vrml

46

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 são valores maiores do que zero (0) necessariamente. Se elesestão no intervalo ] 0 ; 1 [, acontece uma redução proporcional ao valor. Por exemplo, ovalor de 0.5 reduz a figura a metade do seu tamanho original naquele eixo. Se os valoresforem maiores do que 1, ocorre uma ampliação desta figura. O valor de 1 para a escala nãoacarreta em modificações da figura.

Se os fatores de escala forem iguais, esta operação acontece de forma uniforme, ouseja, preservando as proporções originais da figura. O mesmo não acontece se estes valoresforem diferentes.

Em algumas situações não é suficiente ou desejável aplicar a escala tendo comoreferência os eixos X, Y e Z do sistema de coordenadas. Para estes casos é previsto umoutro campo do nodoTransform chamado descalaOrientation, que descreve um novosistema de coordenadas para aplicação da escala através da rotação do sistema original. Osseus parâmetros são os mesmos e tem a mesma função daqueles utilizados na operação derotação.

Ainda é possível especificar um novo centro de referência para a operação de escalaatravés do campocenter. Assim como na rotação, este campo especifica um ponto que é aorigem deste novo centro.

Observando a aplicação da transformação de escala, nos exemplos 4.16, 4.17, 4.18,4.19 e 4.20, é apresentada a transformação de uma esfera em um processo de escala nãouniforme, ou seja, o resultado final é topologicamente equivalente a uma esfera, mas a suaforma não é idêntica.

#VRML V2.0 utf8

Transform {scale 2.0 1.0 1.0children [

Shape {appearance Appearance {

material Material {}}geometry Sphere {}

}]

}

Exemplo 4.16: Transformação em escala de uma esfera.

Page 47: Tutorial Vrml

47

#VRML V2.0 utf8

Transform {scale 0.5 1.0 1.0children [

Shape {appearance Appearance {

material Material {}}geometry Sphere {}

}]

}

Exemplo 4.17: Outra transformação da esfera.

#VRML V2.0 utf8

Transform {scale 1.0 2.0 1.0children [

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.5children [

Shape {appearance Appearance {

material Material {}}geometry Sphere {}

}]

}

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

Page 48: Tutorial Vrml

48

#VRML V2.0 utf8

Transform {scale 2.0 0.5 4.0children [

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.5children Shape {

appearance DEF Branco Appearance {material Material {}

}geometry Cylinder {

radius 1.0height 0.025

}}

},

DEF Fuselagem Transform {scale 2.0 0.2 0.5children Shape {

appearance USE Brancogeometry Sphere {}

}},

Transform {scale 0.3 2.0 0.75children [

USE CorpoUSE Fuselagem

]}

]}

Exemplo 4.21: Desenho de um avião.

Page 49: Tutorial Vrml

49

O exemplo 4.21 desenha um avião estilizado utilizando-se apenas da deformação defiguras básicas como esferas e cilindros. O exemplo 4.22 faz cópias do pórtico utilizado noexemplo 4.14 e reduz estas cópias a metade do tamanho original. Note que os fatores deescala deste exemplo são iguais, portanto a escala é uniforme e o resultado é uma figuracom as mesmas proporções da original

#VRML V2.0 utf8

Group {

children [

# ChaoShape {

appearance DEF Branco Appearance {material Material {}

}geometry Box {

size 25.0 0.1 25.0}

},

DEF Casa Group {

children [

# Coluna da EsquerdaDEF ColunaE Transform {

translation -2.0 3.0 0.0children DEF Coluna Shape {

appearance USE Brancogeometry Cylinder {

radius 0.3height 6.0

}}

},

# Coluna da DireitaDEF ColunaD Transform {

translation 2.0 3.0 0.0children USE Coluna

},

# CoberturaDEF Cobertura Transform {

translation 0.0 6.05 0.0children Shape {

appearance USE Brancogeometry Box {

size 4.6 0.4 0.6}

}},

Page 50: Tutorial Vrml

50

# TelhadoDEF TelhadoE Transform {

translation -1.15 7.12 0.0rotation 0.0 0.0 1.0 0.524children DEF Telha Shape {

appearance USE Brancogeometry Box {

size 2.86 0.4 0.6}

}},

DEF TelhadoD Transform {translation 1.15 7.12 0.0rotation 0.0 0.0 1.0 –0.524children USE Telha

}]

},

# Faz copias de tamanho diferenteTransform {

translation -4.0 0.0 0.0scale 0.5 0.5 0.5children USE Casa

},

Transform {translation 4.0 0.0 0.0scale 0.5 0.5 0.5children USE Casa

}

]}

Exemplo 4.22: Criando duas cópias do pórtico do exemplo 4.14.

A figura do exemplo 4.23 é transformada tendo como base um novo centro dereferência no ponto (0,-1,0), o que faz com que a árvore da figura aumente seu tamanhotendo como base o ponto dado e não a origem do sistema.

Por último, o exemplo 4.24 apresenta uma transformação de escala definida comouma orientação diferente do usual, o que faz com que a árvore incline para o lado indicadopelo novo eixo de orientação.

Page 51: Tutorial Vrml

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.0scale 1.0 2.0 1.0center 0.0 -1.0 0.0children [

Shape {appearance USE Brancogeometry Cylinder {

radius 0.5height 2.0

}},Transform {

translation 0.0 3.0 0.0children Shape {

appearance USE Brancogeometry Cone {

bottomRadius 2.0height 4.0

}}

}]

}]

}

Exemplo 4.23: Definição de um novo centro de referência para a escala.

Page 52: Tutorial Vrml

52

#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.0scale 1.0 2.0 1.0scaleOrientation 0.0 0.0 1.0 -0.785center 0.0 -1.0 0.0children [

Shape {appearance USE Brancogeometry Cylinder {

radius 0.5height 2.0

}},Transform {

translation 0.0 3.0 0.0children Shape {

appearance USE Brancogeometry Cone {

bottomRadius 2.0height 4.0

}}

}]

}]

}

Exemplo 4.24: Definição de um novo eixo de orientação para a escala.

Page 53: Tutorial Vrml

53

5Animando o Posicionamento,

Orientação e Escala das Figuras

5.1 Introdução

Para adicionar movimento ao mundo virtual, uma das alternativas é animar oposicionamento, orientação e escala de uma cena. Se o sistema de coordenadas desta cenase move, todas as figuras construídas nela também se moverão.

Neste contexto, entende-se como animação qualquer modificação da figura queocorre em um determinado intervalo de tempo. Os dois elementos básicos deste processosão um relógio que controla a animação no tempo e a descrição do que irá e como irámudar neste intervalo de tempo. A linguagem VRML fornece o nodoTimeSensorpara criaro relógio e os nodosPositionInterpolator e OrientationInterpolatorpara controlar asmodificações. Estes últimos tem a função de definir a orientação ou posição correta dafigura a partir das informações de tempo obtidas do relógio.

O nodoTimeSensorage como um relógio real, contabilizando o tempo a partir domomento da sua inicialização. Sempre que estiver ativo, o tempo corrente é disponibilizadopelo seu campoeventOut time. Para fazermos o controle da animação, estes eventos desaída (tempo) devem ser roteados para os nodos que controlam as modificações.

Quando trabalha nestas condições, o resultado do nodoTimeSensoré uma unidadede tempo absoluto, medido em segundos, desde a 00:00 hora do dia 1º de janeiro de 1970.Nesta situação, o segundo 0 (zero) aconteceu nesta data, o segundo 1 logo a seguir e assimpor diante. Através disto, é possível programar o nodoTimeSensorpara agir em datas ehoras específicas. Isto acontece quando o tempo específico de início e fim da atuação donodo é informado aos camposstartTimee stopTime.

Apesar de fornecer um bom mecanismo de controle, a medida do tempo de formaabsoluta nem sempre é conveniente ao trabalho. Muitas vezes, senão a maioria delas,necessita-se apenas animar uma figura num certo intervalo de tempo que independe da datae da hora exata. Este tempo é conhecido como tempo fracional. Nele a animação começa no

Page 54: Tutorial Vrml

54

tempo 0 (zero) e termina o tempo 1 (um), podendo ser fracionada neste intervalo como fornecessário. Como isto, na maioria das vezes, não o suficiente, é possível ainda colocar estetempo em umloop e repetí-lo tanto quanto seja necessário.

5.2 Processo de Animação

Conforme mencionado, o resultado do cômputo do tempo é utilizado nos nodos deinterpolação para calcular o valor exato da translação ou rotação a ser informado ao nodoTransform. Este tem a responsabilidade de apresentar a figura, como visto anteriormente.

Neste processo, uma descrição da animação deve fornecer a posição ou orientaçãopara cada nova unidade de tempo fracional pertencente ao intervalo listado. De forma maissimples podemos dizer que esta descrição funciona como uma tabela, havendo uma entradade descrição para cada entrada de tempo existente. Os valores de posicionamento ouorientação calculados para estes tempos são chamados de valores de chave (key values). Ointerpolador VRML utiliza estes valores de chave e os de tempo para construir um modeloou rascunho da animação e preenche os valores entre aqueles especificados por contaprópria, se necessário.

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 deuma reta, o interpolador não terá dificuldades em encontrar os valores intermediáriosnecessários. Nesta situação, o tempo fracionário 0.5 terá seus valores calculados pelointerpolador e corresponderá ao meio do caminho. Por outro lado, se desejamos fazer comque o carro faça um curva, será necessário fornecer mais valores no intervalo para que omesmo descreva esta curva de forma “suave”.

Assim sendo, os nodosPositionInterpolatore OrientationInterpolatorutilizam osvalores listados de tempo fracional e valores de chave para descrever a animação. Ostempos fracionais são descritos no campokey e os valores chave no campokeyValue.Ambos os campos podem ter qualquer quantidade de valores, mas sempre nacorrespondência de um para um.

Para finalizar, o interpolador VRML utiliza-se sempre de uma interpolação linearentre dois valores de chave listados, ou seja, o caminho encontrado entre os dois serásempre uma reta. Todos os pontos calculados neste intervalo farão parte deste segmento.Desta forma, para descrever um caminho curvo, vários pontos de interpolação deverão serdescritos, em quantidade tanta quanto for a precisão desejada.

Durante a aplicação, quando é necessário fazer uma interpolação deposicionamento, o interpolador calcula os respectivos valores para as coordenadas X, Y e Zdos pontos necessário ao processo. Já para realizar uma animação de rotação, além do eixosde rotação X, Y e Z, é necessário interpolar também o ângulo de rotação.

Page 55: Tutorial Vrml

55

O valor computado pelo nodoPositionInterpolatoré do tipo SFVec3f e é projetadopara ser utilizado como entrada de valores de translações ou coordenadas tridimensionais.O nodo Transform, por exemplo, utiliza um valor deste como definição do campotranslatione, por tanto, o interpolador de posições pode controlá-lo. De forma analógica,podemos fazer a mesma relação para o interpolador de orientação, pois o seu resultado é nomesmo formato necessário ao camporotation.

Seguindo esta linha de raciocínio, todo o campo que necessite de um valor SFVec3fcomo entrada é candidato a ser animado através do interpolador de posicionamento. Omesmo para a orientação. Em especial, este procedimento pode ser adotado para o camposcaledo nodoTransformque controla a escala aplicada a um objeto e tem um campo noformato SFVec3f. Através doPositionInterpolatorpodemos então animar fatores de escalapara um dado objeto.

5.3 Nodo TimeSensor

O nodo TimeSensor, mencionado nas seções anteriores é o responsável pelocontrole do relógio que gera os eventos para a animação. Sua sintaxe é:

TimeSensor {enable TRUE # SFBoolstartTime 0.0 # SFTimestopTime 0.0 # SFTimecycleInterval 1.0 # SFTimeloop FALSE # SFBoolisActive # eventOut SFBooltime # eventOut SFTimecycleTime # eventOut SFTimefraction_changed # eventOut SFFloat

}

O valor do campoenableespecifica se o relógio está ativado ou não. Se oseu valor é TRUE, o relógio está ligado e o restante dos campos do nodo são utilizados paracontrolar este funcionamento. Se o seu valor é FALSE, o relógio está desligado e nenhumasaída é produzida em intervalos de tempo.

Os camposstartTimee stopTimeespecificam os tempos nos quais o relógio deve serligado ou desligado, respectivamente. O campocycleIntervalespecifica a quantidade detempo no qual o interpolador deverá levar para ir do tempo fracionário 0.0 para o tempo1.0. Por exemplo, podemos especificar apenas os dois extremos do intervalo para animaruma figura, mas desejamos ir do primeiro para o último em 30 segundos ou em 10segundos. Este último será o valor do campocycleInterval.

Page 56: Tutorial Vrml

56

O campoloop especifica se o relógio irá entrar em laço ou não. Quando o seu valoré TRUE o fracionar ao chegar no final do intervalo (1.0) retornar ao valor 0.0 e reinicia oprocesso. Quando o valor do campo é FALSE, não acontece este retorno.

Os camposstartTime, stopTime, cycleInterval e loop podem trabalhar de formaconjunta para controlar o resultado de saída do relógio. Uma vez ativado, o relógiopermanece em aguardo até que ostartTimeseja alcançado. Neste momento, o sensor éativado e inicia a gerar eventos. Se o campoloop é FALSE, então o sensor gera eventos atéque o tempostopTimeseja atingido ou um ciclo completo seja completado emstartTime + cycleInterval, o que acontecer primeiro. Se o campoloop é TRUE, então osensor gera eventos continuamente até que o tempo final seja atingido, se acontecer. Comisto podem ser criados loops infinitos. A tabela a seguir apresenta as possíveis combinaçõesentre estes campos e seus efeitos:

Valor docampo loop

Relacionamento entre oscampos de tempo

Efeito

TRUE stopTime <= startTime Não termina a execução.TRUE startTime < stopTime Executa até atingir o tempo

stopTimeFALSE stopTime <= startTime e

cycleIntervalExecuta um ciclo e para notempostartTime+cycleInterval

FALSE startTime < (startTime+cycleInterval) <= stopTime

Executa um ciclo e para notempostartTime+cycleInterval

FALSE startTime < stopTime <(startTime+cycleInterval)

Executa pelo menos um ciclo epara no tempostopTime

O campoisActiveé eventOut e retorna um dado booleano TRUE quando o sensor éativado e inicia a geração de eventos. Um sinal FALSE é enviado por este campo quando osensor pára a geração de eventos e se torna inativo. O campotime também é eventOut eatravés dele é possível obter o valor do tempo absoluto enquanto o sensor estiver gerandoeventos.

O campo eventOutcycleTimeinforma o valor do tempo absoluto cada vez que ociclo de tempo é reiniciado. Se o campoloop é FALSE, então a saída do valor é informadoapenas na início do primeiro e único ciclo.

Finalmente, o campo eventOutfraction_chaged informa um valor de tempofracional, entre 0.0 e 1.0, que é como o sensor progride pelo ciclo. Se o campoloop éFALSE, os valores são informados apenas durante um único ciclo. Caso contrário, osvalores são informados repetidamente, a cada novo ciclo.

O valor do campoenablepode ser modificado através de um evento roteado para ocampo eventInset_enable. A informação enviado no evento é do tipo booleano e ativa(TRUE) ou desativa (FALSE) o relógio. O resultado da operação é informado através deum campo eventOutenable_changed.

Page 57: Tutorial Vrml

57

De forma semelhante, o valor do campoloop pode ser modificado através de umevento roteado para o campo eventInset_loop. Este evento é igualmente booleano e ativa(TRUE) ou desativa (FALSE) a entrada do relógio em laço. O resultado da operação éinformado através do campo eventOutloop_changed.

Os valores dos camposstartTime, stopTimee cycleIntervalpodem ser modificadospor eventos para os campos eventInset_startTime, set_stopTimee set_cycleInterval,respectivamente. Quando a operação é finalizada, o resultado é informado através doscampos eventOut starTime_changed, stopTime_changede cycleInterval_changed,respectivamente. Estas operações somente terão efeito se o relógio estiver desativado. Casocontrário, o novo valor informado é ignorado.

O nodoTimeSensornão cria nenhuma figura no mundo virtual e não há nenhumefeito visível de sua presença. Ele pode ser utilizado como filho de qualquer grupo denodos, mas é totalmente independente do sistema de coordenadas utilizado.

5.4 Nodo PositionInterpolator

O nodoPositionInterpolatordescreve uma série de posições chave disponíveis parao uso no processo de animação. Sua sintaxe é:

PositionInterpolator {key [ ] # MFFloatkeyValue [ ] # MFVec3fset_fraction # eventIn SFFloatvalue_changed # eventOut SFVec3f

}

O campokeyespecifica uma lista de valores chave, fracionais, tipicamente entre 0.0e 1.0, tais como aqueles produzidos na saída o nodoTimeSensor. Estes valores podem serpositivos ou negativos, de qualquer tamanho, e devem ser expressos em ordem crescente.

O campokeyValuetambém é composto de uma lista de valores, cada um delescontendo uma valor para cada coordenada do sistema (X, Y e Z). Os valores desta lista e daprimeira, do campokey, são utilizados em conjunto tal que o primeiro valor da primeiralista especifica o tempo para o primeiro valor da segunda lista, de posições. Estas listas,conjuntamente são capazes de especificar qualquer número de tempo e posições, masambas devem conter a mesma quantidade de valores.

Quando o nodoPositionInterpolatorrecebe um tempo fracional através do camposet_fraction, ele calcula a nova posição baseada na lista de posições chaves e seus temposfracionais correspondentes. O resultado é informado através do campovalue_changed.Tipicamente os tempos fracionais são informados ao camposet_fractionatravés de umevento roteado do campo eventOutfraction_changeddo nodoTimeSensor. Estes tempos

Page 58: Tutorial Vrml

58

fracionais também podem ser gerados por outros meios caso venha a ser necessário, massempre dentro dos formatos especificados.

O nodo PositionInterpolatortambém não cria nenhuma figura e não tem efeitovisível. Ele pode ser incluído como um filho de qualquer grupo, mas é independente dosistema de coordenadas utilizado.

5.5 Nodo OrientationInterpolator

O nodo OrientationInterpolator trabalha de forma assemelhada ao nodo deinterpolação de posições, mas ele descreve uma série de valores chave de rotações queestão disponíveis para uma animação. Sua sintaxe é:

OrientationInterpolator {key [ ] # MFFloatkeyValue [ ] # MFRotationset_fraction # eventIn SFFloatvalue_changed # eventOut SFRotation

}

Essencialmente, os campos e a função de cada um deles é a mesma que descrita parao nodoPositionInterpolator. A única diferença de maior monta é quanto ao conteúdo docampokeyValueque agora tem cada uma das entradas composta de quatro valores onde ostrês primeiros descrevem um eixo de rotação e o quarto o ângulo, da mesma forma que natransformação de rotação.

5.6 Exemplos

Para melhorar a compreensão do processo de animação, vamos comentar algunsexemplos.

O exemplo 5.1 faz com que uma caixa fique pulando ou saltitando pela tela donavegador. Neste exemplo, o relógio atual em laço infinito e cada interação deste laço tema duração de 4 segundos, conforme o campocycleInterval. No campokeydo interpoladorsão estabelecidos os intervalos do tempo fracionário correspondentes as posiçõesestabelecidas no campokeyValue. Conforme foi mencionado, as demais posições sãointerpoladas linearmente pelo interpolador.

Ao final do exemplo existem duas linhas que definem as rotas nas quais os eventosirão circular. A primeira linha utiliza a saída de tempo fracionário do relógio como entradapara o camposet_fractiondo interpolador da caixa. Este por sua vez, ao recalcular o novovalor o envia pelo campovalue_changedque é, por sua vez, informado como entrada paraa transformação de translação da caixa.

Page 59: Tutorial Vrml

59

#VRML V2.0 utf8

Group {

children [

# Define a caixa que sera animadaDEF 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 relógioDEF Clock TimeSensor {

cycleInterval 5.0loop TRUE

},

# Descreve o caminha da animacaoDEF 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 eventosROUTE Clock.fraction_changed TO CaminhoCubo.set_fractionROUTE CaminhoCubo.value_changed TO Cubo.set_translation

Exemplo 5.1: Animação de um cubo “saltando” na tela.

O exemplo 5.2 trabalha de forma bastante semelhante ao exemplo anterior, masutiliza o resultado do interpolador de orientação como informação para a definição da nova

Page 60: Tutorial Vrml

60

orientação de um cilindro. Na prática, ela faz com que o cilindro gira pela telasistematicamente. Observe que os valores de chave do campokeydo interpolador estão emmenor número. Isto é devido ao fato de que, sendo uma rotação, são calculadas posiçõespara todas os ângulos do círculo trigonométrico.

#VRML V2.0 utf8

Group {

children [

# Cilindro girandoDEF Coluna Transform {

rotation 0.0 0.0 1.0 0.0children Shape {

appearance Appearance {material Material {

diffuseColor 0.0 1.0 0.0}

}geometry Cylinder {

height 1.0radius 0.2

}}

},

# Define o relógioDEF Clock TimeSensor {

cycleInterval 4.0loop TRUE

},

# Descreve o caminho da animacaoDEF 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 eventosROUTE Clock.fraction_changed TO CaminhoColuna.set_fractionROUTE CaminhoColuna.value_changed TO Coluna.set_rotation

Exemplo 5.2: Animação de um cilindro girando na tela.

Page 61: Tutorial Vrml

61

O exemplo 5.3 faz o uso do interpolador de posicionamento para alimentar a entradada transformação em escala do nodo que define a esfera. Esta operação, com os valoresdefinidos, 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 pulsanteDEF Bola Transform {

children Shape {appearance Appearance {

material Material {diffuseColor 1.0 0.0 0.0

}}geometry Sphere {}

}},

# Define o relogioDEF Clock TimeSensor {

cycleInterval 2.0loop TRUE

},

# Descreve o caminho da animacaoDEF 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 eventosROUTE Clock.fraction_changed TO CaminhoBola.set_fractionROUTE CaminhoBola.value_changed TO Bola.set_scale

Exemplo 5.3: Uma esfera “pulsando” na tela.

O exemplo 5.4 mostra como pode ser utilizado um único interpolador paramanipular várias figuras. Neste caso, este interpolador faz com que três caixa pulemsincronizadamente na tela. Este sincronísmo vem do uso deste único gerador de posições.

Page 62: Tutorial Vrml

62

#VRML V2.0 utf8

Group {

children [

# Primeiro cuboDEF 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 cuboTransform {

translation -2.0 0.0 0.0children DEF Cubo2 Transform {

children USE TipoCubo}

},

# Terceiro cuboTransform {

translation 2.0 0.0 0.0children DEF Cubo3 Transform {

children USE TipoCubo}

},

# Define o relogioDEF Clock TimeSensor {

cycleInterval 4.0loop TRUE

},

# Descreve o caminho da animacaoDEF 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,

Page 63: Tutorial Vrml

63

0.0 0.0 0.0]

}]

}

# Define rotas dos eventosROUTE Clock.fraction_changed TO CaminhoCubo.set_fractionROUTE CaminhoCubo.value_changed TO Cubo1.set_translationROUTE CaminhoCubo.value_changed TO Cubo2.set_translationROUTE CaminhoCubo.value_changed TO Cubo3.set_translation

Exemplo 5.4: Uso de vários figuras sendo interpoladas por um único interpolador.

O exemplo 5.5, em contraponto ao exemplo anterior, faz o uso de múltiplosinterpoladores para controlar diferentes figuras. Isto faz com que as três figuras presentesno texto girem de forma não sincronizada.

Finalmente o exemplo 5.6 apresenta o uso de múltiplos relógios para controlarmúltiplos interpoladores e múltiplas figuras. Neste exemplo, esta ação faz com que umsistema solar simulado tenha os seus planetas (figuras diferentes) girando em torno do seusol com órbitas diferentes (interpoladores diferentes) e a velocidades diferentes (relógiosdiferentes).

#VRML V2.0 utf8

Group {children [

# Primeira barra giratóriaDEF 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 barraDEF Barra2 Transform {

children Shape {appearance USE CorBarrageometry Box {

size 0.2 1.5 0.2}

}},

Page 64: Tutorial Vrml

64

# Terceira BarraDEF Barra3 Transform {

children Shape {appearance USE CorBarrageometry Box {

size 0.2 0.2 1.5}

}},

# Define o relogioDEF Clock TimeSensor {

cycleInterval 4.0loop TRUE

},

# Descreve o caminho da animacaoDEF 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 eventosROUTE Clock.fraction_changed TO CaminhoBarra1.set_fractionROUTE Clock.fraction_changed TO CaminhoBarra2.set_fractionROUTE Clock.fraction_changed TO CaminhoBarra3.set_fractionROUTE CaminhoBarra1.value_changed TO Barra1.set_rotationROUTE CaminhoBarra2.value_changed TO Barra2.set_rotationROUTE CaminhoBarra3.value_changed TO Barra3.set_rotation

Exemplo 5.5: Uso de múltiplos interpoladores.

Page 65: Tutorial Vrml

65

#VRML V2.0 utf8

Group {

children [

# Sistema planetario

# SolShape {

appearance Appearance {material Material {

diffuseColor 1.0 1.0 0.0}

}geometry Sphere {}

},

# PlanetasDEF Planeta1 Transform {

translation 2.0 0.0 0.0center -2.0 0.0 0.0children 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.0center -3.0 0.0 0.0children Shape {

appearance USE CorPlanetageometry Sphere {

radius 0.3}

}},DEF Planeta3 Transform {

translation 4.0 0.0 0.0center -4.0 0.0 0.0children Shape {

appearance USE CorPlanetageometry Sphere {

radius 0.5}

}},

Page 66: Tutorial Vrml

66

# Define um relogio para cada planetaDEF Clock1 TimeSensor {

cycleInterval 2.0loop TRUE

}

DEF Clock2 TimeSensor {cycleInterval 3.5loop TRUE

}

DEF Clock3 TimeSensor {cycleInterval 5.0loop TRUE

}

# Descreve os caminhos da animacao. Um para cada planetaDEF 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 eventosROUTE Clock1.fraction_changed TO CaminhoPlaneta1.set_fractionROUTE Clock2.fraction_changed TO CaminhoPlaneta2.set_fractionROUTE Clock3.fraction_changed TO CaminhoPlaneta3.set_fractionROUTE CaminhoPlaneta1.value_changed TO Planeta1.set_rotationROUTE CaminhoPlaneta2.value_changed TO Planeta2.set_rotationROUTE CaminhoPlaneta3.value_changed TO Planeta3.set_rotation

Exemplo 5.6: Uso de múltiplos relógios com múltiplos interpoladores.

Page 67: Tutorial Vrml

67

6Interagindo com os Objetos

6.1 Introdução

O processo descrito no capítulo anterior a este fazia com que os objetos ou figurasdo mundo virtual adquirissem a possibilidade movimentar-se por este mundo, tendo umaparticipação mais dinâmica no mesmo. Por outro lado, esta animação era caracterizada porser completamente independente do observador ou usuário, pois este não interagia com osobjetos.

É possível tornar o mundo virtual ainda mais dinâmico. Para isto, o VRML propiciaoutros recursos de animação que são dependentes da ação do usuário. Em outras palavras, aanimação acontece somente quando o usuário executa algum tipo pré-determinado deevento. Este eventos, monitorados pela linguagem, dizem respeito a ação de dispositivos deapontamento ou indicação, como mouse, touchpad, joystick, entre outros. Tipicamente,com estes dispositivos realizamos três tipos de tarefas: movimento, seleção (click) e arrasto(drag). Assim, o VRML fica atento a estas ações e, para cada uma delas, determina aresposta desejada.

O princípio básico da animação determinado no capítulo anterior será mantido, ouseja, existirá um interpolador que calculará frações de posicionamento (translação, escala erotação) que serão repassadas para o objeto em questão na forma de transformações o quemodificará sua apresentação. O principal detalhe a ser alterado neste novo processo deanimação com a interação do usuário, será que o interpolador ou o relógio, quanto estiverpresente, de geração de frações para o interpolador, serão ativados somente quando ousuário executar a ação no objeto.

Neste contexto, a linguagem VRML propicia dois de sensores para monitorar a açãodo usuário. O primeiro tipo, composto pelo nodoTouchSensor, é um sensor sensível aotoque. A sua função é perceber que o usuário moveu-se, clicou sobre ou arrastou o objeto eavisar sobre isto. O seu aviso consiste de uma informação booleana verdadeira ou falsacaracterizando o tipo de ação e o tempo em que ela ocorreu. O segundo tipo de sensores éformado por aqueles sensíveis ao movimento, como os nodosCylinderSensor, PlaneSensore SphereSensor. Eles são similares ao sensor de toque, mas também fornecem uma saída

Page 68: Tutorial Vrml

68

projetada para o uso no controle de movimento e orientação de figuras. Utilizando-os serápossível clicar sobre e movimentar figuras no mundo virtual.

É necessário um comentário sobre a conduta dos sensores de movimento. Quando ousuário clica e arrasta uma figura, o sensor produz na sua saída uma série de valores quesão tipicamente roteados para um nodoTransform, causando o movimento. Quando ousuário libera o objeto, a produção de valores cessa. Supondo que, logo a seguir, ele torna aclicar sobre o objeto e arrastá-lo, qual será o ponto de partida: o situação atual do objeto oua sua situação original? As duas condutas são permitidas e existe um campo nestes nodosque as determina. Este campo é chamado deautoOffsete, quando verdadeiro (TRUE), osensor parte a animação da situação atual. Caso seja falso, a geração dos valores partirá dasituação inicial do objeto.

Finalmente, se um dos sensores for instanciado através do uso das palavras chavesDEF e USE, ele monitorará ações do usuário em qualquer figura que estiver no grupo paide qualquer uma das instâncias do sensor.

6.2 Nodo TouchSensor

O nodoTouchSensordefine um sensor capaz de detectar ações do usuário sobre oobjeto e produzir a saída correspondente a ação desejada. Sua sintaxe é:

TouchSensor{enabled TRUE # SFBoolisActive # eventOut SFBoolisOver # eventOut SFBooltouchTime # eventOut SFTimehitPoint_changed # eventOut SFVec3fhitNormal_changed # eventOut SFVec3fhitTexCoord_changed # eventOut SFVec2f

}

O valor do campoenableddefine se o sensor está ativado ou não. Se o valor éTRUE, o sensor está ativado e gera valores nas saídas. O valor deste campo pode seralterado através de um campo eventIn chamado deset_enablede a resposta da alteração éapresentada no campo eventOutenabled_changed.

Quando o usuário move o cursor sobre uma figura que está sendo monitorada pelonodo TouchSensor, o sensor envia um sinal TRUE através do campo eventOutisOver.Quando o cursor sai da figura monitorada, o sensor envia um sinal FALSE por este mesmocampo. Sempre que o cursor estiver sobre a figura, o ponto no qual ele está posicionado éfornecido através do campohitPoint_changed. Neste mesmo ponto de contato, o sensorfornece os valores do vetor normal e das coordenadas da textura que foi mapeada, sehouver, através dos camposhitNormal_changed e hit_TexCoord_changed,respectivamente.

Page 69: Tutorial Vrml

69

Se o usuário clicar o cursor sobre a figura, o sensor produz uma saída através docampoisActive. Quando o botão de seleção for liberado, este campo produz um sinal deFALSE. Os campos de posicionamento na objeto, normal e textura mencionados acima,continuam produzindo os mesmos resultados, mas referentes os ponto da seleção.

6.3 Nodo PlaneSensor

O nodoPlaneSensorcria um sensor para detectar as ações do usuários e convertê-las em uma saída adequada para operações de manipulação (transformação) das figuras seelas movem-se a longo de um plano 2D. Sua sintaxe é:

PlaneSensor{enabled TRUE # SFBoolautoOffset TRUE # SFBooloffset 0.0 0.0 0.0 # SFVec3fmaxPosition -1.0 –1.0 # SFVec2fminPosition 0.0 0.0 # SFVec2fisActive # eventOut SFBooltranslation_changed # eventOut SFVec3ftrackPoint_changed # eventOut SFVec3f

}

O campoenableddeste nodo tem função idêntica aquela descrita para o nodoTouchSensor, inclusive com os mesmos atributos e formas de acesso. O mesmo indicativovale para o campoisActive, que também é idêntico ao já descrito.

Quando o usuário move o cursor sobre o objeto monitorado peloPlaneSensorexisteum ponto de contato localizado em um plano imaginário sobre o qual a figura terácondições de ser animada. Este plano é chamado detrack planee orienta o seu eixo +Xpara o lado direito da tela de observação e o eixo +Y para o lado de cima da tela. A origemdeste plano e, consequentemente, do sistema de coordenadas que ele estabelece estãolocalizados sobre o objeto. Cada vez que o observador move o objeto com o botão docursor pressionado ocorre uma mudança da localização do ponto de contato em relação aoplano imaginário. Nesta situação, o novo ponto de contato é fornecido através do campoeventOuttrackPoint_changed.

Os camposautoOffset, offset, maxPositione minPosition trabalham de formaconjunta para converter o ponto de contato, originalmente no sistema de coordenadas doplano imaginário, para valores de translação (vetores 3D) que serão fornecidos através docampotranslation_changed. O valor do campoautoOffset(TRUE/FALSE) especifica se odeslocamento deverá ter ou não umoffset, ou seja, se ele tomará como referência a posiçãooriginal do objeto no mundo virtual ou a posição atual do mesmo. Se o seu valor for TRUE,os valores das translações são armazenados no campooffset que será adicionado aoresultado a ser produzido. Se o valor é FALSE, o conteúdo do campooffseté ignorado.

Page 70: Tutorial Vrml

70

Os valores do camposmaxPositione minPositionespecificam os limites máximos emínimos aceitos para as translações nos eixos X e Y do plano imaginário. O campominPositionfornece os valores mínimos para os eixos X e Y, enquanto quemaxPositionfornece os valores máximos. As condições para uso destes valores são:

• se o valor mínimo para o eixo for menor que o valor máximo, a translação, emrelação ao eixo em questão, estará limitada entre o mínimo e o máximo;

• se os valores para mínimo e máximo forem iguais, a translação estará limitada aeste valor;

• se o valor mínimo for maior do que o máximo, para um dado eixo, então atranslação não sofre qualquer restrição naquele eixo.

Os valores dos campos citados acima podem ser alterados através dos camposeventInset_autoOffset, set_offset, set_minPositione set_maxPosition. Quando os valoresdos campos forem alterados, o novo valor é produzido num dos campos a seguir,respectivos aquele onde ocorreu a alteração:autoOffset_changed, offset_changed,minPosition_changede maxPosition_changed.

6.4 Nodo SphereSensor

O nodo VRMLSphereSensorcria um sensor capaz de detectar as ações do usuárioe, a partir destas, produzir saídas em formato adequado a manipulação de figuras tal comose elas estivessem girando em torno de uma esfera. Sua sintaxe é:

SphereSensor {enabled TRUE # SFBoolautoOffset TRUE # SFBooloffset 0.0 1.0 0.0 0.0 # SFRotationisActive # eventOut SFBoolrotation_changed # eventOut SFRotationtrackPoint_changed # eventOut SFVec3f

}

Os camposenablede isActive tem a mesma função e sintaxe que foi apresentadacom o nodoTouchSensore PlaneSensor.

O valor do campoautoOffsetespecifica se a rotação calculado deverá ter um valorde rotação base. Caso ele seja TRUE, o valor calculado será adicionado ao valor do campooffsetantes de ser fornecido através do camporotation_changed. Quando oautoOffsetéFALSE, o valor do campooffsetnão é utilizado, e a saída é produzida a partir da situaçãooriginal da figura. Quando o usuário libera o botão do cursos e o campoautoOffsetéTRUE, o último valor de rotação calculado é armazenado no campooffsetpara ser utilizadona próxima operação.

Page 71: Tutorial Vrml

71

Os valores dos camposautoOffsete offset podem ser alterados pelos camposeventIn set_autoOffset e set_offset, produzindo um aviso correspondente a mudançaatravés dos campos eventOutautoOffset_changede offset_changed.

Finalmente, o campotrackPoint_changedtrabalha conforme já descrito na seçãoque trata o nodoPlaneSensor.

Assim como os demais sensores, o nodo SphereSensor pode ser utilizado como filhode qualquer grupo e monitora as ações em todas as figuras pertencentes a este grupo,inclusive aqueles que se localizam em grupos mais internos àquele onde ele está. Sua saídaé, normalmente, roteada para um nodo do tipoTransformde forma a que seja aplicada umarotação na figura desejada.

6.5 Nodo CylinderSensor

O nodo CylinderSensorcriar um sensor que atua de forma muito semelhante aosensorSphereSensor. A principal diferença entre os dois é que rotação produzida na saídaserá calculada conforme se a figura estivesse girando em torno de um cilindro, ou seja, emtorno de um único eixo que, neste caso, é o eixo Y do sistema de coordenadas do grupo paido sensor. Sua sintaxe é:

CylinderSensor{enabled TRUE # SFBooldiskAngle 0.262 # SFFloatautoOffset TRUE # SFBooloffset 0.0 # SFFloatmaxAngle -1.0 # SFFloatminAngle 0.0 # SFFloatisActive # eventOut SFBoolrotation_changed # eventOut SFRotationtrackPoint_changed # eventOut SFVec3f

}

Os camposenabled, isActive, rotation_changede trackPoint são idêntico aquelesutilizados nos sensores das seções anteriores. O mesmo acontece com os camposautoOffsete offset, exceto pelo fato que ooffset, neste caso, é composto de um único valor querepresentar o ângulo de rotação aplicado na figura na sua última ação. De qualquer forma, asua aplicação, juntamente com oautoOffseté mantida.

Os camposmaxAnglee minAngletrabalham no sentido de terminar limites máximoe mínimo para a rotação a ser aplicada às figuras monitoradas. Caso o valor mínimo sejamenor do que o valor máximo, a rotação estará limitada entre estes valores de ângulo.Quando o valor mínimo for maior do que o máximo, não haverá limite para a rotação. Seambos forem iguais, a rotação da figura ficará limitada a este valor e ela não irá girar.

Page 72: Tutorial Vrml

72

O nodo CylinderSensorconverte os movimentos do cursos sobre a figuramonitorada em rotações em torno do eixo Y do sistema de coordenadas do sensor (definidopelo seu grupo pai), conforme foi dito. Neste movimento são necessários dois tipos deconduta do sensor que dependem da posição do observador sobre a cena. A seleção entre osdois possíveis tipos é feita de acordo com o ângulo existente entre o eixo Y mencionado euma reta imaginária que parte do cursor e vai ao objeto (linha de observação) que serácomparado com o valor do campodiskAngle.

Quando o ângulo entre a linha e o eixo é menor do que odiskAngle, o observadordeve estar acima ou abaixo da figura e o sensor converte o movimento circular do cursorem uma rotação de saída. Por outro lado, quando o ângulo entre o eixo e a linha imaginariaé maior do que odiskAngle, o observador deve estar orientado na frente ou atras da figura,olhando-a perpendicularmente ao eixo. Nesta situação, o sensor deve converte omovimento do cursor de uma lado para outro em uma rotação de saída. Em ambos os casos,o valor de rotação produzido é fornecido através do camporotation_changed. Assim, é ovalor do campodiskAngleque determina ao navegador VRML a partir de que ponto eledeve determinar que o observador se encontra olhando a figura de forma inclinada ou quaseperpendicular a ela. Isto faz com que o tipo de movimento do cursos que ele precisaperceber mude.

Além dos campos mencionados, o nodoCylinderSensorpossui os campos eventInset_autoOffset, set_offset, set_minAnglee set_maxAngleque fazem com que os valores doscamposautoOffset, offset, minAnglee maxAngle, respectivamente, sejam alterados. Aresposta desta alteração vem através de um conjunto de campos eventOut que sãoautoOffset_changed, offset_changed, minAngle_changede maxAngle_changed.

As aplicações e possibilidades de utilização do nodoCylinderSensorseguem asmesmas regras e condições mencionadas para o sensorSphereSensorna seção anterior.

6.6 Exemplos

Vamos discutir agora alguns exemplos de aplicação dos sensores mencionados nestecapítulo. O exemplo 6.1 apresentar uma caixa que começa a girar em torno do seu eixo Ycada vez que o cursor for movimentado para sobre ela. Neste exemplo, o sensorTouchSensorpercebe o movimento do cursor e notifica-o através do seus campoisOver,com o sinal TRUE. Este campo (e o valor), por sua vez, é roteado para um relógio(TimeSensor) que inicia o seu funcionamento que ativará um interpolador encarregado decalcular as posições das rotações que serão aplicadas na caixa. Quando o cursor deixa acaixa, é enviado ao relógio um sinal FALSE, fazendo com que o movimento pare. Nesteexemplo, o sensor atua somente como uma espécie de “liga-desliga” do movimento dacaixa.

Page 73: Tutorial Vrml

73

#VRML V2.0 utf8

Group {

children [

DEF Cubo Transform {children Shape {

appearance Appearance {material Material {}

}geometry Box {}

}},

DEF Sensor TouchSensor {},

DEF Relogio TimeSensor {enabled FALSEcycleInterval 4.0loop 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 TO Relogio.set_enabledROUTE Relogio.fraction_changed TO CaminhoCubo.set_fractionROUTE CaminhoCubo.value_changed 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. Poroutro lado, ela fará isto somente quando o usuário clicar o cursor sobre a mesma. Nestemomento, o relógio será ativado pelo prazo de 4 segundo e a caixa, após isto, irá parar aespera de outro clique. Para fazer isto, lança-se mão do campotouchTimedo sensor que éutilizado para inicializar o campostartTimedo relógio.

Page 74: Tutorial Vrml

74

#VRML V2.0 utf8

Group {

children [

DEF Cubo Transform {children Shape {

appearance Appearance {material Material {}

}geometry Box {}

}},

DEF Sensor TouchSensor {},

DEF Relogio TimeSensor {cycleInterval 4.0

},

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.touchTime TO Relogio.set_startTimeROUTE Relogio.fraction_changed TO CaminhoCubo.set_fractionROUTE CaminhoCubo.value_changed TO Cubo.set_rotation

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

No exemplo 6.3 a caixa é transladada através de um sensorPlaneSensor. Quandoela for clicada e arrastada, irá se movimentar através de um plano alinhado com a tela deobservação. Note que não é possível deslocá-la para frente ou para trás, apenas para os ladoe para cima/baixo, exatamente onde está o plano mencionado. O exemplo 6.4 é análogo,mas estabelece valore máximo e mínimo para o deslocamento neste plano através doscamposminPositione maxPositiondo sensor, limitando a translação da caixa.

Page 75: Tutorial Vrml

75

#VRML V2.0 utf8

Group {

children [

DEF Cubo Transform {children Shape {

appearance Appearance {material Material {}

}geometry Box {}

}},

DEF Sensor PlaneSensor {}]

}

ROUTE Sensor.translation_changed TO Cubo.set_translation

Exemplo 6.3: Movimentando uma caixa com oPlaneSensor.

#VRML V2.0 utf8

Group {

children [

DEF Cubo Transform {children Shape {

appearance Appearance {material Material {}

}geometry Box {}

}},

DEF Sensor PlaneSensor {minPosition -2.0 -2.0maxPosition 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 múltiplos sensoresPlaneSensorpara fazer com quequatro caixas movimentem-se independentemente. Neste exemplo, o campooffsetde cadasensor é utilizado para marcar o valor inicial de localização de cada caixa de forma a fazê-las se movimentarem a primeira vez tendo como base a posição do desenho.

Page 76: Tutorial Vrml

76

#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 {}

}},DEF SensorBloco1 PlaneSensor {

offset 0.0 0.0 0.0}

]},

Group {

children [

DEF Bloco2 Transform {translation 2.5 0.0 0.0children Shape {

appearance Appearance {material Material {

diffuseColor 0.0 1.0 0.0}

}geometry Box {}

}},DEF SensorBloco2 PlaneSensor {

offset 2.5 0.0 0.0}

]},

Group {

children [

DEF Bloco3 Transform {translation 1.5 2.0 0.0children Shape {

appearance Appearance {material Material {

diffuseColor 0.0 0.0 1.0

Page 77: Tutorial Vrml

77

}}geometry Box {}

}},DEF SensorBloco3 PlaneSensor {

offset 1.5 2.0 0.0}

]},

Group {

children [

DEF Bloco4 Transform {translation 0.75 4.0 0.0children Shape {

appearance Appearance {material Material {

diffuseColor 1.0 0.0 1.0}

}geometry Box {}

}},DEF SensorBloco4 PlaneSensor {

offset 0.75 4.0 0.0}

]}

]}

ROUTE SensorBloco1.translation_changed TO Bloco1.set_translationROUTE SensorBloco2.translation_changed TO Bloco2.set_translationROUTE SensorBloco3.translation_changed TO Bloco3.set_translationROUTE SensorBloco4.translation_changed TO Bloco4.set_translation

Exemplo 6.5: Movimentado várias caixas com sensores diferentes.

Os exemplo 6.6 e 6.7 fazem com uma caixa e um cone girem através de sensores dotipo esfera (SphereSensor) e cilindro (CylinderSensor). O exemplo 6.6 aplica nestas figurasum sensorSphereSensorque faz com que elas girem livremente em torno de uma esferaimaginária que as contém. Já no outro exemplo, com umCylinderSensor, este movimento élimitado fazendo com que as figuras girem em torno de um eixo localizado paralelamenteao eixo Y da tela.

Page 78: Tutorial Vrml

78

#VRML V2.0 utf8

Group {children [

Group {children [

DEF Figura1 Transform {children Shape {

appearance DEF Branco Appearance {material Material {}

}geometry Box {}

}},DEF SensorFigura1 SphereSensor {}

]},

Group {children [

DEF Figura2 Transform {translation 2.5 0.0 0.0children Shape {

appearance USE Brancogeometry Cone {}

}},DEF SensorFigura2 SphereSensor {}

]}

]}

ROUTE SensorFigura1.rotation_changed TO Figura1.set_rotationROUTE SensorFigura2.rotation_changed TO 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 primeirodeles é um sensor de toque (TouchSensor) que detecta o posicionamento do cursor sobre acaixa, fazendo-a girar como no exemplo 6.1. O segundo sensor que atua sobre a caixa é umPlaneSensorque permite que ela seja levada para os lado e para cima/baixo, mesmoenquanto estiver girando.

Page 79: Tutorial Vrml

79

#VRML V2.0 utf8

Group {children [

Group {children [

DEF Figura1 Transform {children Shape {

appearance DEF Branco Appearance {material Material {}

}geometry Box {}

}},DEF SensorFigura1 CylinderSensor {}

]},Group {

children [DEF Figura2 Transform {

translation 2.5 0.0 0.0children Shape {

appearance USE Brancogeometry Cone {}

}},DEF SensorFigura2 CylinderSensor {}

]}

]}

ROUTE SensorFigura1.rotation_changed TO Figura1.set_rotationROUTE SensorFigura2.rotation_changed TO Figura2.set_rotation

Figura 6.7: Animando os objetos do exemplo 6.6 com um sensor cilíndrico.

Page 80: Tutorial Vrml

80

#VRML V2.0 utf8

Group {children [

DEF Cubo Transform {children Shape {

appearance Appearance {material Material {}

}geometry Box {}

}},

DEF Arrasto PlaneSensor {},

DEF Toque TouchSensor {},

DEF Relogio TimeSensor {enabled FALSEcycleInterval 4.0loop 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 Toque.isOver TO Relogio.set_enabledROUTE Relogio.fraction_changed TO CaminhoCubo.set_fractionROUTE CaminhoCubo.value_changed TO Cubo.set_rotationROUTE Arrasto.translation_changed TO Cubo.set_translation

Figura 6.8: Controlando um mesmo objeto com vários sensores.

Finalmente, o exemplo 6.9 apresenta uma luminária composta de elementosarticulados e com movimentação plena. Observe que cada um dos elementos desta cenapossui o seu próprio sensor e sua própria resposta de movimentação. Estes sensores sãoesféricos com exceção da base da luminária que se movimenta em um plano.

Page 81: Tutorial Vrml

81

#VRML V2.0 utf8

Group {children [

DEF MoveLampada PlaneSensor {},DEF Lampada Transform {

children [# Base da lampadaShape {

appearance DEF CorLampada Appearance {material Material {}

}geometry Cylinder {

radius 0.1height 0.01

}},# BracoGroup {

children [DEF MoveBraco1 SphereSensor {

offset 1.0 0.0 0.0 -0.7},DEF Braco1 Transform {

translation 0.0 0.15 0.0rotation 1.0 0.0 0.0 -0.7center 0.0 -0.15 0.0children [

DEF BracoLampada Shape {appearance USE CorLampadageometry Cylinder {

radius 0.01height 0.3

}},# Uniao dos dois bracosGroup {

children [DEF MoveBraco2 SphereSensor {

offset 1.0 0.0 0.0 1.9},DEF Braco2 Transform {

translation 0.0 0.3 0.0rotation 1.0 0.0 0.0 1.9center 0.0 -0.15 0.0children [

# Segundo bracoUSE BracoLampada# Juncao com quebra-luzGroup {

children [DEF MoveQuebraLuz SphereSensor {

offset 1.0 0.0 0.0 -1.25},DEF QuebraLuz Transform {

translation 0.0 0.075 0.0rotation 1.0 0.0 0.0 -1.25

Page 82: Tutorial Vrml

82

center 0.0 0.075 0.0children [

# Quebra-luzShape {

appearance USE CorLampadageometry Cone{

height 0.15bottomRadius 0.12bottom FALSE

}},# LampadaTransform {

translation 0.0 -0.05 0.0children Shape {

appearance USE CorLampadageometry Sphere {

radius 0.05}

}}

]}

]}

]}

]}

]}

]}

]}

]}

ROUTE MoveLampada.translation_changed TO Lampada.set_translationROUTE MoveBraco1.rotation_changed TO Braco1.set_rotationROUTE MoveBraco2.rotation_changed TO Braco2.set_rotationROUTE MoveQuebraLuz.rotation_changed TO QuebraLuz.set_rotation

Figura 6.9: Descrição de uma luminária com movimentação ampla.

Page 83: Tutorial Vrml

83

7Controlando a Aparência das Figuras

7.1 Introdução

É possível, em VRML, controlar a aparência de qualquer figura especificandoatributos que definem o material com o qual ela é feita. Conforme vimos, uma figura édefinida pela sua aparência e sua geometria. A aparência da figura utiliza-se dos nodosAppearancee Material. Com eles poderemos fazer estas definições que caracterizarão asfiguras apresentadas no mundo virtual. Além destes, existe ainda o nodoTextureque seráapresentado mais tarde.

Em algumas situações a definição de características físicas aos objetos não é osuficiente e elas necessitam ser variadas em um intervalo de tempo. Para estes casos asolução é dada por interpoladores semelhantes aqueles utilizados no controle da animaçãodos objetos.

A linguagem VRML dispõem de dois interpoladores que atuam em consonânciacom o controle da aparência dos objetos que são oColorInterpolatore ScalarInterpolator.O primeiro deles produz valores de cores, segundo o modelo RGB, como resultado,enquanto que o último o faz através de valores escalares.

7.2 Nodo Material

O nodo Material é o responsável, como valor do campomaterial do nodoAppearance, por definir as propriedades que caracterizarão fisicamente o objeto a eleagregado. Sua sintaxe é:

Material {diffuseColor 0.8 0.8 0.8 # SFColoremissiveColor 0.0 0.0 0.0 # SFColortransparency 0.0 # SFFloatambientIntensity 0.2 # SFFloatspecularColor 0.0 0.0 0.0 # SFColorshininess 0.2 # SFFloat

}

Page 84: Tutorial Vrml

84

Conforme já foi mencionado, o campodiffuseColor especifica a cor que seráatribuida ao objeto em questão. Os valores expressos neste campo estão de acordo com omodelo de representação de cores RGB que define um valor entre 0 (zero) e 1 (um) paracada um das componentes de cores vermelho, verde e azul. No anexo I deste textoencontra-se uma tabela com algumas cores neste modelo e os seus respectivos valores.

É possível em VRML fazer com que um objeto simule a existência de uma fonte deluz fazendo-o brilhar como esta, ou seja, simulando a emissão de luz em uma determinadacor. A existência desta emissão de luz e a sua cor são os atributos do campoemissiveColor.Em seu valor default, não há “emissão” de luz. Os valores colocados a ele também sãocores segundo o modelo RGB. Note, entretanto, que não ocorre a produção de luz, nem ailuminação de objetos nas vizinhanças. Apenas é possível fazer com que um dado objetosimule esta característica.

O campotransparency especifica o fator de transparência do objetos agregado aonodoMaterial. O valor de transparência 0.0 (zero), que é o valor default, define um objetocompletamente opaco, enquanto que um valor 1.0 (um) para a transparência irá apresentarum objeto completamente transparente. Os demais graus de transparência são valoresencontrados entre estes dois extremos. Por exemplo, para definirmos um objeto 50%transparente, o valor do campotransparencyserá 0.5, e assim por diante.

O valor do campoambientIntensitycontrola a maneira pela qual o material é afetadopelo nível de luz ambiente existente no mundo virtual. Valores altos fazem com que omaterial seja altamente afetado por esta luz, enquanto que valores baixos fazem o contrário.De qualquer forma, estes valores devem estar no intervalo 0 (zero) à 1 (um). A luzambiente é uma forma de modelarmos as quantidades de luz que chegam aos objetos deforma indireta, fazendo com que estes, mesmo que não sendo iluminados por nenhumafunte de luz, sejam vistos.

O campospecularColordefine com o material que está sendo definido se comporteem relação a reflexão especular da luz. Ela controla a polidez dos objetos, característicasacentudas em superfícies que se comportam como espelhos. De forma mais geral, estareflexão tende a agregar fortemente a cor da luz que a iluminou. Por outro lado, quando asuperfície silmular um metal, a tendência é a cor do material (diffuseColor) ganharimportância e contribuir mais fortemente para o resultado final. A cor default para estecampo é o preto (0.0 0.0 0.0) que caracteriza um material sem polidez. O contrário acontececom um valor de cor branco (1.0 1.0 1.0).

Finalmente, o camposhininesscontrola o brilho do material. O valor 0.0 (zero) paraeste campo define um objeto áspero e sem brilho enquanto que valores mais altos tornam oobjeto mais brilhante. Não há limite superior para este campo e o valor defaul caracterizaum superfície moderadamente brilhante. Note que este campo necessita trabalhar emconjunto com o campospecularColore não podem anular-se mutuamente.

Os valores dos campos mencionados acima podem ser alterados através dos camposeventIn set_diffuseColor, set_emissiveColor, set_transparency, set_ambientIntensity,

Page 85: Tutorial Vrml

85

set_specularColore set_shininess. Quando os valores são alterados, é produzida um saídaatravés dos respectivos campos eventOut:diffuseColor_changed, emissiveColor_changed,transparency_changed, ambientIntensity_changed, specularColor_changedeshininess_changed.

Maiores informação sobre conceitos e uso dos elementos dos campos do nodoMaterial para tratar a aparência de figuras podem ser encontradas em [Car98] ou em várioslivros de computação gráfica.

7.3 Nodo ColorInterpolator

O nodoColorInterpolatorproduz um série de valores de cores a serem utilizados naanimação da aparência das figuras. Sua sintaxe é:

ColorIntepolator {key [ ] # MFFloatkeyValue [ ] # MFColorset_fraction # eventIn SFFloatvalue_changed # eventOut SFColor

}

A forma de proceder deste interpolador é análoca aos intepoladoresPositionInterpolatore OrientationIntepolatorjá discutidos no capítulo 5, ou seja, sãoacionados através de um relógio que produz uma fração de tempo e respondem com umvalor em uma dada especificação. Neste caso, a resposta é constituida de uma cor nomodelo RGB.

Page 86: Tutorial Vrml

86

Anexo ITabela de Cores do Modelo RGB

Nome da Cor Red Green BlueAquamarine 0.439216 0.858824 0.576471Black 0.000000 0.000000 0.000000Blue 0.000000 0.000000 1.000000Blue violet 0.623529 0.372549 0.623529Brown 0.647059 0.164706 0.164706Cadet blue 0.372549 0.623529 0.623529Coral 1.000000 0.498039 0.000000Cornflower blue 0.258824 0.258824 0.435294Cyan 0.000000 1.000000 1.000000Dark green 0.184314 0.309804 0.184314Dark olive green 0.309804 0.309804 0.184314Dark orchid 0.600000 0.196078 0.800000Dark slate blue 0.419608 0.137255 0.556863Dark slate gray 0.184314 0.309804 0.309804Dark turquoise 0.439216 0.576471 0.858824Dim gray 0.329412 0.329412 0.329412Firebrick 0.556863 0.137255 0.137255Forest green 0.137255 0.556863 0.137255Gold 0.800000 0.498039 0.196078Goldenrod 0.858824 0.858824 0.439216Gray 0.752941 0.752941 0.752941Green 0.000000 1.000000 0.000000Green yellow 0.576471 0.858824 0.439216Indian red 0.309804 0.184314 0.184314Khaki 0.623529 0.623529 0.372549Light blue 0.749020 0.847059 0.847059Light gray 0.658824 0.658824 0.658824Light steel blue 0.560784 0.560784 0.737255Lime green 0.196078 0.800000 0.196078Magenta 1.000000 0.000000 1.000000Maroon 0.556863 0.137255 0.419608Medium aquamarine 0.196078 0.800000 0.600000Medium blue 0.196078 0.196078 0.800000

Page 87: Tutorial Vrml

87

Medium forest green 0.419608 0.556863 0.137255Medium goldenrod 0.917647 0.917647 0.678431Medium orchid 0.576471 0.439216 0.858824Medium sea green 0.258824 0.435294 0.258824Medium slate blue 0.498039 0.000000 1.000000Medium spring green 0.498039 1.000000 0.000000Medium turquoise 0.439216 0.858824 0.858824Medium violet red 0.858824 0.439216 0.576471Midnight blue 0.184314 0.184314 0.309804Navy 0.137255 0.137255 0.556863Orange 0.800000 0.196078 0.196078Orange red 1.000000 0.000000 0.498039Orchid 0.858824 0.439216 0.858824Pale green 0.560784 0.737255 0.560784Pink 0.737255 0.560784 0.560784Plum 0.917647 0.678431 0.917647Red 1.000000 0.000000 0.000000Salmon 0.435294 0.258824 0.258824Sea green 0.137255 0.556863 0.419608Sienna 0.556863 0.419608 0.137255Sky blue 0.196078 0.600000 0.800000Slate blue 0.000000 0.498039 1.000000Spring blue 0.000000 1.000000 0.498039Steel blue 0.137255 0.419608 0.556863Tan 0.858824 0.576471 0.439216Thistle 0.847059 0.749020 0.847059Turquoise 0.678431 0.917647 0.917647Violet 0.309804 0.184314 0.309804Violet red 0.800000 0.196078 0.600000Wheat 0.847059 0.847059 0.749020White 0.988235 0.988235 0.988235Yellow 1.000000 1.000000 0.000000Yellow green 0.600000 0.800000 0.196078

Page 88: Tutorial Vrml

88

Bibliografia

[ANM96] Andrea Ames, David Nadeau and John Moreland.VRML 2.0 Sourcebook, 2nd

edition. John Wiley & Sons, 1996.

[Car98] Marcos Carrard.Cor e Iluminação. Ed. Unijuí, 1998. Disponível emhttp://labinf.detec.unijui.tche.br/~carrard/artigos/cadernos/caderno05.html (emnovembro/2000).

[Ipo96] Juliano Ipólito.Tutorial VRML 1.0 . Disponível em http://www.dc.ufscar.br/~grv/vrml/tutoriais/vrml10/index.html (em agosto/2000).

[Ipo97] Juliano Ipólito. Realidade Virtual. Disponível em http://www.dc.ufscar.br/~juliano/rv/introducao.html (em agosto/2000).

[Jac94] Linda Jacobson.Realidade Virtual em Casa. Berkeley, 1994.

[Kir97] Cláudio Kirner. Sistemas de Realidade Virtual. Disponível emhttp://www.dc.ufscar.br/~grv/tutrv/tutrv.htm (em agosto/2000).

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