A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

VRML Virtual Reality Modeling Language

Apresentações semelhantes


Apresentação em tema: "VRML Virtual Reality Modeling Language"— Transcrição da apresentação:

1 VRML Virtual Reality Modeling Language
INTRODUÇÃO AO VRML Márcio Bueno 09 de maio de 2005 Atualizada por Paulo Gonçalves de Barros Baseada na apresentação de: Dênio Mariz Judith Kelner Alejandro Frery Cin/UFPE, novembro 2000 Boa tarde, pessoal. Bem, para os que ainda não sabem, meu nome é Paulo. Eu vou dar aqui uma leve introdução sobre VRML. Gostaria que todos perguntassem quando quisessem que eu responderei quando eu souber responder. Bem, vamos lá. Atualizar data de apresentação e nome do apresentador!

2 Roteiro O que é VRML Histórico Objetivos da VRML VRML, Internet e WWW
Visão geral do VRML Estrutura do Arquivo VRML Conceitos-chave Semântica dos Nós Primitivas Básicas Primitivas Avançadas Aí está o roteiro da apresentação. Nós começaremos dizendo o que é VRML. Em seguida, apresentaremos um breve histórico da linguagem. Falaremos sobre seus objetivos, como ela se relaciona com a Internet em geral. Daremos uma visão geral de como funciona ou está organizada a linguagem. Apresentaremos conceitos básicos para implementação. Daí, vou explicar como é que funcionam os nós de VRML e introduzir algumas primitivas básicas.

3 Informações Adicionais
Exercícios Transparências Dúvidas Os arquivos, tanto de exercícios quanto as transparências estarão nesse endereço aí. Se vocês tiverem dúvidas (de projeto ou não) é só mandar um ou tirar em tempo real aqui na aula mesmo. **Atualizar endereço onde os arquivos estão e para se tirar dúvidas!

4 O Que é VRML Virtual Reality Modeling Language
Suporte para RV não-imersiva VRML não suporta imersão Capacetes 3D, luvas digitais Não é exatamente "Modeling Language" Verdadeira linguagem de modelagem 3D deve prover primitivas de modelagem geométricas e mecanismos muito mais ricos O que é então ? Um formato de intercâmbio para 3D Publicação de páginas Web em 3D (~HTML 3D) Jogos, engenharia, visualização científica, experiências educacionais, arquitetura Um modelo coerente para integração de 3D, 2D, texto e multimídia VRML significa Virtual Reality Modeling Language. Ela é uma linguagem que dá suporta a RV-não imersiva., ou seja, que não suporta dispositivos de imersão, como Capacetes 3D, luvas digitais, etc. Pra quem nunca viu, nenhum desses , aqui no CIn nós temos um óculos tridimensional, apesar de que atualmente ele não está funcionando, pois a máquina na qual ele roda está sendo formatada. Se alguém tiver interesse, podemos marcar uma visita com vocês para mostrá-lo depois. Voltando a VRML, ela não é exatamente uma linguagem de modelagem pelo fato de ela ser muito simples, não provendo mecanismos para modelagem de forma mais eficiente e complexa.

5 Histórico 1989: Silicon Graphics – projeto Scenario
1992: Iris Inventor 1994: Open Inventor 1994: Labyrinth 1995: Criação e ajustes 1996: Proposta de VRML 2.0 1997: Padronização ISO Especificação "VRML97" (aka VRML2.0) 1989: Silicon Graphics – projeto Scenario Projeto e construção de infra-estrutura para aplicações gráficas 3D 1992: Iris Inventor Primeira ferramenta 3D produzida. Toolkit C++ que definiu boa parte da semântica atual de VRML 1994: Open Inventor Versão revisada do Iris Open porque era portável em várias plataformas e baseado no OpenGL (Silicon Graphics) Base para o primeiro Draft da especificação VRML 1.0 1994: Labyrinth Um browser 3D para a WWW Especificação publicada na "Second International Conference on the World Wide Web", em Chicago 1995: Os ajustes Bug fixes, melhorias Propostas para VRML 1.1 (animação, interação) 1996: Request for proposals for VRML 2.0 Muitas contribuições de peso (Silicon Graphics, Sony, Mitra...) Especificação VRML 2.0 publicada em agosto na SIGGRAPH 96, em New Orleans Julho: ISO cria comitê para adotar o VRML Committee Draft (CD) 14772 1997: Padronização ISO Especificação "VRML97" (aka VRML2.0)

6 Objetivos da VRML Modelagem de objetos 3D Internet e WWW Simplicidade
Composição de "mundos" pela hierarquia de objetos Animação, interação, multimídia formato intercambiável (várias aplicações podem ler/gravar) Internet e WWW VRML foi projetado para ser usado com a infraestrutura Internet/WWW existente Simplicidade Suporte VRML deve ser facilmente adicionado às aplicações Vários browsers (navegadores) podem e devem dar suporte Facilidade de Composição Facilidade em se "montar o todo a partir das peças" Produtividade e trabalho em grupo Auto-explicativa.

7 Objetivos da VRML Cont. Escalabilidade Otimização da performance
O navegador VRML deve operar com "mundos" distribuídos na Internet Independente da potência da máquina Mundos ajustados à performance da rede (14.4K ~ OC12) Especificação permite adições futuras Otimização da performance Algoritmos de manipulação 3D têm efeito nas ramificações agrupadas Se algo não puder ter performance, então não fará parte da especificação Versões futuras Interação entre vários usuários Criaturas autônomas que podem sentir e reagir no ambiente Auto-explicativa.

8 VRML, Internet e WWW Navegadores suportam VRML através de plug-ins
Arquivos VRML podem referenciar vários outros formatos JPEG, PNG, GIF, MPEG podem ser usados para compor a textura de objetos WAV, MIDI podem ser usados para sons emitidos pelo ambiente ou por objetos Arquivos com código Java ou JavaScript podem ser referenciados para implementar comportamento de objetos VRML permite hiperlinks Organizações que definem esses padrões Exemplo: World Wide Web Consortium (W3C) padronizou um "tag" HTML (<OBJECT>) que permite embutir VRML, Java, ou outros tipos de arquivos em documentos HTML. A definição de como VRML deve ser usada com outros padrões é geralmente feita pelas organizações que definem esses padrões Exemplo: World Wide Web Consortium (W3C) padronizou um "tag" HTML (<OBJECT>) que permite embutir VRML, Java, ou outros tipos de arquivos em documentos HTML.

9 VRML, Internet e WWW cont.
Existem várias maneiras de combinar VRML ,JAVA e HTML: Arquivo VRML dentro de um arquivo HTML: Usando o tag <OBJECT> Código Java dentro de arquivo VRML: Faz parte do padrão VRML (mas é de implementação opcional) Bibliotecas de Classes Java correspondentes aos nós VRML: Para implementação de ferramentas VRML (ex: VRML browsers) Mecanismos ainda não padronizados ou implementados Applet Java conversando com browser VRML Arquivo HTML dentro de arquivo VRML Ex: arquivo HTML como uma textura de um objeto 3D Applet Java dentro de um arquivo VRML: Ex: applet Java como uma textura de um objeto 3D Auto-explicativa.

10 VRML: O Que Falta Formato binário para VRML Compressão
Código VRML não tem proteção Padrão ainda não definido Compressão Já se usa compressão – padrão gzip (taxa média 5:1) Formato binário poderia aumentar compressão (10:1, 50:1) Suporte multiusuário Protótipos em andamento Formato binário para VRML Código VRML não tem proteção Padrão ainda não definido, propostas em discussão

11 Visão Geral do VRML Estrutura Gráfica da Cena
VRML descreve "mundos" (worlds) usando uma cena gráfica hierárquica Entidades na cena são chamados "nós" (nodes). VRML 2.0 define 54 tipos de nós: Primitivas geométricas Propriedades de aparência, som Agrupamento de nós Nós armazenam seus dados (atributos) em "campos" (fields). VRML 2.0 define 20 tipos de campos (números, arrays) Nós podem conter outros nós. Alguns nós podem ter "filhos" (children) Alguns nós podem ter mais de um "pai“ Um nó não pode conter a si mesmo (recursividade). Criação de "mundos" complexos ou objetos a partir de subpartes Tal estrutura de nós permite permite criar "mundos" complexos ou objetos a partir de sub-partes

12 Visão Geral do VRML cont.
Arquitetura de Eventos Mecanismo de geração de eventos permite que os nós da cena se comuniquem entre si. Cada tipo de nó define os nomes e tipos de eventos que podem ser gerados ou recebidos Sensores Sensores são as primitivas básicas de animação e interação com o usuário. O nó "TimeSensor" gera eventos com o passar do tempo e é a base para todos os comportamentos animados. Outros sensores geram eventos quando o usuário se movimenta através da cena ou quando interage através de algum dispositivo de entrada. Sensores geram apenas eventos. Eles devem ser combinados com outros nós para ter qualquer efeito visual na cena. Auto-explicativa.

13 Visão Geral do VRML cont.
Scripts e Interpoladores Scripts permitem ao autor da cena definir comportamentos arbitrários, usando qualquer linguagem suportada. VRML 2.0 define conexões para linguagens Java e JavaScript Nós "Script" podem ser inseridos entre geradores de eventos (sensores) e recebedores. Interpoladores são scripts embutidos que executam animações. Eles podem ser combinados com "TimeSensor" e algum nó da cena para fazer objetos se moverem. Encapsulamento e Reuso Geometria, propriedades, animações ou comportamento podem ser encapsulados separadamente ou junto da cena. Permite a definição de um novo tipo de nó a partir da combinação de tipos existentes de nós Biblioteca de objetos 3D Facilidade de uso, trabalho em equipe Reduz tamanho de arquivos Auto-explicativa.

14 Visão Geral do VRML cont.
Cenas Distribuídas VRML 2.0 inclui duas primitivas que permitem que a definição de uma cena possa ser distribuída independentemente. O nó "Inline" permite a inclusão de outra cena armazenada em outro arquivo – em qualquer lugar da Web. O comando "EXTERNPROTO" permite que definições de novos nós possam ser acessados de qualquer lugar da Web. É o mecanismo básico que estende o VRML. Auto-explicativa.

15 Visão Geral do VRML cont.
Modelo Conceitual de um Browser VRML A figura mostra o modelo conceitual de um VRML Browser. O browser é retratado como uma aplicação de apresentação que aceita entradas do usuário na forma de arquivos de manipulação e navegação através de um dispositivo de entrada. Os três componentes principais do browser são: Parser, Scene Graph e Audio/Visual presentation. O componente Parser lê os arquivos VRML e cria a Scene Graph . O componente Scene Graph consiste em agregar todos os objetos e organizar sua hierarquia. O componente Scene Graph também é responsável por processar os eventos do usuário. Por último o componente Audio/Visual Presentation exibe a saída para o usuário dos objetos renderizados do Scene Graph.

16 Estrutura do Arquivo VRML
Arquivos VRML têm extensão .wrl (world) Cabeçalho (obrigatório) Cena Definição dos objetos gráficos Contém os nós (nodes) que descrevem objetos e suas propriedades Objetos podem ter geometria hierarquicamente agrupada para prover representações áudio -visuais complexas. Protótipos Extensões de nós VRML definidos externamente pelo usuário Eventos Definições dos eventos associados aos objetos Alguns conceitos básicos da estrutura de VRML.

17 Estrutura do Arquivo VRML
Cabeçalho Primeira linha do arquivo Identifica o arquivo como VRML e informa o tipo de codificação usada #VRML V2.0 <encoding type> [comment] <line terminator> Apenas um caractere de espaço entre os componentes do cabeçalho <encoding type> é "utf8" Existem outras codificações autorizadas pelo VRML 2.0 "utf8" indica texto livre (padrão UTF-8 da ISO , RFC2044) Também conhecido como Unicode ;-) Aqui temos a definição do cabeçalho do arquivo, essencial a todo arquivo vrml. #VRML V2.0 utf8 Gerado por Maria da Silva

18 Estrutura do Arquivo VRML
# inicia um comentário Apenas o 1º comentário tem significado (cabeçalho) Caracteres NÃO permitidos para nomes Primeira letra: " ' # , . [ ] \ {} 0x0-0x20 Restante: " ' # , . [ ] \ {} 0x0-0x20 Palavras reservadas DEF, EXTERNPROTO, FALSE, IS, NULL, PROTO, ROUTE TO, TRUE, USE, eventIn, eventOut, exposedField, field VRML é sensível a maiúsculas e minúsculas "Sphere" é diferente de "sphere" "BEGIN" é diferente de "begin" Vale ressaltar esses tópicos quando vocês estiverem codificando seus mundos virtuais: Comentários são feitos linha a linha através do uso do caractere #; Alguns caracteres são permitidos estarem em nomes de nós. São eles: Primeira letra: " ' # , . [ ] \ {} 0x0-0x20 Restante: " ' # , . [ ] \ {} 0x0-0x20 Algumas palavras são reservadas e não devem ser utilizadas como nomes. São elas: DEF, EXTERNPROTO, FALSE, IS, NULL, PROTO, ROUTE, TO, TRUE, USE, eventIn, eventOut, exposedField, field VRML é sensível a maiúsculas e minúsculas

19 Conceitos-chave: Unidades de Medida
Radianos foi escolhido por compatibilidade com o padrão da linguagem C (math library routines) Conversão graus radianos: Radianos = .graus / 180 Tempo é expresso como um double-precision floating point (precisão nano-segundos) Categoria Unidade Distância linear Metros Ângulos Radianos Tempo Segundos Cores RGB ([0., 1.], [0., 1.], [0., 1.]) As unidades padrão para VRML são: Para distância linear: metros; Para ângulos: radianos; Para tempo: segundos; Para cores: RGB, que consiste num conjunto de três números variando de 0 a 256 e que representam seqüencialmente valores de vermelho, verde e azul. Isso será melhor explicado mais à frente.

20 Conceitos-chave: Nó Sintaxe da declaração do Nó
[DEF <name>] <nodeType> { <body> } Nome opcional Tipo do nó Corpo do nó O [DEF <name>] permite usar o nó depois referenciando o nome com o comando USE (ex.: USE <name>) Não precisa de espaço separando { } e [ ] Exemplo: Box { size } Aqui temos a declaração de um nó. Um nó não precisa ter um nome definido para si. Entretanto, esses nomes são muito úteis para reutilizar um mesmo nó em diferentes locais do mundo. **Observação: não é possível modificar uma reutilização de um nó (gerada a partir do comendo USE), pois esse é uma cópia do nó original e não um novo objeto que herda suas características. Além disso, se você modificar o objeto original, todas as suas cópias também serão modificadas.

21 Conceitos-chave: Campo
Sintaxe da declaração de um campo: <fieldName> <fieldValue> <fieldName> [ <fieldValues> ] Exemplos: radius 0.1 height 20 colorIndex [ ] coordIndex [ , , ] Existem dois tipos de declaração de campo: A primeira basicamente é a escrita do nome do campo seguido de seu(s) parâmetro(s) separados por espaço(s) O segundo consiste na escrita do nome do campo seguidos de valores entre colchetes e separados ou não pro vírgulas. Observe os exemplos.

22 Conceitos-chave: Campo cont.
Tipos de Campo SFBool TRUE/FALSE SFColor 3 valores float entre 0 e 1 (RGB). Ex.: MFColor lista de valores SFColor. Ex.: [ , 1 0 0] SFFloat 1 valor float. Ex.: MFFloat lista de valores float. Ex.: [1.2, 3.5, 7, 9.5] SFInt32 & MFInt32 inteiro de 32bits & lista SFNode & MFNode nó & lista de nós SFRotation 4 valores float: 3 primeiros: vetor-eixo de rotação 4º: ângulo de rotação em radianos MFRotation lista de SFRotation Aqui temos tipos de campo. Coloquei aqui como forma de consulta rápida para vocês, mas não entrarei e muitos detalhes. Consultem na Internet para saber mais sobre cada um desses tipos: SFBool valor booleano (TRUE/FALSE) SFColor 3 valores float entre 0 e 1 (RGB). Ex.: MFColor lista de valores SFColor. Ex.: [ , 1 0 0] SFFloat 1 valor float. Ex.: MFFloat lista de valores float. Ex.: [1.2, 3.5, 7, 9.5] SFInt32 & MFInt32 inteiro de 32bits & lista (representação pode ser feita em decimal ou hexadecimal. Números hexadecimais começam com 0x. Ex.: 0xFF é 255 em decimal) SFNode & MFNode nó & lista de nós SFRotation 4 valores float: 3 primeiros representam vetor que define eixo de rotação Último representa ângulo de rotação em radianos MFRotation lista de SFRotation

23 Conceitos-chave: Campo cont.
Tipos de Campo SFString string de characteres utf-8. Ex.: “Eu” MFString lista de SFStrings. E.x: [“Eu”, “Tu”, “Ele”] SFTime & MFTime: tempo (float) & uma lista de tempos. Exs.: , [ , 9.8] SFVec2f vetor 2D. Ex.: MFVec2f lista de vetores 2D. Ex.: [ , ] SFVec3f vetor 3D. Ex.: MFVec3f lista de vetores 3D. Ex.: [ , ] Continuando com os tipos de campo, temos: SFString string de caracteres utf-8. Ex.: “Eu” MFString lista de SFStrings. E.x: [“Eu”, “Tu”, “Ele”] SFTime & MFTime: tempo (float) & uma lista de tempos. Um tempo é representado por um valor float que corresponde ao número de minutos passados de meia noite de 1º de Janeiro de 1970. SFVec2f vetor 2D. Um vetor 2D é basicamente um par de valores float. Ex.: MFVec2f lista de vetores 2D. Ex.: [ , ] SFVec3f vetor 3D. Um vetor 3D é basicamente um trio de valores float. Ex.: MFVec3f lista de vetores 3D.Ex.: [ , ]

24 Conceitos-chave: Campo cont.
Tipos de Campo SFImage imagem bidimensional colorida ou em tons de cinza. 2 inteiros: largura e altura da imagem 1 inteiro: número de componentes de cor: 1 para tons de cinza 2 para tons de cinza com transparência 3 para RGB 4 para RGB com transparência N números hexadecimais (N = largura da imagem x altura da imagem) para a cor dos pixels. Ex.: Tons de cinza: 0X00 (cor preta) RGB com transparência: 0x00FF007F (verde semi-transparente) SFImage imagem bidimensional colorida ou em tons de cinza. Consiste de: Dois números inteiros representando seqüencialmente a largura e a altura da imagem Um número inteiro representando o número de componentes de cor da imagem: Valor igual a 1 para imagem em tons de cinza apenas Valor igual a 2 para imagem em tons de cinza com transparência Valor igual a 3 para imagem em RGB Valor igual a 4 para imagem em RGB com transparência N números hexadecimais (N = largura da imagem x altura da imagem), com dois dígitos para cada componente de cor, descrevendo cada um a cor de um pixel da imagem. A ordem de definição dos pixels da imagem se dá da direita para a esquerda e de baixo para cima.

25 Conceitos-chave: Eventos
São notificações de mudança no valor de algum campo Tipos EventOut eventos que geram informação EventIn aceitam e utilizam informação externa (EventOut) Campos Exposed possuem EventIn e EventOut próprios Outro conceito importante é conceito de eventos Os nos podem se comunicar entre si através da geração e captação de eventos. Eventos são, então, notificações de mudança no valor de algum campo passados e recebidos de um nó para outro. Os tipos de evento são: EventOut eventos que geram informação EventIn aceitam e utilizam informação externa (EventOut) Alguns nós possuem campos que são do tipo exposed. Isso significa que o nó tem dois eventos já definidos para esse campo: set_nomeDoCampo (representando o EnventIn desse campo, servindo para receber novos valores para si) e nomeDoCampo_changed (representando o EnventOut desse campo, servindo para notificar o mundo externo sobre sua mudança de valor). Para facilitar o uso, não é necessáriao se referir a esses eventos com o prefixo set_ e sufixo _changed. Basta usa o nomeDoCampo e o navegador distinguirá qual dos dois eventos está sendo utilizado. Somente campos Exposed podem ser modificados por exemplo (ver ).

26 Conceitos-chave: Rotas
Efetuam a transmissão de informação entre eventos Ex.: tocar um som quando o mouse for clicado Definir nomes únicos para os objetos cujos eventos serão ligados DEF SENSOR TouchSensor { } DEF SOUND Sound { } Conectar campos através do comando Route ROUTE SENSOR.touchTime TO SOUND.startTime Se houver objetos com mesmo nome, todos serão afetados! Sensor EventOut TouchTime Sound EventIn StartTime Route Para que os eventos sejam transmitidos, é necessário criar-se canais de comunicação entre eles. Esse canais são chamado de routes (que em inglês significa rotas). Eles irão ligar eventos de saída a eventos de entrada , assim efetuar a comunicação de mudança de valores entre campos de nós. Para criar-se um rota precisa se ter bem-definidos o local do campo de EventOut e o de EventIn. Ou seja, cada nó tem que ter um nome único no código para identificá-lo. Observe o exemplo. Criar nós com mesmo nome e com campos EventIn (fan out) fará com que esses campos desses nós recebam um mesmo EventOut – equivalente a um broadcast. Entretanto, Criar nós com mesmo nome e com campos EventOut (fan in) fará com que todos os EventOut gerados por esse campos desses nós vão para um mesmo EventIn (fan in). Isso pode gerar problemas de colisão entre os eventos gerados. Nesse caso, um controle de tempo de eventos tem que ser feito.

27 Conceitos-chave: Sistema de Coordenadas
VRML usa sistema Cartesiano 3D +X para a direita, -X para a esquerda +Y para cima, -Y para baixo +Z para perto, -Z para longe Z X Y O sistema de coordenada de VRML é baseado na regrada mão direita,como mostrado na figura, onde a palma da mão fica de frente para a pessoa. O y positivo aponta para cima, o x positivo aponta para a direita e o z positivo aponta para fora do monitor.

28 Conceitos-chave: Cores
Sistema RGB Cada cor básica é representada por número decimal de 0 até 1 A cor é montada combinando as 3 cores básicas Para montar a cor desejada, mapeie as cores básicas [0, 255] --> [0,1] Aqui está como funciona o sistema de cores em VRML. Ele é baseado num sistema RGB aditivo. Ou seja, cada cor é definida por 3 valores de 0 a 256: o primeiro para o vermelho, o segundo para o verde e o terceiro para o azul. Ele é aditivo por que a soma das cores nos fornece o branco ao invés do preto. Em resumo, é similar à adição de luzes de diferentes cores e não como quando se compõe cores diferentes com o lápis de cor. A tabela ao lado mostra algumas cores resultantes de valores atribuídos ao sistema RGB aditivo.

29 Primitivas VRML Primitivas Básicas Primitivas Avançadas Atenção:
Nas páginas a seguir, a especificação dos nós VRML não contém, necessariamente, todos os atributos e opções. Por motivos didáticos, apenas as principais características foram selecionadas para discussão. Para uma referência completa dos nós VRML, veja a especificação da ISO em: Vamos passar agora para o estudo das primitivas em VRML. Antes de começar, entretanto gostaria de observar que a especificação dos nós VRML que eu darei aqui não contém todos seus atributos e opções. Por motivos didáticos, apenas as principais características foram selecionadas para discussão. Se vocês quiserem mais informações sobre cada nó, recomendo que procurem na Web ou sigam esse endereço.

30 Primitivas Básicas Shape { } Geometry Appearance Box Cone Cylinder
ElevationGrid Extrusion IndexedFaceSet IndexedLineSet PointSet Sphere Text Appearance material texture textureTransform } As primitivas básicas que veremos nessa aula são as que estão destacadas em verde.

31 Box Box { size 2 2 2 } x y z defaults Centro = ( 0, 0, 0 )
O campo size indica as dimensões das arestas do paralelepípedo seqüencialmente nos eixos x, y e z.

32 Box Valores default: 2 2 2 Aparência: cor vermelha #VRML V2.0 utf8
Shape { geometry Box {} appearance Appearance { material Material { diffuseColor 1 0 0 } Valores default: 2 2 2 Aparência: cor vermelha Aqui temos a definição da aparência do paralelepípedo dentro dele. Para tanto foi definido o nó appearance e, dentro dele, o nó material. O atributo de definição da cor é o DiffuseColor Sempre que se deseja atribuir cor a um objeto, deve-se inserir os nós appearance e material.

33 Sphere Sphere { radius 1 } Raio default Centro = ( 0, 0, 0 )
Auto-explicativa.

34 Sphere Raio default: 1 Aparência: cor verde #VRML V2.0 utf8 Shape {
geometry Sphere {} appearance Appearance { material Material { diffuseColor 0 1 0 } Raio default: 1 Aparência: cor verde A cor é definida da mesma forma que para o paralelepípedo. Isso acontece para todos os objetos.

35 Cone Cone { bottomRadius 1 height 2 side TRUE bottom TRUE }
O nó cone possui quatro campos: bottomRadius: define o raio da base do cone e recebe valores inteiros (0, 1, 2) ou reais (0.2, 3.7) Height: define a altura do cone e recebe valores inteiros (0, 1, 2) ou reais (0.2, 3.7) Side: valor booleano que diz se os polígonos que definem a lateral do cone devem aparecer Bottom: valor booleano que diz se os polígonos que definem a base do cone devem aparecer

36 Cone Valores default Aparência: cor azul #VRML V2.0 utf8 Shape {
geometry Cone {} appearance Appearance { material Material { diffuseColor 0 0 1 } Valores default Aparência: cor azul A cor é definida da mesma forma que para o paralelepípedo. Isso acontece para todos os objetos.

37 Cylinder Cylinder { bottom TRUE height 2 radius 1 side TRUE top TRUE }
O nó cone possui quatro campos: Radius: define o raio das bases do cilindro e recebe valores inteiros (0, 1, 2) ou reais (0.2, 3.7) Height: define a altura do cilindro e recebe valores inteiros (0, 1, 2) ou reais (0.2, 3.7) Side: valor booleano que diz se os polígonos que definem a lateral do cilindro devem aparecer Bottom: valor booleano que diz se os polígonos que definem a base inferior do cilindro devem aparecer Top: valor booleano que diz se os polígonos que definem a base superior do cilindro devem aparecer

38 Cylinder Valores default Aparência: cor magenta #VRML V2.0 utf8
Shape { geometry Cylinder {} appearance Appearance { material Material { diffuseColor 1 0 1 } Valores default Aparência: cor magenta A cor é definida da mesma forma que para o paralelepípedo. Isso acontece para todos os objetos.

39 Lista de Exercícios Lista 1 Transparências comentadas!! Referências
Prazo: próxima aula Utilizem VRMLPad! Transparências comentadas!! Referências Floppy’s VRML 97 Tutorial: Web 3D Consortium – VRML Archives Atualizar local onde a lista se encontra e data de entrega!

40 VRML Virtual Reality Modeling Language
PRIMITIVAS BÁSICAS E AVANÇADAS Márcio Bueno 10 de novembro de 2004 Atualizada por Paulo Gonçalves de Barros Baseada na apresentação de: Dênio Mariz Judith Kelner Alejandro Frery Cin/UFPE, novembro 2000 Boa tarde, pessoal. Bem, para os que ainda não sabem, meu nome é Paulo. Eu vou continuar aqui as aulas de VRML a partir do que vimos na aula passada. Sendo assim, os que perderam, dançaram. Terão que se virar com as transparências disponíveis na minha conta, cujo endereço eu lhes mostrarei daqui a pouco. **Atualizar data de apresentação e nome do apresentador!

41 Roteiro O que é VRML Histórico Objetivos da VRML VRML, Internet e WWW
Visão geral do VRML Estrutura do Arquivo VRML Conceitos-chave Semântica dos Nós Primitivas Básicas Primitivas Avançadas Aí está o roteiro da apresentação. Percebam que, hoje, para a felicidade de vocês que a aula de hoje será bastante prática. Portanto, vocês terão de prestar atenção aula do começo ao fim, diferentemente da aula passada. Ou seja, sem sono, por favor. O conteúdo da aula será um tanto extenso, mas, acredito eu, bastante interessante. Terminaremos de abordar as primitivas básicas e uma parte das primitivas avançadas.

42 Informações Adicionais
Exercícios Transparências Dúvidas Lembrando mais uma vez: os arquivos, tanto de exercícios quanto as transparências estarão nesse endereço aí. Se vocês tiverem dúvidas (de projeto ou não) é só mandar um ou tirar em tempo real aqui na aula mesmo. **Atualizar endereço onde os arquivos estão e para se tirar dúvidas!

43 Primitivas Básicas e Avançadas
Shape { Geometry Box Cone Cylinder ElevationGrid Extrusion IndexedFaceSet IndexedLineSet PointSet Sphere Text Appearance material texture textureTransform } Group Transform Viewpoint Anchor Inline Proto Extern Proto WorldInfo Background Panorama Fog IndexedFaceSet IndexedLineSet PointSet Extrusion Elevation Grid Billboard Bem aqui está o assunto da aula: já vimos as quatro primitivas em cinza na aula passada e agora veremos os tópicos em verde, começando pela primitiva Text juntamente com a fontStyle. Em seguida veremos em detalhe o nó material, o qual vimos vagamente na aula passada. Também como parâmetro do nó Appearance, será visto o nó Texture que permitirá aplicar texturas ou imagens às faces de um objeto. Daí, veremos os nós na segunda coluna em verde, as primeiras primitivas avançadas. Geralmente, essa aula é dada em duas partes: a primeira, onde são abordadas as primitivas básicas e a segunda com as primitivas avançadas, intercaladas por exercícios. Eu, entretanto, preferi deixar todos os exercícios para o final e dar logo toda a teoria, como forma de garantir a finalização do conteúdo da aula sem prejuízo nenhum, acredito eu, para vocês, uma vez que vocês terão as transparências para consultar. Text fontStyle

44 Text Text { string [] fontStyle NULL maxExtent length [] maxExtent 0.0
} Posição inicial Z = 0 fontstyle é outro nó que especifica detalhes do fonte usado length indica o tamanho (pode encolher ou alargar a apresentação do string) maxExtent maxExtent Começando pelo nó Text, a função dele é bastante óbvia: adicionar texto em mundos tridimensionais. O seu campos são: A string à qual ele irá apresentar na tela; O tipo de fonte utilizada (três estilos no total); O tamanho da fonte sendo apresentada O limite máximo de uma linha de texto (quando o texto está na horizontal) ou coluna de texto quando ele é escrito na vertical. Se o texto for maior que o comprimento máximo, então o tamanho das fontes é reduzido.

45 fontStyle fontStyle { family "SERIF" horizontal TRUE justify "BEGIN"
language "" leftToRight TRUE topToBottom TRUE size spacing style "PLAIN" } Para compor o campo de estilo da fonte, temos: Family: define a família a fonte, pode ser de três tipos: “SERIF”, “SANS”, “TYPEWRITER”; Horizontal: define se o texto será na horizontal ou na vertical Justify: Define o modo como o texto é justificado, podendo assumir os valores: “FIRST”, “BEGIN” (valor padrão), “MIDDLE” e “END”. Language: campo para ajudar na identificação dos caracteres sendo utilizados no texto (ver ISO 639 e ISO 3166) LefToRight: define se o texto é escrito da direita para a esquerda ou vice-versa (TRUE); TopToBottom: define se o texto é escrito de baixo para cima ou vice-versa (TRUE); Size: altura dos caracteres em unidades de VRML (valor padrão igual a 1); Spacing: espaçamento entre linhas horizontais ou caracteres na vertical; Style: define o estilo do texto, cujos valores podem ser:”PLAIN” (valor padrão), “BOLD”, “ITALIC” e “BOLDITALIC”.

46 Text fontStyle Opcional Esquerda para a direita
#VRML V2.0 utf8 gerado por denio Shape{ geometry Text { string "VRML is Easy!" length 30 fontStyle FontStyle { family "VERDANA" horizontal TRUE justify "BEGIN" language "" leftToRight FALSE size spacing style "BOLD" topToBottom TRUE } fontStyle Opcional Esquerda para a direita Aqui vocês podem ver um exemplo de código que define um nó texto e a sua visualização no navegador.

47 Aparência dos Objetos Appearance material texture textureTransform
Vamos agora seguir para o nós utilizados em Appearance, começando pelo Material que indica a cor da superfície de uma forma (shape) e depois partindo para o texture que define a variação de cores na superfície de um Shape.

48 Material Material { } ambientIntensity diffuseColor transparency
emissiveColor shininess specularColor transparency } ambientIntensity Indica com que intensidade o objeto deve refletir a luz do ambiente diffuseColor a cor que o objeto emite transparency Grau de transparência (0=opaco, 1=transparente) #VRML V2.0 utf8 Shape { geometry Cylinder {} appearance Appearance { material Material { diffuseColor 1 0 1 } O nó Material define as características do material que compõe virtualmente um objeto. São elas: AmbientIntensity: intensidade de reflexão de luz pelo objeto (único valor entre 0 e 1) DiffuseColor: define a cor do material objeto EmissiveColor: define a cor da luz que o objeto emite Shininess: define o brilho do material que compõe o objeto SpecularColor: Indica a cor da luz do brilho refletido pelo material do objeto Transparency: define o grau de transparência do material que compõe o objeto

49 Aparência dos Objetos Appearance material texture textureTransform
Vamos agora falar do nó texture.

50 Texture texture ImageTexture { } url [] repeatS TRUE repeatT TRUE
url = aponta para um arquivo JPEG, PNG, GIF repeatS = repete na horizontal (FALSE=distorce) repeatT = repete na vertical (FALSE=distorce) No campo texture, nós só vamos estudar um dos possíveis nós que podem ser passados como parâmetro que é o ImageTeture. Existem outros como o PixelTexture e MovieTexture, mas não falaremos neles aqui. Bem, os campos pertencentes ao ImageTexture são esses três aí: A URL ou endereço onde a imagem a ser aplicada na superfície do objeto está; RepeatS: Indica se a imagem deve ser repetida na horizontal ou se deve ser esticada para cobrir toda a superfície do objeto nesse mesmo sentido; RepeatT: Indica se a imagem deve ser repetida na vertical ou se deve ser esticada para cobrir toda a superfície do objeto nesse mesmo sentido.

51 Texture Arquivo com a textura #VRML V2.0 utf8 Shape {
geometry Sphere {} appearance Appearance { texture ImageTexture { url ”jupiter.jpg” } Arquivo com a textura Aqui temos um exemplo de aplicação de textura a um objeto e o código que foi empregado.

52 Primitivas Avançadas Group Transform Viewpoint Achor Inline WorldInfo
Background Vamos, agora, tratar das primitivas avançadas.

53 Group Group { children [ nó interno ] }
Agrupa nós formando uma hierarquia Podemos usar DEF para nomear e usar depois #VRML V2.0 utf8 DEF GRUPO1 Group { children [ Shape {geometry Sphere {} } Shape {geometry Box {} } Shape {geometry Cone {} } ] bboxSize bboxCenter addChildren removeChildren } O Group, como o próprio nome diz, serve para agrupar vários objetos num único nó. Isso é muito útil quando queremos reutilizar esse grupo em algum outro local do nosso mundo virtual. Os vários objetos que compõem o grupo são inseridos entre os colchetes do campo children um embaixo do outro (sem separação por vírgulas). Quando existe apenas um nó dentro do children, não é necessário se colocar os colchetes. Existem outros campos que não recomendo que vocês se preocupem com eles: BboxSize: define o tamanho da caixa de contorno capaz de envolver todos os objetos do grupo(os valores padrão são -1 o que indica o cálculo automático pelo plug-in do tamanho dessa caixa); BboxCenter: define o centro dessa caixa de contorno (o valor padrão é a origem); AddChildren: campo de evento para adição de novos nós no grupo; RemoveChildren: : campo de evento para remoção de novos nós no grupo.

54 Transform Transform { children [ ] rotation 0 0 1 0 scale 1 1 1
translation } children pode conter vários nós Transformações afetam todos os filhos rotation: indicar o eixo e o ângulo eixo X = 1 0 0, eixo Y = 0 1 0, eixo Z = 0 0 1 scale: uma escala em cada eixo (scale>0) translation: usado mover objetos nos eixos translation > X=X+20 translation > X=X, Y=Y-1, Z=Z-10 Aqui nós temos o nó Transform, que irá efetuas transformações no espaço tridimensional. Os campos básicos desse nó são: Children: contém os objetos que sofrerão as alterações definidas por esse nó; Rotation: define um mudança de rotação nos objetos (três primeiros campos para seleção do vetor que define o eixo em volta do qual o objeto será rodado - x,y ou z - e o último campo indicando a rotação em radianos) Scale: define a escala do objeto relativa a seu tamanho original em cada uma dos três eixos. Translation: mudança de posição do objeto em relação à sua posição original. É bom lembrar que você pode aninhar num mesmo objeto quantas transformações forem necessárias, permitindo-lhe com que seja possível qualquer tipo de posicionamento. Isso ocorre por conta dessas transformações serem feitas relativas ao nó ou conjunto de nós passados como parâmetro em Children, sejam esses nós Transforms ou não. Existem ainda outros campos nesse nó, mas, como no nó Group, esses são de menos importância e eu preferi deixá-los fora das transparências. São eles: ScaleOrientation, BboxSize, BboxCenter, Center, AddChildren e RemoveChildren. Recomendo uma busca na Internet para mais informações.

55 Transform Criando objetos em um lugar desejado
Mudando a posição inicial do centro (0, 0, 0) #VRML V2.0 utf8 Transform { translation children [ Shape { geometry Sphere {} } ] } Aqui temos um exemplo de transformação: uma translação em todos os eixos. Pela regra da mão direita, em que direção em relação à origem essa esfera vai andar? Ela irá andar para cima e para a direita, além de se aproximar mais do observador.

56 Transform Rotacionando objetos #VRML V2.0 utf8 DEF CONE Shape {
geometry Cone { height 3 } appearance Appearance { material Material { diffuseColor 0 0 1 } Transform { # 180 graus em X rotation translation children USE CONE Aqui nós temos um exemplo de rotação. Observe que eu defini um objeto normal sem rotação alguma e, posteriormente, repliquei-o uma vez e fiz uma rotação nessa cópia no eixo x de 180º.

57 Viewpoints O nó Viewpoint descreve a posição, a orientação e o campo de visão para a observação de uma cena. Por default, o observador entra no mundo na posição (0.0, 0.0, 10.0). Com o nó Viewpoint podem ser especificados: novas posições de entrada do observador no mundo VRML vistas especiais para o observador nomes para a vistas Viewpoints podem ser transformados com o nó Transform O browser mostra um menu com a lista dos viewpoints definidos Vamos agora, definir pontos de vista para o mundo que criamos. Para isso devemos definir, para cada ponto –de -vista, uma orientação, posição e campo de visão para o observador. A posição inicial padrão do observador é 0 ,0 , 10. Em outras palavras, viewpoints são pontos –de -vista pré-definidos no mundo para auxiliar a navegação do observador no mesmo. Eles podem ser, ainda, afetados pelo nó Transform, da mesma forma que os outros nós em VRML. Além, disso, a lista de viewpoints aparece no browser (navegador), através da interface do plug-in, para que o observador possa interagir com eles.

58 Viewpoints cont. Viewpoint { orientation 0 0 1 0 position 0 0 10
description ”descrição" } orientation = orientaçao do campo de visao Mesma interpretaçao do “transform/rotation” position = a posiçao do observador description = um nome para o viewpoint No browser, a sintaxe ".../scene.wrl#ViewpointName" especifica o viewpoint inicial do usuário, após carregar a cena que contém: DEF ViewpointName Viewpoint {...} set_bind fieldOfView jump bindTime isBound Aqui nós temos a descrição básica de um viewpoint. Os campos principais são: Orientation: orientação do ponto-de-vista ( valor padrão igual a ); Position: posição do ponto-de-vista ( valor padrão igual a ); Description: sentença descrevendo o ponto-de-vista (Ex.: Vista aérea da entrada direita da Rua do Bom Jesus). Existem ainda outros campos nesse nó, mas, como nos nós Group e Transform, esses são de menos importância e eu preferi deixá-los fora das transparências. São eles: FielOfView, Jump, Set_bind, IsBound e BindTime. Recomendo uma busca na Internet para mais informações. Para definir o ponto-de-vista inicial do observador, deve-se utilizar a seguinte vista aí na linha de endereço do navegador. Eu, particularmente, não tentei isso ainda. Se vocês conseguirem, avisem-me por favor.

59 Adicionano Links parameter bboxSize bboxCenter Anchor { children []
description “descricao do link" url “url de destino” } Adiciona um link para um outro arquivo com em HTML URL: Um arquivo qualquer Internet “ Disco local “../obj.wrl”, “obj.wrl” parameter bboxSize bboxCenter #VRML V2.0 utf8 #Link de saida Anchor{ children [ Shape { geometry Sphere{} } ] description “sair” url “../../index.htm” Para se adicionar um link a seu mundo, utiliza-se o nó anchor. Ele funciona da mesma forma que um link em HTML. Os principais campos dele são: Children: onde se põe os objetos que representarão o link no mundo. Description: contendo um texto descritivo do link que aparecerá em alguma parte do navegador ao se passar o mouse sobre o objeto que possui o link. url: o destino do link. Existem outros parâmetros nesse nós como esses mostrados aí ao lado, mas não consideraremos eles aqui. Os interessados podem buscar mais informações na Web. O link pode ser feito a um arquivo qualquer, a um outro mundo virtual ou página Web e o endereço um endereço local ou não e relativo ou não.

60 Reusando Objetos Inline { url “nome” }
Incorpora objetos já construídos URL: Um arquivo qualquer Internet “ Disco local “../obj.wrl”, “obj.wrl” #VRML V2.0 utf8 #Eixos Inline { url "../coord.wrl" } Shape { geometry Sphere {} } Aqui, temos o comando para importação de outros arquivos VRML dentro de seu mundo. O principal campo dele o URL, onde você define o endereço do arquivo a ser inserido no seu mundo. Os outros dois campos (BboxCenter e BboxSize) são de menos importância. Da mesma forma que os outros nós, o nó Inline também pode sofrer transformações e, conseqüentemente, ser passado como parâmetro para campos como Children.

61 Reusando Objetos cont. #VRML V2.0 utf8 by David R. Nadeau
Inline { url "table.wrl" } # Cadeiras Transform { translation children DEF Chair Inline { url "chair.wrl" } } translation rotation children USE Chair translation rotation translation rotation X+ Z+ Y+ Aqui está um exemplo de utilização do comando Inline. Uma mesa e uma cadeira foram criados em arquivos diferentes e importados para compor a cena. Observe, também, o reuso do objeto cadeira.

62 Reusando e Modificando Objetos
PROTO nome [tipoAcesso tipo parâmetro1 valor] { objetoPrototipado { campoParametrizado IS parâmetro1 } Incorpora objetos já construídos e faz modificações através da passagem de valores internamente à nova cópia do objeto Mas, não existe nenhuma forma de eu criar um novo nó baseado em outro nó? Sim, existe. Ele não resolve todos os problemas de herança, mas já é alguma coisa. A idéia é criar um objeto em que alguns campos são configuráveis quando uma nova cópia daquele nó é criada. Dessa forma, uma cópia daquele objeto pode ser criada com valores diferentes em seus campos.

63 Reusando e Modificando Objetos cont.
Exemplo #VRML V2.0 utf8 #Criação de protótipo PROTO myBox [ field SFColor boxColour ] { Shape { appearance Appearance { material Material { diffuseColor IS boxColour } geometry Box { } #Caixa em vermelho: uso do valor padrão do parâmetro Transform {translation children myBox { }} #Caixa com nova cor passada como parâmetro Transform {translation 2 0 0 children myBox { boxColour }} Pode-se ver aqui um exemplo de utilização desse nó. Criou-se um objeto, nesse caso um Box, cuja cor pode ser passada como parâmetro. Logo abaixo, são criadas duas cópias do objeto. A primeira delas usa a cor pré-definida no nó PROTO, ficando com cor vermelha. A segunda especifica a sua nova cor (verde) como parâmetro.

64 Reusando e Modificando Objetos Externos
EXTERNPROTO nomeNo [tipoAcesso tipo parâmetro1 valor] [“possivelLocalizacao1NoProto”, “possivelLocalizacao2NoProto”] } Incorpora objetos já construídos externamente e faz modificações através da passagem de valores internamente à nova cópia do objeto Localizações alternativas da definição do objeto Não precisa definir os valores de campo padrão Com o nó externo proto é possível referenciar nós proto criados em outro locais, estando na mesma máquina, em outras na mesma rede ou até mesmo na Internet. Para tanto, deve-se saber o endereço onde a definição do objeto PROTO se encontra e referenciar os campos que são passados como parâmetro no mesmo. É possível dar mais de um endereço de localização para o arquivo, a fim de garantir encontrar o arquivo em ao menos local, em caso de falha na rede. Os valores padrão para cada um dos campos passados como parâmetro não precisa ser explicitados no EXTERNPROTO.

65 Reusando e Modificando Objetos Externos
Exemplo1: Arquivo somente com nó PROTO de myBox e único endereço de localização: Exemplo2: Arquivo com vários nós PROTO (incluindo o de myBox) e vários possíveis endereços de localização: #VRML V2.0 utf8 #Criação de protótipo EXTERNPROTO myBox [ field SFColor boxColour] “protoMyBox.wrl” #Caixa em vermelho: uso do valor padrão do parâmetro Transform {translation children myBox { }} #Caixa com nova cor passada como parâmetro Transform {translation 2 0 0 children myBox { boxColour } } #VRML V2.0 utf8 #Criação de protótipo EXTERNPROTO myBox [ field SFColor boxColour] [“protoMyBox.wrl#myBox”, “ #Caixa em vermelho: uso do valor padrão do parâmetro Transform {translation children myBox { }} #Caixa com nova cor passada como parâmetro Transform {translation 2 0 0 children myBox { boxColour }} Temos aqui dois exemplos de uso do nó EXTERNPROTO. O primeiro deles apresenta um exemplo simples em que o arquivo onde o nó PROTO do objeto myBox só possui o header VRML e a definição de PROTO de myBox. Além disso, esse arquivo só possui um único endereço de localização que foi apresentada fora de colchetes (por ser só uma) ao final da definição de EXTERNPROTO. Já no segundo exemplo, além de termos mais de uma possível localização do arquivo onde o PROTO de myBox se encontra (agrupados por [] e separados por vírgula), temos que indicar com que nome o PROTO de myBox é identificado nesses arquivos, passando seu nome, precedido por um #, logo após cada endereço do arquivo.

66 Lista de Exercícios Lista 2 Transparências comentadas!! Referências
Prazo: próxima aula Utilizem VRMLPad! Transparências comentadas!! Referências Floppy’s VRML 97 Tutorial: Web 3D Consortium – VRML Archives Bem, a segunda lista de exercícios se encontra no mesmo local da primeira. Quem ainda não fez primeira, é bom fazer. É claro que eu não vou deixar de aceitar a lista de alunos entregues fora do prazo. Contudo, todos os dias de entrega de listas e informações das mesmas estão sendo anotados, guardados e serão repassados para a professora Judith. Quão útil esses dados serão para ela na avaliação de vocês, ninguém sabe, né? O prazo da lista é para a próxima aula, de forma semelhante à primeira lista. Boa sorte. As transparências se encontram comentadas. Algumas contêm informações extras que podem ser de utilidade para vocês durante a resolução da lista. **Atualizar endereço onde os arquivos estão e data de entrega!

67 VRML Virtual Reality Modeling Language
PRIMITIVAS AVANÇADAS I Márcio Bueno 17 de novembro de 2004 Atualizada por Paulo Gonçalves de Barros Baseada na apresentação de: Dênio Mariz Judith Kelner Alejandro Frery Cin/UFPE, novembro 2000 Boa tarde, pessoal. Bem, para os que ainda não sabem, meu nome é Paulo. Eu vou continuar aqui as aulas de VRML a partir do que vimos na aula passada. Sendo assim, os que perderam, dançaram. Terão que se virar com as transparências disponíveis na minha conta, cujo endereço eu reapresentarei daqui a pouco. **Atualizar data de apresentação e nome do apresentador!

68 Roteiro O que é VRML Histórico Objetivos da VRML VRML, Internet e WWW
Visão geral do VRML Estrutura do Arquivo VRML Conceitos-chave Semântica dos Nós Primitivas Básicas Primitivas Avançadas Aí está o roteiro da apresentação. Apenas, continuaremos a ver primitivas avançadas. A aula provavelmente será mais curta que o normal, deixando bastante tempo para vocês adiantarem as listas atrasadas e fazer a lista número 3.

69 Informações Adicionais
Exercícios Transparências Dúvidas Márcio (masb) Lembrando mais uma vez: os arquivos, tanto de exercícios quanto as transparências estarão nesse endereço aí. Se vocês tiverem dúvidas (de projeto ou não) é só mandar um ou tirar em tempo real aqui na aula mesmo. **Atualizar endereço onde os arquivos estão e para se tirar dúvidas!

70 Primitivas Básicas e Avançadas
Shape { Geometry Box Cone Cylinder Sphere Text Appearance material texture textureTransform } Group Transform Viewpoint Anchor Inline Proto Extern Proto WorldInfo Background Panorama Fog IndexedFaceSet IndexedLineSet PointSet Extrusion Elevation Grid Billboard Bem aqui está o assunto da aula mais detalhadamente. Já vimos todos os tópicos em cinza. O textureTransform, nós não veremos, mas, caso vocês tenham interesse em saber como funcionam, passarei alguns links no fim da aula. O que veremos serão apenas os dois tópicos em verde. São eles as primitivas avançadas: WorldInfo; Background; Panorama; Fog; IndexedFaceSet; IndexedLineSet; PointSet; Extrusion; Elevation Grid; Billboard. Text fontStyle

71 Informações Gerais do Mundo
WorldInfo { title “nome" info [“info1" “info2"] } Contém informações gerais Título para aparecer na barra de título da janela do navegador Outras informações relevantes do mundo #VRML V2.0 utf8 #Informações do Mundo WorldInfo { title "Meu mundo Virtual" info [ "(C)Copyright 2004 Eu" ] } Para se colocar informações gerais sobre o seu mundo, deve-se utilizar o nó WorldInfo. Ele é equivalente ao tag TITLE em HTML, disponibilizando um campo para modificar o título que aparece na janela do navegador e para se colocar informações de copyright, data de produção do arquivo, como foi produzido, etc. É possível se ter mais de um nós WordInfo em seu mundo. Entretanto, apenas o primeiro encontrado será processado pelo parser VRML. Os outros serão ignorados. Equivalente a tag TITLE em HTML Pode se ter mais de um nó WorldInfo só o primeiro é processado pelo parser VRML

72 Backgrounds Modifica o pano de fundo da cena Background {
skyColor [ ] skyAngle [] groundColor [] groundAngle [] } Informações básicas Por último, temos o nó que permite editar o pano de fundo de sua cena. Os principais campos são: skyColor: define cor(es) do background do céu; skyAngle: define ângulos entre os backgrounds do céu; groundColor:: define cor(es) do background da terra; groundAngle: define ângulos entre os backgrounds da terra; Existem ainda outros campos nesse nó, mas, como nos nós Group, Transform e Viewpoint, esses são de menos importância e eu preferi deixá-los fora das transparências. São eles: BackUrl, BottomUrl, FrontUrl, LeftUrl, RightUrl, TopUrl, Set_bind e Bind_changed. Recomendo uma busca na Internet para mais informações. Informações básicas sobre esse nó podem ser encontradas nesse endereço da Homepage da disciplina. **Atualizar endereço onde os arquivos estão!

73 Backgrounds N cores implica N-1 ângulos Céu Chão #VRML V2.0 utf8
Primeira cor (2ª cor) (3ª cor) #VRML V2.0 utf8 Background { skyColor [0 0 1, , 1 0 0] skyAngle [1.31, 1.57] groundColor [1 0 0, , ] groundAngle [1.31, 1.57] } Céu Para cada par de cores temos um único ângulo dividindo a semi-esfera que representa o céu ou o chão. A figura ilustra, então, uma relação de N cores para n-1 ângulos separando suas áreas de abrangência. Abaixo, temos um exemplo de um céu e chão construídos utilizando esse nó. Chão

74 Panoramas Cubo envolvendo o usuário com planos de fundo Background {
MFString backUrl [] MFString bottomUrl [] MFString frontUrl [] MFString leftUrl [] MFString rightUrl [] MFString topUrl [] } bottomUrl leftUrl frontUrl rightUrl backUrl topUrl É possível criar um panorama mais realista a seu mundo. Isso é feito através da criação de um cubo de texturas ao redor do usuário. Para tanto também se utiliza o nó background. A cada um dos campos acima será referenciado uma textura seguindo a lógica da figura apresentada. O usuário jamais alcançará o panorama, estando sempre situado em seu centro.

75 Panoramas Combinação de campos de background
Panorama com cor de transparência Cores de fundo #VRML V2.0 utf8 Background { skyColor [0 0 1, , 1 0 0] skyAngle [1.31, 1.57] groundColor [1 0 0, , ] groundAngle [1.31, 1.57] backUrl "ceuLateral.gif" frontUrl "ceuLateral.gif" rightUrl "ceuLateral.gif" leftUrl "ceuLateral.gif" bottomUrl "grass.jpg" topUrl "ceuTop.png" } Não utilizar cores de fundo se não houver transparência no panorama Abaixo, temos um exemplo de um céu e chão construídos utilizando Um panorama.

76 Neblina Fog { SFColor color 0 0 0 SFString fogType "LINEAR"
SFFloat visibilityRange 0 } Fornece o efeito de neblina Restringe o campo de visão do usuário Diminui processamento gráfico do mundo O nó FOG permite adicionar neblina a seu mundo virtual. O primeiro campo se refere à cor da neblina. O segundo descreve a intensidade com que ela obscurece os objetos. Os valores para esse campo são LINEAR (linearmente proporcional à distância do objeto) ou EXPONENTIAL (exponencialmente proporcional à distância do objeto – mais realista). O terceiro campo descreve uma distância do usuário a partir do qual qualquer objeto não é mais visto. Se esse campo for posto pra zero, a neblina não afeta a visibilidade de nenhum objeto. Definir um valor para o campo visibilityRange pode ser muito importante para mundos grandes, pois, definindo-o, os objetos que não estiverem dentro do campo de visibilidade não são renderizados isso diminui a carga computacional do mundo.

77 Objetos sem appearance e material não são afetados
Panoramas Objetos sem appearance e material não são afetados Fog da mesma cor do background! #VRML V2.0 utf8 Fog { color 0 0 0 fogType "EXPONENTIAL" visibilityRange 50 } Shape { geometry Box{} appearance Appearance { material Material { diffuseColor 1 1 1 É importante salientar que um objeto sem appearance e material não é afetado pelos efeitos da neblina. Além disso, é interessante que as cores escolhidas no nó Background sejam condizentes com a escolhida para a neblina, pois, uma vez que o background não é afetado pela neblina, ele ter uma cor diferente gerará efeitos muito estranhos (à medida que se afasta de um objeto, ele fica de uma cor que difere do plano de fundo do mundo). Aqui temos um exemplo de uso do nó FOG. Observe que pelo fato de não temos um nó background, a neblina foi coloca a cor preta para condizer com a cor padrão preta apresentada no fundo. Além disso, observe que o objeto tem que possuir o nó appearance e material para ser afetado pela neblina, mesmo que se deseje colocar a cor branca nele.

78 Objetos Com Faces Planas - IndexedFaceSet
coord Coordinate { point [ ] } NULL coordIndex [] color NULL colorIndex [] solid TRUE convex TRUE ccw TRUE } set_coorIndex set_texCoordIndex set_colorIndex set_normalIndex normal NULL texCoord NULL colorPerVertex TRUE creaseAngle normalIndex [] normalPerVertex TRUE texCoordIndex [] IndexedFaceSet possui esses campos aí apresentados. Aqui só veremos os campos em verde. Uma explicação básica dos alguns dos outros campos se encontra em:

79 IndexedFaceSet Construindo Figuras irregulares x Hexágono  = 60o
sen() = cos() = Plano = ABCDEF B=(-5, 8.66, 0) A=(5, 8.66, 0) C=(-10, 0, 0) F=(10, 0, 0) x A construção de figuras utilizando esse nó se dá pela definição de faces através dos seus vértices e, a partir daí, de objetos tridimensionais a partir dessas faces. O exemplo acima dá um exemplo de como o processo de construção de uma face acontece. A face hexagonal regular é definida por um conjunto de 6 pontos situados no espaço tridimensional. D=(-5, -8.66, 0) E=(5, -8.66, 0) Y

80 IndexedFaceSet Coord Coordinate { point [ <pontos 3D>] }
Define as coordenadas 3D dos vértices Vértices serão referenciados por coordIndex coordIndex Especifica as faces poligonais, indexando as coordenadas contidas em coord Um índice "-1” indica o fim da definição da face Os N vértices de coord devem ser indexados de 0 a N-1 Cada face definida deve ter: Pelo menos 3 vértices (não-coincidentes) Vértices que definam um polígono plano Vértices que definam um polígono sem auto-interseção Exemplo: coord Coordinate { point [ 1 1 0, , , ] } coordindex [ 0, 1, 2, 3, -1 ] A face é formada pelos vértices 0, 1, 2 e 3 Explicando melhor os campos contido no IndexedFaceSet, temos: coord: Define as coordenadas 3D dos vértices. Cada vértice definido aqui pode ser referenciado externamente em outros campos através de seu índice de definição dentro dessa coordenada. Por exemplo, o primeiro vértice definido dentro de coordIndex terá índice 0, o segundo terá índice 1 e assim por diante. Vale destacar o uso do objeto Coordinate durante a definição do valor desse campo. Esse nó só possui essa lista, além de dois outros campos para receber e enviar eventos de entrada de pontos na sua lista. CoordIndex: definirá faces poligonais utilizando os vértices definidos em coord. Observe o exemplo. Veja que foram definidos 4 vértices em coord. Em coordIndex,esses vértices são compostos seqüencialmente (primeiro o vértice de índice 0, depois o vértice de índice 1, até o de índice 3) formando uma face quadrada no plano XY centrada na origem. Observe que, após a definição da face, um -1 é colocado para identificar o fim da composição daquela face. Outra face poderia ser definida logo a seguir, colocando-se uma vírgula após o -1 e recomeçando a definição de coordenadas.

81 IndexedFaceSet Convex Solid CCW Define se o polígono é convexo ou não
Valor inicial: TRUE Solid Define se as duas faces de um polígono serão mostradas CCW Define a relação entre a ordem de criação dos vértices e a face que deve ser mostrada (ou a normal da face apresentada). Valor padrão: TRUE (sentido anti-horário) Exemplo: As faces devem ser convexas, de forma a não gerar problemas em VRML. Caso a criação de faces não-convexas (côncavas?) seja necessária, o campo convex deve ser colocado para FALSE de forma que VRML se encarregará de processar a face não-convexa em sub-faces convexas para que possa ser renderizada corretamente. O campo solid define se um polígono deve ter seus dois lados criados (valor igual a FALSE) ou não (para TRUE). Outro detalhe importante de ser dito é o de que as faces devem ter seus vértices criados no sentido anti-horário da posição(sentido de eixo) no qual se deseja ver o polígono. No caso de ele só possuir uma única face, isso é importante para que o polígono possa ser visto e facilmente localizado pelo observador de sua posição inicial. Essa ordem de criação de vértices pode ser invertida através do campo ccw (Counter Clock-Wise), cujo valor inicial é true (definindo a ordem anti-horária como padrão).

82 IndexedFaceSet cont. color colorIndex colorPerVertex
Define cores a serem referenciados por colorIndex colorIndex Indica as cores para cada face Deve manter a ordem colorPerVertex Exemplo: Suponha objeto com 5 faces: # define 3 cores color Color { color [ 1 0 0, , ] } # define a cor de cada face colorIndex[ 0, 0, 1, 2, 1 ] Aqui estão os campos que definirão as cores das faces de seu objeto. O campo color define uma lista de cores que serão utilizadas nas suas faces do objeto tridimensional sendo criado. O colorIndex conterá as cores que serão aplicadas a cada uma das faces criadas, de forma seqüencial (melhor explicado no exemplo apresentado). O colorPerVertex indica se as cores serão definidas face à face (FALSE) ou vértice à vértice (TRUE). O valor padrão para esse campo é TRUE. Observem o exemplo. Temos uma lista de três cores (referenciadas de 0 a 2) no campo color. Já no campo colorIndex, temos as cores das faces definidas e organizadas seqüencialmente de acordo com o índice de cada um das faces. Cor 0 Cor 1 Cor 2 ... Face 1 Face 2 Face 5

83 IndexedFaceSet cont. #VRML V2.0 utf8 by Beatriz Castier et al
Inline { url "../coord.wrl" } #Eixos Shape { # Desenho do cubo geometry IndexedFaceSet { coord Coordinate { point [ # vértices do cubo , , , , , , , ] } coordIndex [ # Faces do cubo 2, 3, 7, 6, -1, 0, 1, 5, 4, -1, # plano ZY 0, 4, 7, 3, -1, 1, 2, 6, 5, -1, # plano ZX 0, 3, 2, 1, -1, 4, 5, 6, 7, -1, # plano XY color Color {color [ 1 0 0, 0 1 0, ] } colorPerVertex FALSE colorIndex [ 0, 0, 1, 1, 2, 2, -1 Vértice 0 Vértice 7 Face 1 Aqui temos um exemplo de utilização dessa primitiva através da criação de um cubo com faces coloridas em três cores (verde, azul e vermelho). Primeiro ele define os 8 vértices. Em seguida, as faces compostas por esse vértices. Após isso ele define a lista de cores que serão utilizadas nas faces do objeto e por fim as aplica seqüencialmente nas suas faces. Face 6 Cor 0 Cor 2 Cor da face 1 Cor da face 6

84 Criando Linhas - IndexedLineSet
coord Coordinate { point [ ] } NULL coordIndex [] color NULL colorIndex [] colorPerVertex TRUE } Desenha Linhas Permite criar objetos em wireframe Linhas sem colisão set_coordIndex set_colorIndex Um nó semelhante ao IndexedFaceSet é o IndexedLineSet, que permite a criação de linhas no mundo. Iremos abordar os campos em verde. Os destacados em cinza na caixa lateral não serão tratados aqui. Esse nó é muito utilizado na criação de objetos em wireframe. As linhas criadas não são afetadas pela detecção de colisão de forma que o usuário não deve se preocupar em desviar delas enquanto navega.

85 Criando Linhas - IndexedLineSet
#VRML V2.0 utf8 Shape{ geometry IndexedLineSet { coord Coordinate { point [0 0 0, 1 1 0,-1 0 0, ,1 -1 0, 1 0 1, ] } color Color {color [1 0 0, 0 1 0, 0 0 1]} coordIndex [ ] colorIndex [ ] colorPerVertex TRUE } } #VRML V2.0 utf8 Shape{ appearance Appearance { material Material { emissiveColor } } geometry IndexedLineSet { coord Coordinate { point [0 0 0, 1 1 0,-1 0 0, ,1 -1 0, 1 0 1, ] coordIndex [ ] } } Aqui temos dois exemplos de utilização do IndexedLineSet. O primeiro mapeia para cada um dos pontos uma cor específica (observem que o colorPerVertex está ativado). Caso ele estivesse desativado, seria colocada na linha a cor definida para o primeiro ponto. O segundo exemplo mapeia a cor do objeto baseado no nó emissiveColor dentro de appearance. Isso acontece pelo fato do nó IndexedLineSet não ter definido campos de cor. Caso esses campos estivessem definidos, eles teriam prioridade sobre o emissiveColor e o último não teria efeito nenhum sobre as linhas.

86 Criando Pontos - PointSet
coord [ , 1 1 1] color [1 0 1, ] } Desenha Pontos Pontos sem colisão #VRML V2.0 utf8 Shape{ geometry PointSet { coord Coordinate { point [0 0 0, 1 1 0,-1 0 0, ,1 -1 0,1 0 1, ] } color Color { color [1 0 0, 0 1 0, 0 0 1, 1 0 1, 1 1 0, 0 1 1, ] Um nó semelhante ao IndexedLineSet, permite a criação de pontos no mundo. Os pontos criados não são afetados pela detecção de colisão de forma que o usuário não deve se preocupar em desviar deles enquanto navega. Da mesma forma que com o IndexedLineSet, a cor dos pontos pode ser criada tanto a partir de valores no campo de cor do PointSet como baseada nos valores do campo emissiveColor, seguindo a mesma regra do nó IndexedLineSet.

87 Terrenos – ElevationGrid
MFFloat height [] SFBool solid TRUE SFInt32 xDimension 0 SFFloat xSpacing 0.0 SFInt32 zDimension 0 SFInt32 zSpacing 0.0 } Criação de terrenos irregulares Matriz de alturas de pontos homogeneamente distribuídos set_height color normal texCoord ccw colorPerVertex creaseAngle normalPerVertex solid Essa primitiva permite a criação de terrenos irregulares. Para tanto, ela possui uma estrutura com um certa dimensão (xDimension, zDimension) composta por um conjunto de pontos homogeneamente distantes entre si (distância entre eles definida em xSpacing e zSpacing) que interligado, comporão o relevo desejado. Para variar altura do relevo, alterar-se-á a altura de cada um dos pontos através do campo height. Por fim, o relevo poderá ser suas duas faces renderizadas se o campo solid for colocado para FALSE.

88 Terrenos – ElevationGrid
Ordem dos pontos: Percurso do eixo x da esquerda para a direita a partir de –z (mais distante) #VRML V2.0 utf8 Shape { appearance Appearance { texture ImageTexture { url "grass.jpg" } geometry ElevationGrid { xDimension 6 zDimension 6 xSpacing 5.0 zSpacing 5.0 height [ 0, 0, 3, 4, 4, 0, 0, 2, 4, 5, 4, 2, 0, 0, 1, 4, 3, 1, 0, 1, 2, 3, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0] y x z x A ordem dos pontos na matriz segue a seguinte regra: o primeiro ponto representa a extremidade mais negativa nos eixos x e z, ou seja, é o ponto mais distante e mais à esquerda do usuário. Os pontos apresentados na matriz são colocados percorrendo-se o eixo x da esquerda para a direita com saltos de xSpacing metros entre eles até se completar uma linha de xDimension pontos no plano z=0. Daí parte-se para a próxima seqüência de pontos em z=x*zSpacing, x=1. Quando x for igual a zDimension+1, o processo pára. As figuras lustram melhor a ordem de percurso. z y

89 Extrusão - Extrusion Extrusion { beginCap TRUE ccw TRUE convex TRUE
crossSection [ 1 1, 1 -1, -1 -1, -1 1, 1 1 ] endCap TRUE orientation scale 1 1 solid TRUE spine [ 0 0 0, ] } set_spine set_crossSection set_scale set_orientation creaseAngle A próxima primitiva é a de extrusão, cujas propriedades podem ser vistas. Os campo em cinza já foram falados anteriormente para a primitiva IndexedFaceSet. Aqui eles têm funções parecidas, só que aplicadas à forma ou face utilizada para extrusão. Os campos em verde serão os realmente descritos nos próximos slides. Existem outros campos (os listados à direita) que são de menor importância para o desenvolvimento de modelos básicos e não serão descritos aqui.

90 Extrusion Cont. Extrusion constrói objetos baseados em um plano-base 2D alongado perpendicularmente através de uma "espinha". O plano-base é chamado "cross-section". O "cross-section" é definido no plano XZ. O eixo "espinha" é chamado "spine". O "spine" define o caminho que o "cross-section" irá percorrer para formar o objeto 3D. O "spine" é indicado por vários pontos 3D. O plano cross-section pode sofrer mudanças de escala e rotações a cada ponto do spine. Uma explicação básica de como o Extrusion funciona é dada nesse slide.

91 Extrusion Cont. Etapas: Defina o cross-section Defina o spine
Defina escalas para cada ponto do spine Defina rotações Extrusão consiste num processo de passar alguma massa por um buraco de uma forma específica de maneira que a massa obtenha a forma do buraco pelo qual passou. É um processo semelhante ao utilizado para se confeitar um bolo de aniversário, onde se tem formas de estrelas, flores, etc. para se confeitar o bolo. Outro processo onde extrusão ocorre é num tubo de pasta de dente ao apertá-lo para fazer com que a pasta saia. Aqui, vamos pegar um polígono (forma para extrusão) e fazê-lo seguir um caminho específico. Esse caminho pode ser uma única reta ou um conjunto de retas. Durante o caminho poderemos mudar a orientação e escala da face da forma que preferirmos, compondo o objeto 3D ao longo de sua formação.

92 Extrusion Cont. #VRML V2.0 utf8 Shape { appearance Appearance {
material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 -1] spine [0 -1 0, 0 0 0, ] orientation [ , , ] scale [1 1, 1 1, 1 1] Aqui temos um primeiro exemplo de extrusão: a formação de um cubo. Observe a espinha com 3 pontos e a rotação e a orientação invariantes para esses mesmos 3 pontos. extrusao-1.wrl

93 Extrusion Cont. #VRML V2.0 utf8 Shape { appearance Appearance {
material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 -1] spine [ , 0 0 0, ] orientation [ , , ] scale [1 1, 1 1, 1 1] solid FALSE beginCap FALSE endCap FALSE } } Aqui são apresentados os campos solid (como em IndexedFaeSet) e dos campos de ativação das duas faces inicial e final da extrusão. Os dois últimos funcionam como o bottom e top do nó Cylinder, fazendo aparecer ou não as faces nas extremidades do objeto tridimensional. extrusao-2.wrl

94 Extrusion Cont. #VRML V2.0 utf8 Shape { appearance Appearance {
material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 –1 ] spine [ , ] # escala no ponto final orientation [ , ] scale [1 1, ] Nesse exemplo, a face de extrusão sofre mudança de escala ao longo de seu percurso, transformando a forma final de uma caixa para um tronco de pirâmide. extrusao-3.wrl

95 Extrusion Cont. #VRML V2.0 utf8 Shape { appearance Appearance {
material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 –1 ] spine [ , ] # rotacao no ponto final orientation [ , ] scale [1 1, 1 1 ] Já nesse exemplo a face de extrusão sofre uma rotação de 180 graus durante o percurso, fazendo com que a forma final se torne uma caixa torcida em torno do eixo y. extrusao-4.wrl

96 Extrusion Cont. #VRML V2.0 utf8 Shape { appearance Appearance {
material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 –1 ] spine [ , ] # escala e rotacao no ponto final orientation [ , ] scale [1 1, ] Aqui temos uma aplicação tanto da mudança de orientação quanto da mudança de escala da face de extrusão. extrusao-5.wrl

97 Extrusion Cont. #VRML V2.0 utf8 Shape { appearance Appearance {
material Material { diffuseColor # azul } } # SPINE DE 3 PONTOS geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 -1] spine [ , 0 0 0, ] # rotacao no plano final do spine (45 graus) orientation [ , , ] scale [1 1, 1 1, 1 1] Aqui uma rotação apenas em um dos pontos da espinha de 3 pontos. extrusao-6.wrl

98 Extrusion Cont. #VRML V2.0 utf8 Shape { appearance Appearance {
material Material { diffuseColor # azul } } # SPINE DE 3 PONTOS geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 -1] spine [ , 0 0 0, ] # rotacao no spine médio de 45 graus # rotacao no spine final de 90 graus orientation [ , , ] scale [1 1, 1 1, 1 1] } } Mais um exemplo de mudança de orientação. Dessa vez, a orientação é mudada duas vezes numa espinha de 3 pontos. extrusao-7.wrl

99 Extrusion Cont. #VRML V2.0 utf8 Shape { appearance Appearance {
material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 -1] spine [ , 0 0 0, ] # rotacao no spine médio de 45 graus # rotacao no spine final de 0 graus orientation [ , , ] scale [1 1, 1 1, 1 1] } } Mais um exemplo com duas rotações, onde a segunda rotação desfaz a rotação da primeira. extrusao-8.wrl

100 Extrusion Cont. #VRML V2.0 utf8 Inline { url "eixo_colorido.wrl" }
Shape { appearance Appearance { material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 -1] # spine no PLANO XZ spine [ , , 2 0 2, , ] Criação de uma porca quadrada, deitada no plano XZ, através da criação de uma espinha quadrada. extrusao-9.wrl

101 Extrusion Cont. #VRML V2.0 utf8 Inline { url "eixo_colorido.wrl" }
Shape { appearance Appearance { material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 -1] # spine no PLANO YZ spine [ , , 0 2 2, , ] A mesma rosquinha, só que deitada no plano YZ. extrusao-10.wrl

102 Extrusion Cont. #VRML V2.0 utf8 Inline { url "eixo_colorido.wrl" }
Shape { appearance Appearance { material Material { diffuseColor # azul } geometry Extrusion{ crossSection [ -1 -1, -1 1, 1 1, 1 -1, -1 -1] # spine no PLANO XY spine [ , , 2 2 0, , ] A mesma rosquinha, só que deitada no plano XY. extrusao-11.wrl

103 Extrusion Cont. #VRML V2.0 utf8 Inline { url "eixo_colorido.wrl" }
Shape { appearance Appearance { material Material { diffuseColor # azul } geometry Extrusion{ ccw FALSE spine [ , ] crossSection [ 1 0, , 0 1, , -1 0, , 0 -1, , 1 0 ] Aqui temos a criação de uma forma semi-cilíndrica através da extrusão de um octaedro. extrusao-12.wrl

104 Extrusion Cont. #VRML V2.0 utf8 Inline { url "eixo_colorido.wrl" }
Shape { appearance Appearance { material Material { diffuseColor # azul } geometry Extrusion{ ccw FALSE crossSection [ 1 0, , 0 1, , -1 0, , 0 -1, , 1 0 ] spine [2 0 0 , , 0 0 2, , , , , , ] Por fim, a criação de um donut através da extrusão desse mesmo octaedro através de uma espinha ou caminho em forma de octógono. extrusao-13.wrl

105 Bilboard Billboard { addChildren removeChildren axisOfRotation 0 1 0
children [ nó interno ] bboxCenter 0 0 0 bboxSize } A última primitiva é a Billboard. Ele permite criar objetos que estejam sempre virados para o usuário como, por exemplo, placas informativas. Aqui veremos apenas dois de seus campos: AxisOfRotation: responsável pro definir o eixo em torno do qual o objeto irá rodar para seguir o usuário (se você definir ele com o valor 0 0 0, Ele girará em torno dos três exiso simultaneamente!). Children: define os objetos que irão compor o billboard

106 Billboard Cont. Billboard constrói objetos que fiquem sempre virados para o usuário que navega no mundo. Garante efeito tridimensional utilizando-se objetos bidimensionais. Exemplo: árvores. Ajuda na redução o número de polígonos da cena. Uma explicação básica de como o Billboard funciona e para que lee serve é dada nesse slide.

107 Billboard Cont. Etapas: Precauções
Definir objeto a ser aplicado Billboard Definir eixo de rotação do Billboard Inserir o objeto como children do nó Billboard Precauções Posicionar face correta do objeto para frente do usuário Em caso de uso de imagem, aplicar cor de transparência Formato PNG é recomendado O GIF também pode ser utilizado Aqui estão as três simples etapas para se construir um Billboard, bem como algumas recomendações: Tenha cuidado ao criar o objeto de forma que ele tenha a face correta virada para frente do usuário Em caso de utilização de imagens para gerar objetos planos, lembre-se de utilizar formatos que permitam transparência, como o PNG e o GIF.

108 Bilboard Billboard { addChildren removeChildren axisOfRotation 0 1 0
#VRML V2.0 utf8 Billboard { axisOfRotation children [ Transform { scale Shape { appearance Appearance { texture ImageTexture {url "arvore.png"} } geometry IndexedFaceSet { coord Coordinate { point [ , , , , ] coordIndex [ 0, 1, 2, 3 ] solid FALSE } #The VRML 2.0 Sourcebook ] #Copyright (c) 1997 } #Andrea L. Ames, David R. Nadeau, and John L. Moreland Billboard { addChildren removeChildren axisOfRotation 0 1 0 children [] bboxCenter 0 0 0 bboxSize } Nesse exemplo, temos uma imagem de árvore colocada num retângulo. Esse retângulo foi colocado com Children do nó Billboard. Esse nó, por sua vez, foi configurado para girar em torno do eixo y, acompanhando a movimentação do usuário.

109 Colorido e Normal? É possível alterar as cores e as normais por face ou por vértice de nós avançados como IndexedFaceSet Extrusion ElevationGrid Isso permite Mudar iluminação em partes dos objetos Controlar suavização de bordas Como? Campos: CreaseAngle, NormalPerVertex, NormalIndex, ccw Nós: Normal, Color É possível alterar as cores e as normais por face ou por vértice de nós avançados como IndexedFaceSet, Extrusion e ElevationGrid. Isso permite mudar a iluminação em partes dos objetos (faces e vértices) e , também, controlar a suavização entre bordas das faces de um objeto (creaseAngle). Para saber mais sobre como fazer isso, consultem campos não-mencionados aqui, como CreaseAngle, NormalPerVertex, NormalIndex e Ccw. Além disso, leiam sobre os nós Normal e Color.

110 Isso permite aplicar à textura
Onde está a Textura? É possível configurar o mapeamento das texturas em objetos avançados como IndexedFaceSet Extrusion ElevationGrid Isso permite aplicar à textura Rotação, translação e escala Mapeamento vértice a vértice de uma textura num objeto Como? Campos: Texture, texCoord, texCoordIndex Nós: TextureTransform, TextureCoordinate É possível configurar o mapeamento das texturas em objetos avançados como IndexedFaceSet, Extrusion, ElevationGrid. Isso permite aplicar à textura: rotação, translação e escala (TextureTransform), além de um mapeamento vértice a vértice num objeto (TextureCoordinate). Para saber mais sobre como fazer isso, consultem campos não-mencionados aqui, como Texture, TexCoord e TexCoordIndex. Além disso, leiam sobre os nós TextureTransform e TextureCoordinate.

111 Lista de Exercícios Lista 3 Transparências comentadas!! Referências
Prazo: próxima aula! Utilizem VRMLPad! Transparências comentadas!! Referências Floppy’s VRML 97 Tutorial: Web 3D Consortium – VRML Archives Bem, a terceira lista de exercícios se encontra no mesmo local da primeira. Quem ainda não terminou as outras listas, é bom terminar. O prazo da lista é para a próxima aula, de forma semelhante às outras listas. Boa sorte. As transparências se encontram comentadas. Algumas contêm informações extras que podem ser de utilidade para vocês durante a resolução da lista.

112 Lista de Exercícios Links Interessantes
Aqui vão alguns links de VRML que eu achei interessantes:

113 VRML Virtual Reality Modeling Language
PRIMITIVAS AVANÇADAS II Márcio Bueno 24 de Novembro de 2004 Atualizada por Paulo Gonçalves de Barros Baseada na apresentação de: Dênio Mariz Judith Kelner Alejandro Frery Cin/UFPE, novembro 2000 Boa tarde, pessoal. Bem, para os que ainda não sabem, meu nome é Paulo. Eu vou continuar aqui as aulas de VRML a partir do que vimos na aula passada. Sendo assim, os que perderam, dançaram. Terão que se virar com as transparências disponíveis na conta da disciplina, cujo endereço eu reapresentarei daqui a pouco. **Atualizar data de apresentação e nome do apresentador!

114 Roteiro O que é VRML Histórico Objetivos da VRML VRML, Internet e WWW
Visão geral do VRML Estrutura do Arquivo VRML Conceitos-chave Semântica dos Nós Primitivas Básicas Primitivas Avançadas Aí está o roteiro da apresentação. Como na aula passada, continuaremos de ver primitivas avançadas. A aula provavelmente será mais curta que o normal, deixando bastante tempo para vocês adiantarem as listas atrasadas e fazer a lista número 4.

115 Informações Adicionais
Exercícios Transparências Dúvidas Lembrando mais uma vez: os arquivos, tanto de exercícios quanto as transparências estarão nesse endereço aí. Se vocês tiverem dúvidas (de projeto ou não) é só mandar um ou tirar em tempo real aqui na aula mesmo. **Atualizar endereço onde os arquivos estão e para se tirar dúvidas!

116 Primitivas Básicas e Avançadas
Group Transform Viewpoint Anchor Inline Proto Extern Proto WorldInfo Background Panorama Fog IndexedFaceSet IndexedLineSet PointSet Extrusion Elevation Grid Billboard DirectionalLight PointLight SpotLight Sound AudioClip NavigationInfo TimeSensor VisibilitySensor ProximitySensor Collision TouchSensor SphereSensor CylinderSensor PlaneSensor Bem aqui está o assunto da aula mais detalhadamente. Já vimos todos os tópicos em cinza. O que veremos serão apenas os dois tópicos em verde. São eles as primitivas avançadas: DirectionalLight; PointLight; SpotLight; Sound; AudioClip; NavigationInfo; TimeSensor; VisibilitySensor; ProximitySensor; Collision; TouchSensor; SphereSensor; CylinderSensor; PlaneSensor.

117 Luzes Headlight off! Processamento de iluminação para polígono
Preferences – Navigation - Headlight on X Processamento de iluminação para polígono Média da iluminação em cada vértice Campos básicos Color Intensity AmbientIntensity Tipos de luz DirectionalLight: raios de luz numa mesma direção PointLight: lâmpada comum SpotLight: cone de luz O nós de luz tem a proposta bastante óbvia de iluminar o seu ambiente. Até agora, o nosso mundo era iluminado com a luz padrão do plug-in do navegador: a headlight. A partir de agora, nós iremos desativá-la e iluminar à nossa própria maneira. O processamento da luz em cada polígono se dá através do cálculo da média da iluminação em cada um de seus vértices. Isso gera um problema, pois não é possível ter polígonos grandes com partes diferentemente iluminadas (a menos que se manipule as normais desses vértices, o que será visto mais adiante). Os campos básicos das luzes são: Color: define a cor da luz emitida Intensity: intensidade dos raios de luz AmbientIntensity: percentual de contribuição dessa luz à luz ambiente (luz ambiente = luzes de outros objetos refletidas em si) Três são os tipos de luz: DirectionalLight: raios de luz numa mesma direção, equivalente ao sol; PointLight: uma fonte pontual de luz, equivalente a uma lâmpada comum; SpotLight: cone de luz, equivalente a um abajur de leitura.

118 Luzes - DirectionalLight
ambientIntensity 0 color direction intensity 1 on TRUE } Raios de luz paralelos – luz do sol As luz direcional, como já foi dita, é como a luz do sol, com sues raios paralelos e numa mesma direção. Os campos do nó DirectinalLight são: ambientIntensity: percentual de contribuição da luz à iluminação ambiente; Color: cor da luz; Direction: vetor indicando a direção a qual a luz é emitida para a origem (o valor padrão é , indicando que a luz brilha no sentido de z positivo para a origem continuando pro z negativo); Intensity: intensidade da luz emitida; On: interruptor da luz, indicando se está acesa ou não.

119 Luzes - DirectionalLight
Iluminação hierárquica Ilumina todos abaixo de seu pai na hierarquia Copyright Vapour Technology Ltd. Raiz Group O directionalLight ilumina os objetos hierarquicamente. Todos os nós que estão abaixo de seu pai são iluminados. Nesse exemplo, um dos cubos é iluminado apenas pelas luz amarela enquanto o outro é iluminado tanto pela amarela quanto pela vermelha.

120 Luzes - DirectionalLight
#VRML V2.0 utf8 NavigationInfo {headlight FALSE} DirectionalLight { ambientIntensity 1 intensity 1 color 1 1 0 direction } Shape { appearance Appearance { material Material { diffuseColor 1 1 1 geometry Box {} Viewpoint { orientation position description "view 1"} Aqui temos um exemplo de uso de uma DirectionalLight. Perceba a mudança de ângulo da câmera para tornar possível a visualização da lateral esquerda menos iluminada do cubo.

121 Luzes - PointLight PointLight { ambientIntensity 0 attenuation 1 0 0
color intensity 1 location on TRUE radius } Luz emana de ponto no espaço – lâmpada incandescente As luz pontual, como já foi dita, é como uma lâmpada incandescente, com seus raios partindo em todas as direções de um mesmo ponto. Os campos do nó PointLight são: AmbientIntensity: percentual de contribuição da luz à iluminação ambiente; Attenuation: fatores de atenuação da luz. São três no total (f1, f2, f3). Eles funcionam na atenuação total, afetando a intensidade da luz i baseados na seguinte fórmula: i = 1 / (f1 + f2*r + f3*r2) O primeiro valor (f1) indica luz sem atenuação, o segundo (f2) indica luz com atenuação linearmente proporcional à distância e o terceiro (f3) com atenuação quadraticamente proporcional à distância. Color: cor da luz; Intensity: intensidade da luz emitida; Location: localização espacial da luz; On: interruptor da luz, indicando se está acesa ou não. Radius: raio de iluminação. Somente objetos dentro do raio são afetados pela iluminação da luz.

122 Luzes - PointLight #VRML V2.0 utf8 NavigationInfo {headlight FALSE}
{ ambientIntensity 1 intensity 1 color 1 1 0 attenuation location 0 0 0 radius 30 } DEF mySphere Transform { translation children Shape { appearance Appearance { material Material {diffuseColor 1 1 1} } geometry Sphere {} } } Transform { translation children USE mySphere} Transform { translation Transform {translation Um exemplo do uso de PointLight. A fonte de luz está situada entre as duas esferas centrais. Percebam a dissipação da luz de acordo com a distância de sua fonte. As duas esferas mais externas se encontram menos iluminadas que as centrais.

123 Luzes - SpotLight Luz em forma de cone, Lâmpada de leitura SpotLight {
ambientIntensity 0 attenuation 1 0 0 beamWidth 1.57 color 1 1 1 cutOffAngle 0.78 direction intensity 1 location 0 0 0 on TRUE radius 100 } Luz em forma de cone, Lâmpada de leitura Mesmos parâmetros das outras duas luzes, além de: BeamWidth CutOffAngle As luz spot, como já foi dita, é como uma lâmpada de leitura, com sues raios partindo, em todas as direções dentro de um cone, de um mesmo ponto. Os campos do nó SpotLight são: AmbientIntensity: percentual de contribuição da luz à iluminação ambiente; Attenuation: fatores de atenuação da luz. São três no total (f1, f2, f3). Eles funcionam na atenuação total, afetando a intensidade da luz i baseados na seguinte fórmula: i = 1 / (f1 + f2*r + f3*r2) O primeiro valor (f1) indica luz sem atenuação, o segundo (f2) indica luz com atenuação linearmente proporcional à distância e o terceiro (f3) com atenuação quadraticamente proporcional à distância. BeamWidth: define o ângulo máximo do cone de luz. Todos os objetos dentro do cone serão afetados pela luz do spotLight; Color: cor da luz; CutOffAngle: ângulo que define cone interno ao beamWidth a partir do qual a atenuação da luz acontece; Direction: vetor indicando a direção e o sentido os quais a luz é emitida; Intensity: intensidade da luz emitida; Location: localização espacial da luz; On: interruptor da luz, indicando se está acesa ou não. Radius: raio de iluminação. Somente objetos dentro do raio são afetados pela iluminação da luz. cutOffAngle BeamWidth raio

124 Luzes - SpotLight #VRML V2.0 utf8 NavigationInfo {headlight FALSE}
ambientIntensity 1 attenuation beamWidth color cutOffAngle direction intensity location on TRUE radius } Shape { appearance Appearance { material Material { diffuseColor 1 1 1}} geometry Box {size }} Um exemplo do uso de SpotLight. A fonte de luz branca está projetada num plano também branco. Percebam a dissipação da luz de acordo com o afastamento do eixo central do cone de luz. É também perceptível o cone central, onde não há atenuação, definido pelo valor do CutOffAngle.

125 Sons - Sound Sound { direction 0 0 1 intensity 1 location 0 0 0
maxBack 10 maxFront 10 minBack 1 minFront 1 priority 0 source NULL spatialize TRUE } maxBack minBack minFront direction Vamos agora colocar sons em nosso mundo. Para tanto, devemos definir um nó para localizar espacialmente nossa fonte sonora. Esse nó é o Sound. Ele permite criar uma fonte sonora cuja propagação sonora se dá de forma elipsoidal como na figura acima. As áreas de mesma cor possuem mesma intensidade sonora. Os campos desse nó , cujos valores padrão estão apresentados acima, são: Direction: direção da emissão de som; Intensity: intensidade/ volume do som – valor de 0 a 1 que multiplica o volume inicial do arquivo sonoro; Location: localização espacial da fonte sonora; MaxBack: distância máxima atrás da fonte sonora de onde o som pode ser ouvido; MaxFront: distância máxima na frente da fonte sonora de onde o som pode ser ouvido; MinBack: distância máxima atrás da fonte sonora a partir da qual o volume fica constante e na sua intensidade máxima; MinFront: distância máxima na frente da fonte sonora a partir da qual o volume fica constante e na sua intensidade máxima; Priority: os navegadores tem limitações quanto à quantidade de canais de som. É importante priorizar seus sons para, em caso dessa limitações no número de canais, os principais sons de seu mundo não deixem de ser ouvidos. Source: arquivo de origem do som. Na verdade, o que entra aqui é um nó AudioClip (arquivo de áudio) ou MovieTexture (arquivo de vídeo). No segundo caso, o navegador tocará os sons do arquivo de vídeo especificado. Spatialize: indica se o som deve ser caracterizado com estando numa posição espacial específica. Se sim, o som varia sua intensidade de acordo com a movimentação do usuário, permitindo que o último detecte sua localização espacial auditivamente. Se não, ele é considerado como som ambiente, sem uma localização espacial específica perceptível. maxFront

126 Sons - Sound AudioClip { description "" loop FALSE pitch 1.0
startTime 0 stopTime 0 url [] } Define configuração para nó Sound Formatos MIDI “.MID” 1.0 ou “.WAV” sem compressão O complemento do nó Sound é o AudioClip. É ele que específica o arquivo de som e suas propriedades para ser tocado. Os campos desse nó , cujos valores padrão estão apresentados acima, são: Description: uma descrição do som, caso desejado; Loop: ativa o som a tocar infinitas vezes ininterruptamente; Pitch: define a velocidade do som.Se o valor é 1.0, ele é tocado normalmente. Se o valor é 0.5 , ele é tocado uma oitava abaixo e com metade da velocidade. Se o valor é 2.0 ele é tocado uma oitava acima e duas vezes mais rápido. startTime: indica o tempo de início de reprodução do som em segundos a partir de meia noite de 1 de janeiro de 1970 (isso vai ser dado automaticamente quando o ligarmos a algum sensor) stopTime: indica o tempo de término de reprodução do som em segundos a partir de meia noite e 1 de janeiro de 1970 (isso vai ser dado automaticamente quando o ligarmos a algum sensor) url: endereço de localização do som, podendo estar na Internet ou não.

127 Sons - Sound Exemplo Música ambiente #VRML V2.0 utf8 Sound {
maxBack 50 maxFront 50 minBack 5 minFront 5 source AudioClip { description "Musica ambiente" loop TRUE url "musica.mid" } spatialize FALSE Aqui temos um exemplo simples de utilização do dois nós de som. Ele cria uma música ambiente para um mundo VRML. Observe que o campo spatialize está com valor FALSE, o que indica que a musica não está posicionada e localizável espacialmente.

128 Navegação – NavigationInfo
avatarSize [0.25, 1.6, 0.75] headlight TRUE speed 1.0 type ["WALK"] visibilityLimit 0.0 } Configura avatar do usuário, sua navegação e limite de visibilidade set_bind isBound Passemos agora para as configurações de navegação e de interface do usuário. Desse nó, veremos apenas os campos em verde, deixando de lado os em cinza. Bem, explicando cada um dos campos, cujos valores padrão estão apresentados acima, temos: avatarSize: indica o tamanho da entidade que representa o usuário no mundo. Ele consiste de um cilindro cujos valores padrão são: 0.25 para o raio; 1.6 para altura; 0.75 para altura dos joelhos, definindo a altura máxima de um degrau, dentro mundo, que o usuário é capaz de subir; Headlihgt: define se a luz padrão do mundo deve ficar acesa ou não. Isso dependerá se você já providenciou iluminação própria para seu mundo; Speed: fator multiplicativo para a velocidade de navegação do usuário ( 0.5 faz ele se deslocar com metade da velocidade e 2.0 com o dobro); Type: configura os tipos de navegação possíveis ao usuário no seu mundo. Vale observar que mais de um tipo pode ser aplicado por vez. E dentre estes tipos, temos: WALK: o usuário pode andar pelo mundo, sofrendo ação da gravidade e não podendo se deslocar para cima (comando de PAN não funciona corretamente); FLY: o usuário pode se deslocar livremente pelo mundo sem efeito da gravidade; EXAMINE: O USUário fica parado, mas pode girar o mundo em todas as direções e aproximá-lo de si para estudá-lo no melhor ângulo possível; NONE: o usuário não pode se movimentar ou movimentar o mundo. VisibilityLimit: indica até que distância de si o usuário pode enxergar no mundo. Isso importante de se utilizar quando se tem um mundo muito grande e cheio de objetos e se quer diminuir sua carga computacional.

129 Eventos São notificações de mudança no valor de algum campo Campos
EventOut eventos que geram informação EventIn aceitam e utilizam informação externa (EventOut) Campos Exposed possuem EventIn e EventOut próprios Um evento é composto de Mensagem TimeStamp Eventos encadeados tem mesmo timeStamp Outro conceito importante é o conceito de eventos Os nos podem se comunicar entre si através da geração e captação de eventos. Eventos são, então, notificações de mudança no valor de algum campo passados e recebidos de um nó para outro. Os tipos de evento são: EventOut eventos que geram informação EventIn aceitam e utilizam informação externa (EventOut) Alguns nós possuem campos que são do tipo exposed. Isso significa que o nó tem dois eventos já definidos para esse campo: set_nomeDoCampo (representando o EnventIn desse campo, servindo para receber novos valores para si) e nomeDoCampo_changed (representando o EnventOut desse campo, servindo para notificar o mundo externo sobre sua mudança de valor). Para facilitar o uso, não é necessário se referir a esses eventos com o prefixo set_ e sufixo _changed. Basta usar o nomeDoCampo e o navegador distinguirá qual dos dois eventos está sendo utilizado. Somente campos Exposed podem ser modificados, por exemplo (ver ).

130 Rotas Efetuam a transmissão de informação entre eventos
Ex.: tocar um som quando o mouse for clicado Definir nomes únicos para os objetos cujos eventos serão ligados DEF SENSOR TouchSensor { } DEF SOUND Sound { } Conectar campos através do comando Route ROUTE SENSOR.touchTime TO SOUND.startTime Se houver objetos com mesmo nome, todos serão afetados! Sensor EventOut TouchTime Sound EventIn StartTime Route Para que os eventos sejam transmitidos, é necessário criar-se canais de comunicação entre eles. Esses canais são chamado de routes (que em inglês significa rotas). Eles irão ligar eventos de saída a eventos de entrada , assim efetuar a comunicação de mudança de valores entre campos de nós. Para criar-se um rota precisa se ter bem-definidos o local do campo de EventOut e o de EventIn. Ou seja, cada nó tem que ter um nome único no código para identificá-lo. Observe o exemplo. Criar nós com mesmo nome e com campos EventIn (fan out) fará com que esses campos desses nós recebam um mesmo EventOut – equivalente a um broadcast. Entretanto, Criar nós com mesmo nome e com campos EventOut (fan in) fará com que todos os EventOut gerados por esse campos desses nós vão para um mesmo EventIn (fan in). Isso pode gerar problemas de colisão entre os eventos gerados. Nesse caso, um controle de tempo de eventos tem que ser feito.

131 Eventos e Rotas cont. VRML não converte tipos de eventos
Criação de Sript de conversão Um evento é composto de Mensagem TimeStamp Eventos encadeados tem mesmo TimeStamp Geração de eventos com novo TimeStamp Scripts Sensores Nós de animação e interação Interpoladores VRML não converte tipos de eventos. Ou seja, os eventos ligados por uma rota tem que gerar e receber eventos de mesmo tipo. Caso isso não ocorra, é necessária a criação de script de conversão de um tipo para outro antes da passagem da mensagem. Um evento é composto de uma mensagem (valor gerado pelo evento em si) e de um timeStamp (tempo de acontecimento do evento - valor interno definido pela modelo de execução de VRML e não-manipulável). Eventos encadeados (um evento está ligado a outro evento por um rota, que está ligado a outro e assim por diante) têm mesmo timeStamp. Isso significa dizer que loops gerados numa mesma cadeia de eventos só são executados uma vez, pois o modelo de execução de VRML só executa um evento com mesmo TimeStamp para cada eventIn/eventOut. As únicas formas de gerar eventos com novo TimeStamp são através de Scripts e de Sensores. Qualquer outra forma depende da ativação por um outro evento e, portanto, produz um evento com mesmo TimeStamp. Os nós básicos para animação e interação são; Sensores Interpoladores Scripts Começaremos vendo os sensores. Geração de animação em si se dá através dos nós Interpolator, Switch e dos campos do tipo Exposed.

132 Eventos Exemplos Fan out e fan in em mesma cascata Fan in de cascatas
distintas Loop numa cascata ok ok ok ok ? ok? Aqui temos 3 exemplos de uso de eventos e rotas: O primeiro apresenta um fan out ( mesmo evento sendo direcionado para dois evento distintos) que funciona normalmente. Entretanto, o fan in (mais de um evento sendo enviado para um mesmo objeto) vai dar problema, pois ambos os eventos a serem captados pelo nó fazem parte da mesma cadeia de eventos. O segundo exemplo mostra um fan in com evento vindo de cadeias diferentes. A probabilidade de eventos de cadeias diferentes terem o mesmo timeStamp é muito baixa então, não grandes problemas nesse caso. Entretanto, teoricamente, eventos de mesmo timeStamp podem ser gerados, podendo ocorrer comportamento imprevisíveis. O terceiro exemplo apresenta um loop. Cadeias em loop em VRML funcionam, mas somente uma única vez, pois um eventOut só processa um evento pro timeSatamp. Quando um segundo evento de mesmo timeStamp chegar no eventOut do nó de cima ele não será transmitido.

133 Sensores Tipos de sensores Environmental Pointing-device TimeSensor
VisibilitySensor ProximitySensor Collision Pointing-device TouchSensor SphereSensor CylinderSensor PlaneSensor Sensores são nós capazes de captar algum tipo de informação no ambiente ou do usuário e transformá-la em um evento. Os sensores são divididos em dois tipos, cada um dele com quatro nós, listados abaixo: Environmental: sensores que detectam mudanças no ambiente como situação espacial do avatar do usuário, passagem do tempo, etc. TimeSensor VisibilitySensor ProximitySensor Collision Pointing-device: sensores que detectam reações do usuário através do mouse. TouchSensor SphereSensor CylinderSensor PlaneSensor

134 Contando o tempo – TimeSensor
exposedField SFBool enabled TRUE exposedField SFTime cycleInterval 1 exposedField SFBool loop FALSE exposedField SFTime startTime 0 exposedField SFTime stopTime 0 eventOut SFTime cycleTime eventOut SFFloat fraction_changed eventOut SFBool isActive eventOut SFTime time } Equivalente a cronômetro Sensores de tempo são nada mais medidores da variação de tempo no mundo, como cronômetros. Seus campos são: CucleInterval: o tempo em que ele reinicia a contagem; Enabled: indica se o contador está o sensor está ativado(deve contar) ou não; Loop indica se o contador irá contar inúmeras vezes (TRUE) ou apenas uma (FALSE); StopTime: tempo em que ele deve parar a contagem (como no nó Sound); Starttime: Tempo em que ele deve começar a contagem (como no nó Sound); Seu campos de evento são: CycleTime: envia um evento quando ao intervalo de cada ciclo do contador. O conteúdo da mensagem é o tempo atual; Fraction_changed: envia eventos seqüencial e ininterruptamente tão rápido quanto possível. O seu conteúdo é um float contendo a fração do ciclo de intervalo em que o contador se encontra; Time: gerado ao mesmo tempo do Fraction_changed, mas com conteúdo diferente. O seu conteúdo é o absoluto do tempo decorrido;

135 Contando o tempo– TimeSensor cont.
Exemplo Som tocado a cada 3 segundos #VRML V2.0 utf8 DEF Cronometer TimeSensor { cycleInterval 3.0 loop TRUE } Sound { minFront 5 minBack 5 maxFront 50 maxBack 50 source DEF MySound AudioClip { url "sound.wav" ROUTE Cronometer.cycleTime TO MySound.startTime Aqui temos um exemplo de uso de timeSensor. Ligamos ao cycleInterval o campo startTime de um AudioClip. Assim, toda vez que se atinge um ciclo do contador de tempo, o som do AudioClip é contado.

136 Basta ver pra acontecer – VisibilitySensor
exposedField SFVec3f center exposedField SFBool enabled TRUE exposedField SFVec3f size eventOut SFTime enterTime eventOut SFTime exitTime eventOut SFBool isActive } Sensores que são ativados quando se encontram dentro do campo de visão do usuário. Útil para otimização de processamento de animação VisibilitySensors são sensores que são ativados quando as caixas que os representam se encontram dentro do campo de visão do usuário. Eles são úteis para otimizar as animações. Por exemplo, pode-se desativar animações que não estejam sendo vistas pelo usuário a fim de reduzir o processamento no mundo. Os campos desse sensor são: Center: a posição espacial onde o centro do sensor se encontra; Enabled: se o sensor está ativado ou não; Size: tamanho da caixa que representa o sensor; enterTime: mensagem enviada quando o sensor entra no campo de visão do usuário contendo o tempo em que esse evento ocorreu; exitTime: mensagem enviada quando o sensor sai do campo de visão do usuário contendo o tempo em que esse evento ocorreu; isActive: mensagem enviada quando o sensor entra e sai no campo de visão do usuário contendo TRUE (entrou no campo de visão) ou FALSE (saiu do campo de visão);

137 Basta ver pra acontecer – VisibilitySensor cont.
Exemplo Canhão “atira” quando o usuário o vê #VRML V2.0 utf8 DEF mySensor VisibilitySensor { size center } Sound { minFront 5 minBack 5 maxFront 50 maxBack 50 source DEF mySound AudioClip { loop TRUE url "sound.wav" } Inline {url "canhao.wrl"} ROUTE mySensor.enterTime TO mySound.startTime ROUTE mySensor.exitTime TO mySound.stopTime Aqui temos um exemplo de uso do visibilitySensor. Ele está posicionado no mesmo local de um canhão. Quando o usuário o vê, ele emite som de tiros.

138 Chegue mais! – ProximitySensor
exposedField SFVec3f center exposedField SFBool enabled TRUE exposedField SFVec3f size eventOut SFTime enterTime eventOut SFTime exitTime eventOut SFBool isActive eventOut SFVec3f position_changed eventOut SFRotation orientation_changed } Sensores que são ativados quando o usuário de encontra dentro da área do sensor. Útil para reações de personagens quanto à aproximação do usuário (falar, atacar, fugir) ProximitySensors são sensores que são ativados quando o usuário se encontra dentro das caixas que representam esses sensores. Eles são úteis para reações de personagens o seu mundo. Por exemplo, para um personagem falar com o usuário, ou para um inimigo atirar nele durante um jogo. Os campos desse sensor são: Center: a posição espacial onde o centro do sensor se encontra; Enabled: se o sensor está ativado ou não; Size: tamanho da caixa que representa o sensor; EnterTime: mensagem enviada quando o usuário entra na caixa que representa o sensor, contendo o tempo em que esse evento ocorreu; ExitTime: mensagem enviada quando o usuário sai da caixa que representa o sensor, contendo o tempo em que esse evento ocorreu; IsActive: mensagem enviada quando o usuário entra ou sai na caixa que representa o sensor, contendo TRUE (entrou na caixa) ou FALSE (saiu da caixa); Position_changed: gerará um evento toda vez que, dentro da caixa do sensor, o usuário mudar sua posição. O valor enviado é o da posição do usuário relativa ao centro desse sensor. Orientation_changed: gerará um evento toda vez que, dentro da caixa do sensor, o usuário mudar sua orientação. O valor enviado é o da orientação do usuário relativa ao centro desse sensor.

139 Chegue mais! – ProximitySensor cont.
Exemplo Canhão “atira” quando o usuário se aproxima #VRML V2.0 utf8 DEF mySensor ProximitySensor { size } Sound { minFront 10 minBack 10 maxFront 100 maxBack 100 source DEF mySound AudioClip { loop TRUE url "sound.wav" Inline {url "canhao.wrl"} ROUTE mySensor.enterTime TO mySound.startTime ROUTE mySensor.exitTime TO mySound.stopTime Aqui temos um exemplo de uso do ProximitySensor. Ele está posicionado no mesmo local de um canhão. Quando o usuário se aproxima (distância menor que 7,5 metros), ele emite som de tiros.

140 Obstruindo o Caminho – Collision
exposedField MFNode children [] exposedField SFBool collide TRUE eventOut SFTime collideTime field SFNode proxy NULL field SFVec3f bboxCenter field SFVec3f bboxSize eventIn MFNode addChildren eventIn MFNode removeChildren } Controla detecção de colisão entre nós Nó de agrupamento Collision é um nó que define a colisão entre objetos. Ele basicamente agrupa em si objetos nos quais o usuário pode colidir. Seus campos são: Collide: campo que define a ativação da detecção (se for igual a TRUE) ou não (se for igual a FALSE) Children: lista contendo nós para os quais a detecção de colisão deve ser calculada; CollideTime: gera um evento toda vez em que algo colide com os filhos do nó de colisão. A mensagem é o tempo em que essa colisão ocorreu. Proxy: é possível substituir as formas dos nós de colisão por um forma mais simples (caixa, cilindro), a fim de facilitar o processamento da detecção de colisão. Isso é feito se passando essa forma mais simples através do campo proxy; AddChildren: campo para recebimento de eventos de entrada contendo novo nó para inserí-lo no nó de colisão; RemoveChildren: campo para recebimento de eventos de entrada contendo nó para removê-lo do nó de colisão; BBoxCenter: centro da caixa de contorno do nó; BBoxSize: tamanho da caixa de contorno do nó;

141 Obstruindo o Caminho – Collision cont.
Exemplo Não é possível encostar no canhão #VRML V2.0 utf8 NavigationInfo{type "WALK"} Collision { children Inline { url "canhao.wrl"} proxy Shape { geometry Box { size } collide TRUE Viewpoint { position Aqui temos um exemplo de uso do Collision. Ele está posicionado no mesmo local de um canhão. Quando o usuário se aproxima do canhão (a uma distância de 15 metros do último), ele colide com o proxy criado para o canhão. ATENÇÃO: Muitas vezes pode ocorrer erro na colisão se o método de navegação for modificado, principalmente posto para o modo STUDY.

142 Detecção de Toque– TouchSensor
exposedField SFBool enabled TRUE eventOut SFBool isOver eventOut SFBool isActive eventOut SFTime touchTime eventOut SFVec2f hitTexCoord_changed eventOut SFVec3f hitNormal_changed eventOut SFVec3f hitPoint_changed } Tela do monitor Posição do mouse Esse é o nó de detecção de clique, arraste e sobreposição do mouse em objetos do mundo virtual. Os campos desse nó são: Enabled: ativa a detecção de entrada do mouse; HitPoint_Changed: gera um evento contendo como mensagem o vetor de posição da projeção da posição do mouse na tela na superfície dos nós afetados pelo sensor; HitNormal_Changed: gera um evento contendo como mensagem o vetor normal da posição da projeção, na superfície dos nós afetados pelo sensor, da posição do mouse na tela; HitTexCoord_Changed: gera um evento contendo como mensagem a posição na textura da face, na superfície do objeto afetado pelo sensor, relativa à posição da projeção da posição do mouse na tela (consultar TextureTransform e TextureCoordinate); IsActive: gera um evento cuja mensagem indica se o botão do mouse for pressionado sobre os nós do TouchSensor (TRUE) e quando ele for solto/despressionado sobre os mesmos(FALSE); IsOver: gera um evento cuja mensagem indica se o mouse está sobre os nós do TouchSensor (TRUE) e quando ele sai de cima (FALSE); TouchTime: gera um evento cuja mensagem indica o tempo em que o botão do mouse foi pressionado sobre os nós do TouchSensor e quando ele foi solto/despressionado. Se ele for solto fora dos objetos com sensor a mensagem de FALSE não é enviada; hitNormal hitPosition Objeto com TouchSensor

143 Detecção de Toque– TouchSensor
Group Touch Sensor Detecção de clique, arraste e sobreposição com o mouse em objetos com mesmo nó pai. #VRML V2.0 utf8 Group { children [ DEF PositionOrientation TouchSensor {} Inline {url "canhao.wrl"} ] } DEF ShotSensor TouchSensor {} DEF shotAim Transform { children [ Sound { minFront 50 minBack 50 maxFront 100 maxBack 100 source DEF shotSound AudioClip {url "sound.wav"} } Inline {url "seta.wrl"} ] } ] } ROUTE ShotSensor.touchTime TO shotSound.startTime ROUTE PositionOrientation.hitPoint_changed TO shotAim.translation Esse é o nó de detecção de clique, arraste e sobreposição do mouse em objetos do mundo virtual. Ele funciona afetando todos os nós filhos do mesmo pai que ele, como mostra a figura. Aqui temos um exemplo de uso do nó TouchSensor. Uma seta (mira) segue o cursor e aponta para pontos da superfície do canhão. Ao clicar, um som de tiro é apresentado.

144 Rotação Manual – SphereSensor
exposedField SFBool enabled TRUE eventOut SFBool isActive exposedField SFBool autoOffset TRUE exposedField SFRotation offset eventOut SFRotation rotation_changed eventOut SFVec3f trackPoint_changed } Tela do monitor Posição do mouse Esse é o nó que permite girar objetos através do mouse. Os campos desse nó são: Offset: valor de rotação dado pelo usuário ao girar o objeto com o mouse; AutoOffset: define que a o valor de rotação dado pelo usuário permaneça no objeto (no campo offset) até a próxima rotação. Por exemplo, o usuário roda o objeto uma vez de uma posição inicial Pi para um posição final Pf. Se AutoOffset for igual a TRUE, da próxima vez que o objeto for rodado ele começará a rodar da posição Pf. Se o AutoOffset for igual a FALSE, da próxima vez que o objeto for rodado ele começará a rodar da posição Pi; Enabled: indica se o sensor está ativado ou não; TrackPoint_Changed: gera um evento contendo como mensagem o vetor de posição da projeção da posição do mouse na tela na superfície dos nós afetados pelo sensor; Rotation_Changed: gera um evento contendo como mensagem o vetor de rotação resultante a ser encaminhado para os objetos a serem girados; IsActive: gera um evento cuja mensagem indica se o botão do mouse for pressionado sobre os nós do SphereSensor (TRUE) e quando ele for solto/despressionado sobre os mesmos(FALSE); trackPoint offSet Objeto com SphereSensor

145 Rotação Manual – SphereSensor
Detecção de rotação com o mouse em objetos com mesmo nó pai. #VRML V2.0 utf8 NavigationInfo {type "NONE"} Group { children [ DEF MySensor SphereSensor {autoOffset TRUE} DEF boxTransform Transform { children Shape{ appearance Appearance { material Material { diffuseColor 0 1 1 } geometry Box{} ] ROUTE MySensor.rotation_changed TO boxTransform.rotation Esse é o nó de detecção de rotação com o mouse em objetos com mesmo nó pai no mundo virtual. O funciona afetando todos os nós filhos do mesmo pai que ele, como o TouchSensor e todos os outros sensores de mouse. Aqui temos um exemplo de uso do nó SphereSensor. Um cubo gira à vontade do usuário.

146 Rotação Manual Restrita – CylinderSensor
exposedField SFBool enabled TRUE eventOut SFBool isActive exposedField SFBool autoOffset TRUE exposedField SFFloat offset 0 exposedField SFFloat diskAngle exposedField SFFloat maxAngle -1 exposedField SFFloat minAngle 0 eventOut SFRotation rotation_changed eventOut SFVec3f trackPoint_changed } Tela do monitor Esse é o nó que permite girar objetos através do mouse restritamente ao eixo coordenado y. Para rodar em outros eixos, basta aplicar um Transform ao sensor, modificando o eixo da forma desejada; Os campos desse nó são: Offset: valor de rotação dado pelo usuário ao girar o objeto com o mouse; AutoOffset: define que a o valor de rotação dado pelo usuário permaneça no objeto (no campo offset) até a próxima rotação. Por exemplo, o usuário roda o objeto uma vez de uma posição inicial Pi para um posição final Pf. Se AutoOffset for igual a TRUE, da próxima vez que o objeto for rodado ele começará a rodar da posição Pf. Se o AutoOffset for igual a FALSE, da próxima vez que o objeto for rodado ele começará a rodar da posição Pi; Enabled: indica se o sensor está ativado ou não; TrackPoint_Changed: gera um evento contendo como mensagem o vetor de posição da projeção da posição do mouse na tela na superfície dos nós afetados pelo sensor; Rotation_Changed: gera um evento contendo como mensagem o vetor de rotação resultante a ser encaminhado para os objetos a serem girados; IsActive: gera um evento cuja mensagem indica se o botão do mouse for pressionado sobre os nós do CylinderSensor (TRUE) e quando ele for solto/despressionado sobre os mesmos(FALSE); DiskAngle: ângulo que define a mudança de forma de manipulação da rotação cilíndrica. Se o ângulo entre o eixo y do cilindro e a reta ligando o usuário à superfície do cilindro na metade de sua altura for menor que o DiskAngle, então o usuário girará o cilindro segurando em suas bases e girando o mouse sobre elas (seta 1 da figura). Entretanto, se o ângulo entre o eixo y do cilindro e a reta ligando o usuário à superfície do cilindro na metade de sua altura for maior que o DiskAngle, o usuário girará o cilindro segurando em sua lateral e arrastando o mouse no sentido horizontal (seta 2 da figura). MaxAngle: define o ângulo máximo que o cilindro pode girar; MinAngle: define o ângulo mínimo que o cilindro pode girar. Se minAngle for maior que maxAngle, o cilindro não restrições quanto ao ângulo de rotação; Posição do mouse y 1 trackPoint DiskAngle 2 offSet Objeto com SphereSensor

147 Rotação Manual Restrita – CylinderSensor
Detecção de rotação no eixo y com o mouse em objetos com mesmo nó pai. #VRML V2.0 utf8 Group { children [ DEF mySensor CylinderSensor {diskAngle 0.28} DEF coneTransform Transform { children Shape { appearance Appearance { material Material { diffuseColor 1 0 0 } geometry Cone {} ] ROUTE mySensor.rotation_changed TO coneTransform.rotation Esse é o nó de detecção de rotação (no eixo y) com o mouse em objetos com mesmo nó pai no mundo virtual. Ele funciona afetando todos os nós filhos do mesmo pai que ele, como o TouchSensor e todos os outros sensores de mouse. Aqui temos um exemplo de uso do nó CylinderSensor. Um cone gira no eixo y à vontade do usuário.

148 Translação Planar Manual – PlaneSensor
exposedField SFBool enabled TRUE eventOut SFBool isActive exposedField SFBool autoOffset TRUE exposedField SFVec3f offset exposedField SFVec2f maxPosition exposedField SFVec2f minPosition 0 0 eventOut SFVec3f trackPoint_changed eventOut SFVec3f translation_changed } Esse é o nó que permite deslocar objetos através do mouse restritamente ao plano dos eixos coordenados x e y. Para deslocar em outros eixos, basta aplicar um Transform ao sensor, modificando o plano da forma desejada; Os campos desse nó são: Offset: valor de translação dado pelo usuário ao deslocar o objeto com o mouse; AutoOffset: define que a o valor de translação dado pelo usuário permaneça no objeto (no campo offset) até a próxima translação. Por exemplo, o usuário desloca o objeto uma vez de uma posição inicial Pi para um posição final Pf. Se AutoOffset for igual a TRUE, da próxima vez que o objeto for deslocado ele começará a deslocar da posição Pf. Se o AutoOffset for igual a FALSE, da próxima vez que o objeto for rodado ele começará a deslocar da posição Pi; Enabled: indica se o sensor está ativado ou não; TrackPoint_Changed: gera um evento contendo como mensagem o vetor de posição da projeção da posição do mouse na tela na superfície dos nós afetados pelo sensor; Translation_Changed: gera um evento contendo como mensagem o vetor de translação resultante a ser encaminhado para os objetos a serem deslocados; IsActive: gera um evento cuja mensagem indica se o botão do mouse for pressionado sobre os nós do PlaneSensor (TRUE) e quando ele for solto/ despressionado sobre os mesmos (FALSE); MaxPosition: define o deslocamento máximo do sensor em ambos eixos do plano; MinPosition: define o deslocamento mínimo do sensor em ambos eixos do plano. Se, num determinado eixo, os valores de minPosition e maxPosition forem iguais, o sensor não se permitirá deslocamentos nesse eixo. Se, num determinado eixo, os valor de minPosition for maior que o de maxPosition, o sensor não terá nenhuma restrição de descolamento nesse eixo. maxPosition minPosition y maxPosition minPosition x

149 Translação Planar Manual – PlaneSensor
Detecção de translação no plano XY com o mouse em objetos com mesmo nó pai. #VRML V2.0 utf8 NavigationInfo {type "EXAMINE"} Shape {geometry Box{size }} Transform { translation 0 0 1 children [ DEF mySensor PlaneSensor { maxPosition minPosition } DEF myBox Transform { children Shape { appearance Appearance { material Material {diffuseColor } } geometry Box {size } } ] Viewpoint {position } ROUTE mySensor.translation_changed TO myBox.translation Esse é o nó de detecção de translação (no eixo y) com o mouse em objetos com mesmo nó pai no mundo virtual. O funciona afetando todos os nós filhos do mesmo pai que ele, como o TouchSensor e todos os outros sensores de mouse. Aqui temos um exemplo de uso do nó PlaneSensor. Um cubo se desloca dentro dos limites de um outro no plano XY.

150 Lista de Exercícios Lista 4 Transparências comentadas!! Referências
Prazo: Próxima Aula! Utilizem VRMLPad! Transparências comentadas!! Referências Floppy’s VRML 97 Tutorial: Web 3D Consortium – VRML Archives Bem, a quarta lista de exercícios se encontra no mesmo local das outras. Quem ainda não terminou as outras listas, é bom terminar. O prazo da lista é para a próxima aula, de forma semelhante às outras listas. Boa sorte. As transparências se encontram comentadas. Algumas contêm informações extras que podem ser de utilidade para vocês durante a resolução da lista.

151 VRML Virtual Reality Modeling Language
PRIMITIVAS AVANÇADAS III Márcio Bueno 01 de Dezembro de 2004 Atualizada por Paulo Gonçalves de Barros Baseada na apresentação de: Dênio Mariz Judith Kelner Alejandro Frery Cin/UFPE, novembro 2000 Boa tarde, pessoal. Bem, para os que ainda não sabem, meu nome é Paulo. Eu vou continuar aqui as aulas de VRML a partir do que vimos na aula passada. Sendo assim, os que perderam, dançaram. Terão que se virar com as transparências disponíveis na minha conta, cujo endereço eu reapresentarei daqui a pouco. **Atualizar data de apresentação e nome do apresentador!

152 Roteiro O que é VRML Histórico Objetivos da VRML VRML, Internet e WWW
Visão geral do VRML Estrutura do Arquivo VRML Conceitos-chave Semântica dos Nós Primitivas Básicas Primitivas Avançadas Aí está o roteiro da apresentação. Como na aula passada, continuaremos de ver primitivas avançadas. A aula provavelmente será mais curta que o normal, deixando bastante tempo para vocês adiantarem as listas atrasadas e fazer a lista número 5.

153 Informações Adicionais
Exercícios Transparências Dúvidas Lembrando mais uma vez: os arquivos, tanto de exercícios quanto as transparências estarão nesse endereço aí. Se vocês tiverem dúvidas (de projeto ou não) é só mandar um ou tirar em tempo real aqui na aula mesmo. **Atualizar endereço onde os arquivos estão e para se tirar dúvidas!

154 Primitivas Avançadas ColorInterpolator CoordinateInterpolator
Group Transform Viewpoint Anchor Inline Proto Extern Proto WorldInfo Background Panorama Fog IndexedFaceSet IndexedLineSet PointSet Extrusion Elevation Grid Billboard DirectionalLight PointLight SpotLight Sound AudioClip NavigationInfo TimeSensor VisibilitySensor ProximitySensor Collision TouchSensor SphereSensor CylinderSensor PlaneSensor ColorInterpolator CoordinateInterpolator NormalInterpolator OrientationInterpolator PositionInterpolator ScalarInterpolator Bindable Script Switch LOD Bem aqui está o assunto da aula mais detalhadamente. Percebam que não é muito o que veremos hoje. Já vimos todos os tópicos em cinza. O que veremos serão apenas os dois tópicos em verde. São eles as primitivas avançadas: ColorInterpolator; CoordinateInterpolator; NormalInterpolator; OrientationInterpolator; PositionInterpolator; ScalarInterpolator; LOD; Bindable; Switch; Script.

155 Dando vida a objetos - Interpolators
Modificam valores de campos ao longo do tempo Funcionamento O interpolator acompanha os ciclos do TimeSensor. Interpolator recebe valor de Fraction_changed de um TimeSensor Esse valor define o estágio em que o ciclo do interpolator se encontra. O interpolator emite um valor final para o campo sendo alterado por ele. Os nós de interpolação tem como função variar um campo de um nó gradativamente entre dois valores. Esses campos podem afetar a posição, orientação, escala, normais, etc. Enfim, os interpoladores são a forma mais simples de animar seu mundo independentemente do que o usuário faça. Os tipos de nós interpolator são: ColorInterpolator; CoordinateInterpolator; NormalInterpolator; OrientationInterpolator; PositionInterpolator; ScalarInterpolator. O funcionamento dos nós interpoladores é basicamente o seguinte: O Interpolator recebe o valor de fraction_changed de um TimeSensor; Esse valor define o estágio em que o interpolator se encontra na mudança de um valor inicial para o final; O interpolator emite o valor atual para o campo do nó que está sendo modificado. Um fato importante a ser observado é o de que o interpolator acompanha os ciclos do TimeSensor. Ele leva um ciclo de relógio para completar a mudança de valor do campo.Outro ponto interessante a ser ressaltado é o de que, pelo fato de eles funcionarem dependentes apenas de suas entradas e saídas, podem ser postos em qualquer local do código sem afetar seu funcionamento. TimeSensor Interpolator Nó do objeto set_fraction set_... fraction_changed value_changed

156 Dando vida a objetos - Interpolators
Estrutura básica: eventIn SFFloat set_fraction: valor recebido do TimeSensor exposedField MFFloat key: seqüência de percentuais do tempo total indicando quando cada valor de interpolação ocorrerá. exposedField ? keyValue: valores de interpolação em si eventOut ? value_changed: valor enterpoladao a ser passado para o campo do nó. Tempo decorrido Fraction_changed 0 s 5 s 10 s 15 s Os nós de interpolação possuem a mesma estrutura básica, variando apenas os tipos e a quantidade de valores passados como resultado. Essa estrutura é formada pelos seguintes campos: Set_fraction: valor recebido do TimeSensor que serve como medida do andamento (percentual concluído) da interpolação; Key: seqüência de percentuais do tempo de interpolação indicando quando cada valor chave da interpolação deverá ocorrer. KeyValue: valor de interpolação em si associado a cada percentual definido em Key; Value_changed: valor interpolado a ser passado para o campo do nó. 21.8% = 0.218 Percentual de interpolação 1,0 0,75 0,25 0,5 Keys 0.218 Variação de valores do campo (ex.: rotação) KeyValues 6.28 4.71 1.57 3.14 1.32 Value_changed

157 Alterando Cor - ColorInterpolator
eventIn SFFloat set_fraction exposedField MFFloat key [] exposedField MFColor keyValue [] eventOut SFColor value_changed } #VRML V2.0 utf8 DEF mySensor TimeSensor {cycleInterval 30 loop TRUE } DEF myInterpolator ColorInterpolator { key [0, 0.33, 0.66, 1] keyValue [ 1 0 0, 0 1 0, 0 0 1, ] } Shape { appearance Appearance { material DEF myIntTarget Material {emissiveColor } } geometry Box { } } ROUTE mySensor.fraction_changed TO myColorInterpolator.set_fraction ROUTE myInterpolator.value_changed TO myIntTarget.set_emissiveColor Esse é colorInterpolator. Como todos os outros interpoladores, possui os quatro campos acima descritos. O conteúdo de keyValue e value_changed são, contudo, cores: SFColor: única cor; MFColor: lista de cores. Abaixo temos um exemplo de um cubo que muda de cor ao longo do tempo. Valores iguais garantem continuidade entre ciclos

158 Alterando Vértices - CoordinateInterpolator
eventIn SFFloat set_fraction exposedField MFFloat key [] exposedField MFVec3f keyValue [] eventOut MFVec3f value_changed } Valores iguais garantem continuidade entre ciclos #VRML V2.0 utf8 DEF mySensor TimeSensor { cycleInterval 30 loop TRUE } DEF myInterpolator CoordinateInterpolator{ key [0, 0.2, 0.4, 0.6, 0.8, 1] keyValue [1 1 0,-1 1 0, ,1 -1 0,2 2 0,-2 2 0, ,1 -1 0 3 3 0,-3 3 0, ,2 -2 0,2 2 0,-2 2 0, ,3 -3 0 1 1 0,-1 1 0, ,2 -2 0,1 1 0,-1 1 0, ,1 -1 0]} Shape {geometry IndexedFaceSet { coord DEF myIntTarget Coordinate {point[1 1 0,-1 1 0, ,1 -1 0]} coordIndex [ ] } } ROUTE mySensor.fraction_changed TO myInterpolator.set_fraction ROUTE myInterpolator.value_changed TO myIntTarget.set_point Esse é coordinateInterpolator. Como todos os outros interpoladores, possui os quatro campos acima descritos. O conteúdo de keyValue e value_changed são, contudo, listas de coordenadas de pontos: O exemplo abaixo mostra um quadrado que se estica ao longo do tempo.

159 Alterando Normais - NormalInterpolator
eventIn SFFloat set_fraction exposedField MFFloat key [] exposedField MFVec3f keyValue [] eventOut MFVec3f value_changed } Valores iguais garantem continuidade entre ciclos #VRML V2.0 utf8 DEF mySensor TimeSensor { cycleInterval 30 loop TRUE } DEF myInterpolator NormalInterpolator{ key [0, 0.25, 0.5, 0.75, 1] keyValue [0 0 1,0 1 0, ,0 -1 0,0 1 0, , , 0 0 1, 0 0 -1, , 0 0 1, 0 1 0,0 -1 0, 0 0 1, 0 1 0, , 0 0 1, 0 1 0, , ] } Shape {appearance Appearance {material Material {diffuseColor 1 0 0}} geometry IndexedFaceSet { coord Coordinate {point[1 1 0,-1 1 0, ,1 -1 0]} coordIndex [ ] normal DEF myIntTarget Normal{vector[0 0 1,0 0 -1,0 1 0 ,0 -1 0]} normalPerVertex TRUE normalIndex [ ] } } ROUTE mySensor.fraction_changed TO myInterpolator.set_fraction ROUTE myInterpolator.value_changed TO myIntTarget.set_vector Esse é normalInterpolator. Como todos os outros interpoladores, possui os quatro campos acima descritos. O conteúdo de keyValue e value_changed são, contudo, listas de coordenadas de normais de pontos: O exemplo abaixo mostra um quadrado que muda as normais de seus vértices ao longo do tempo.

160 Alterando Orientação - OrientationInterpolator
eventIn SFFloat set_fraction exposedField MFFloat key [] exposedField MFRotation keyValue [] eventOut SFRotation value_changed } Valores diferentes, mas com rotações relativas iguais garantem a continuidade entre ciclos #VRML V2.0 utf8 DEF mySensor TimeSensor { cycleInterval 30 loop TRUE} DEF myInterpolator OrientationInterpolator{ key [0, 0.25, 0.5, 0.75, 1] keyValue [ , , , , ] } DEF myIntTarget Transform { children Shape { appearance Appearance {material Material {diffuseColor 1 1 1} } geometry Cone {} } } ROUTE mySensor.fraction_changed TO myInterpolator.set_fraction ROUTE myInterpolator.value_changed TO myIntTarget.set_rotation Esse é orientationlInterpolator. Como todos os outros interpoladores, possui os quatro campos acima descritos. O conteúdo de keyValue e value_changed é, contudo, um vetor de rotação: O exemplo abaixo mostra um cone que muda sua rotação ao longo do tempo.

161 Alterando Posição- PositionInterpolator
eventIn SFFloat set_fraction exposedField MFFloat key [] exposedField MFVec3f keyValue [] eventOut SFVec3f value_changed } #VRML V2.0 utf8 DEF mySensor TimeSensor { cycleInterval 10 loop TRUE } DEF myInterpolator PositionInterpolator{ key [0, 0.2, 0.4, 0.6, 0.8, 1] keyValue [0 0 0,1 0 0,0 1 0,-1 0 0,0 -1 0, 0 0 0] } DEF myIntTarget Transform { children Shape { appearance Appearance {material Material {diffuseColor 1 1 1} } geometry Cylinder {} } } ROUTE mySensor.fraction_changed TO myInterpolator.set_fraction ROUTE myInterpolator.value_changed TO myIntTarget.set_translation Esse é positionlInterpolator. Como todos os outros interpoladores, possui os quatro campos acima descritos. O conteúdo de keyValue e value_changed é, contudo, um vetor de translação: O exemplo abaixo mostra um cilindro que muda sua translação ao longo do tempo. Valores iguais garantem continuidade entre ciclos

162 Alterando Escalares - ScalarInterpolator
eventIn SFFloat set_fraction exposedField MFFloat key [] exposedField MFFloat keyValue [] eventOut SFFloat value_changed } #VRML V2.0 utf8 DEF mySensor TimeSensor { cycleInterval 5 loop TRUE } DEF myInterpolator ScalarInterpolator{ key [0, 0.5, 1] keyValue [0, 0.9, 0] } Shape {geometry Box {size } } Shape {appearance Appearance { material DEF myIntTarget Material {diffuseColor 0 1 1} } geometry Sphere {} } ROUTE mySensor.fraction_changed TO myInterpolator.set_fraction ROUTE myInterpolator.value_changed TO myIntTarget.set_transparency Esse é scalarlInterpolator. Como todos os outros interpoladores, possui os quatro campos acima descritos. O conteúdo de keyValue e value_changed é, contudo, um número escalar. Esse número pode ser utilizado para variar transaprência de um objeto, intensidade de uma luz, etc. É possível utilizá-lo também para gerar funções lineares baseadas no tempo do TimeSensor, como f = 1/t (t = tempo emitido pelo timeSensor). Ainda, é possível gerar grosseiramente funções periódicas, como a seno, cosseno, etc. O exemplo abaixo mostra um cone que muda sua rotação ao longo do tempo. Valores iguais garantem continuidade entre ciclos

163 Nós de Atuação Singular - Bindable
Alteram o estado do mundo Organizados em pilhas Somente o de cima da pilha é utilizado para alterar o mundo. São eles: Background Fog NavigationInfo Viewpoint Utilidades Mudança do avatar e da navegação do usuário Mudança do ambiente do mundo (nível de neblina, cores de background) Movimentar usuário entre pontos de vista Bindable nodes são nós que alteram o estado do mundo. Apenas um deles atua por vez. Para saber de quem é a vez de atuar, eles são organizados em pilhas. Somente o de cima da pilha é utilizado para alterar o mundo. Os nós bindable são os seguintes tipos: Background Fog NavigationInfo Viewpoint Esses nós são muito úteis pois permitem a mudança do avatar e da navegação do usuário, a mudança do ambiente do mundo (nível de neblina, cores de background, etc) e ainda movimentar usuário entre pontos de vista (estando eles em movimento ou não).

164 Nós de Atuação Singular - Bindable cont.
Funcionamento Nó ativado (bound) vai para cima da pilha Recebe TRUE em set_bind Emite TRUE em isBound Nó anteriormente ativado fica embaixo Emite FALSE em isBound Set_bind = FALSE remove nó da pilha. Se for o ativado: É removido da pilha Nó abaixo é ativado O funcionamento de nós bindable se dá da seguinte forma: Quando um nó é ativado, ele vai para cima da pilha. Isso é feito configurando o valor de seu campo set_bind para TRUE. Sendo ativado, o nó emite o valor TRUE no eventOut isBound. O nó anteriormente ativado é desativado e fica na pilha embaixo do nó que foi ativado. Esse, emite o valor FALSE no eventOut isBound. Se um nó tem seu valor de set_bind posto para FALSE, esse nó é removido da pilha. Se o nó que for removido tiver sido o que estava ativado, ele emite FALSE em no eventOut isBound, é removido da pilha e o nó abaixo dele na pilha passa a ser o nó ativado.

165 Nós de Atuação Singular - Bindable cont.
Exemplo: #VRML V2.0 utf8 DEF mySensor TimeSensor { cycleInterval 5 loop TRUE } Viewpoint { position description "inicial"} DEF myInterpolator OrientationInterpolator{ key [0, 0.5, 1] keyValue [ , , ] } Shape { appearance Appearance { material Material {diffuseColor } } geometry Box {size } } DEF myIntTarget Transform { children [ DEF myTouchSensor TouchSensor {} Shape {geometry Box {}} DEF boxView Viewpoint {position 0 3 0 orientation description "caixa"} ] } ROUTE mySensor.fraction_changed TO myInterpolator.set_fraction ROUTE myInterpolator.value_changed TO myIntTarget.set_rotation ROUTE myTouchSensor.isActive TO boxView.set_bind Aqui temos um exemplo de uso do nó viewpoint como um nó bindable. Um cubo branco gira dentro de uma plataforma vermelha. O cubo branco é ligado a um touchSensor que, ao ser ativado ativa também um segundo viewpoint que passa a ser visão do usuário. Esse viewpoint está acoplado ao cubo branco, girando junto com ele. Observe que, ao se soltar o botão do mouse, o viewpoint é posto para FALSE, removido da pilha, e o viewpoint anterior que estava abaixo e desativado é novamente ativado.

166 Inserindo código - Script
exposedField MFString url [] field SFBool directOutput FALSE Field SFBool mustEvaluate FALSE #E mais quantos quiser desses campos: eventIn Type? eventInName field Type? fieldName default value? eventOut Type? eventOutName } Criação de um nó com quaisquer campos Possbilita integração com linguagens como Javascript e Java O nó script permite a criação de nó das mais diferentes formas. Apesar de possuir três campos básicos e obrigatórios(url, directOutput e mustEvaluate), quaisquer outros podem ser inseridos para complementar as características funcionais do nó que se deseja construir. Apesar de sua flexibilidade, o nó script não permite a criação de exposedFields dentro de sua estrutura. Em contrapartida, através desse nó é possível a integração de VRML com linguagens como Javascript e Java. Os campos directOutput e mustEvaluate serão referenciados mais adiante nessa apresentação, mas não serão profundamente explicados. Para mais informações consulte tutoriais na Web. Basicamente, o mustEvaluate força o plug-in VRML a sempre avaliar o script e não guardá-lo para avaliá-lo juntamente com outros de uma vez só. Já o DirectOutput permite manipular diretamente com campo de nós, sem utilizar passagem de eventos para isso. A utilização deles mais adiante justificará melhor esses conceitos.

167 Inserindo código - Script cont.
Exemplo: #VRML V2.0 utf8 DEF mySensor TimeSensor { cycleInterval 5 loop TRUE } DEF outView Viewpoint { position description "inicial"} DEF myInterpolator OrientationInterpolator{key [0, 0.5, 1] keyValue [ , , ] } Group { children [DEF myTouchSensor2 TouchSensor {} Shape { appearance Appearance {material Material {diffuseColor } } geometry Box {size } } ] } DEF myIntTarget Transform { children [DEF myTouchSensor TouchSensor {} Shape {geometry Box {}} DEF boxView Viewpoint {position orientation description "caixa"} ] } DEF myScript Script { eventIn SFBool input eventOut SFBool output field SFBool boolValue TRUE url "javascript: function input(value, time){ if(value==boolValue)output = TRUE;}"} DEF myScript2 Script { eventIn SFBool input eventOut SFBool output url "javascript:function input(value, time){ ROUTE mySensor.fraction_changed TO myInterpolator.set_fraction ROUTE myInterpolator.value_changed TO myIntTarget.set_rotation ROUTE myTouchSensor.isActive TO myScript.input ROUTE myScript.output TO boxView.set_bind ROUTE myTouchSensor2.isActive TO myScript2.input ROUTE myScript2.output TO outView.set_bind Bem, aqui temos um exemplo de uso do nós script, o exemplo é parecido com o feito para o nó bindable. A diferença é que não é necessário ficar com o botão pressionado do mouse para o viewpoint permanecer encima da caixa branca. Em contrapartida, um outro sensor foi acoplado à caixa vermelha. Esse ativa o viewpoint anterior toda vez que o usuário se sentir tonto e quiser uma visão externa e mais tranqüila.

168 Mudança de Conteúdo – Switch
exposedField MFNode choice [] exposedField SFInt32 whichChoice -1 } Diferentes representações para uma mesma entidade Versões invisíveis continuam ativas Como obter valores inteiros? O nó Switch permite que um nó seja representado de diferentes formas, de acordo coma as necessidades do usuário. Basicamente, o nó possui uma lista de nós (campo choice) que são as N possíveis representações do nó no mundo. Todas elas estão presentes e ativas no mundo, mas só um delas realmente aparece. O campo whichChoice possui o número X = N-1 referenciando o enésimo nó da lista (Ex.: para obter o 1º nó, X tem que ter valor 0). Os nós que não aparecem continuam ativados. Então, se existe um nó timeSensor dentro de um dos nós desativados do switch, ele continuará contando, mesmo que não apare Para obter-se valores inteiros para inserir na whichChoice será necessária a criação de scripts, como os que veremos no exemplo seguinte.

169 Mudança de Conteúdo – Switch cont.
Exemplo: #VRML V2.0 utf8 DEF myScript Script { eventIn SFTime touchTime field SFInt32 number 4 eventOut SFInt32 output url "javascript: function initialize() {output = 0;} function touchTime(value, time) { if (output == number - 1) output = 0; else ++output;}" } Group { children [ DEF mySensor TouchSensor {} DEF mySwich Switch { whichChoice 0 choice [ Shape {geometry Box {}} Shape {geometry Sphere {}} Shape {geometry Cone {}} Shape {geometry Cylinder {}} ] } ] } ROUTE mySensor.touchTime TO myScript.touchTime ROUTE myScript.output TO mySwich.whichChoice Bem, aqui temos um exemplo de uso do nós switch. Nesse exemplo o switch varia sua forma entre as de um cubo, uma esfera, um cone e um cilindro. Para que fosse possível dar um movimento circular na escolhas das formas, fez-se necessário a inserção de um script, como pode ser visto para controlar o valor da posição de escolha da lista de nós do switch.

170 Níveis de Detalhe – LOD LOD { exposedField MFNode level [] field SFVec3f center 0 0 0 field MFFloat range [] } Diferentes representações para uma mesma entidade Mudança de representações de acordo com distância do usuário #VRML V2.0 utf8 LOD { range [10 20] level [ Inline {url "cadeiraBemDetalhada.wrl"} Inline {url "cadeiraDetalhada.wrl"} Inline {url "cadeiraSemDetalhes.wrl"} ] } O nó LOD (do inglês Level of Detail) permite que um nó seja representado de diferentes formas como no nó switch. A diferença é que, nesse caso, a mudança se dá automaticamente de acordo com a distância entre o avatar do usuário e a localização do nó. A utilidade desse nó é permitir que versões com maior resolução (mais polígonos) só estejam presentes no mundo quando o usuário estiver mais perto e possa ver os detalhes apresentados. Quando os usuários estiverem longe, versões com menos detalhes e, conseqüentemente, com menos polígonos serão apresentadas. Aqui ao lado , temos um exemplo de aplicação de LOD.

171 Codificação básica - ECMAScript
Linguagem oficial de VRML (Javascript 1.0) Variáveis Não precisam ter tipos nem valores definidos Podem mudar de tipo! Uso em VRML Script {url “javascript: (código)” ou “myScript.js”} Tipos/Valores básicos Undefined Null Boolean ECMAScript pode ser considerada a linguagem oficial de VRML. Historicamente, ela é a primeira versão do Javascript que substituiu a VRMLScript por ter sido padronizada primeiro. Apesar de ser a linguagem oficial, nem todos os navegadores e plug-ins aceitam seus comandos. Portanto, é bom ter cuidado quando utilizá-la. O uso de ECMAScript já foi apresentado aqui em exemplos anteriores. O código é inserido no nó Script, no campo url. Isso pode se dar de duas forma. A primeira, colocando-se o código entre chaves duplas e iniciado por “javascript: ”. A segunda é referenciar o arquivo de javascript, cuja terminação deve ser “.JS”, onde ele se encontra. OS tipos básicos dessa linguagem são: Undefined: tipo de uma variável com tipo indefinido (quando um valor nem tipo ainda lhe foi atribuído); Null: tipo de uma variável quando um valor não lhe foi atribuído, ou seja (a variável já possui tipo definido); Boolean: tipo booleano (true ou false, como SFBool); String: seqüência de caracteres, como SFString; Number: tipo numérico com valores entre 253 a Possui também os valores: NaN (Not a Number), +infinity, -infinity, -0 e +0; Object: semelhante a um objeto Java, possui um conjunto de propriedades (atributos) e métodos. Será visto em mais detalhe daqui a pouco; String Number Object

172 Codificação básica - ECMAScript cont.
Sintaxe e estrutura semelhante à Java “;” no fim de sentenças Operadores Unários:-, !, ++, --, typeof Binários: =, -, *, /, % Relacionais: <, <=, >, >=, ==, != Lógicos: &&, || Estruturas if(){}else{} ou a?b:c; while(){} for(;;){} arrays: MFString, MFVect3F, MFNode A sintaxe e a estrutura de ECMAScript são iguais as da linguagem Java. Os operadores unários, binários, lógicos e relacionais funcionam e são representados da mesma forma. Do mesmo modo, as estruturas de código também possuem a mesma sintaxe e funcionamento.

173 Codificação básica - ECMAScript cont.
Funções Básicas initialize() shutDown() eventsProcessed() Funções de processamento de eventos Exemplo: #VRML V2.0 utf8 Script { eventIn SFInt32 input eventOut SFInt32 output field SFInt32 mult field SFInt32 result url “javascript: function initialize() { mult = 2; } function input (value, time) {result = value*mult;} function eventsProcessed(){output = result;} function shutDown(){result = mult =0;}” } ECMAScript possui quatro tipos de funções básicas. São elas: initialize(): chamada quando o mundo é construído, serve para iniciar variáveis; shutDown(): chamada quando se sai do mundo, é utilizada para limpar variáveis ou locais em que se deixou lixo de informação; eventsProcessed(): é processada quando um conjunto de eventos ocorre sempre que possível (não é garantido o seu processamento toda vez que aquele conjunto de eventos ocorre) ao final dos mesmos; Funções de processamento de eventos: são aquelas que obterão os eventos de VRML e farão algo a respeito. Essas são as funções que possuem a maior parte do processamento normalmente. Abaixo, temos um exemplo bem simples de utilização desses campos.

174 Codificação básica - ECMAScript cont.
Objetos Criação function Vector() { this.x = 0; this.y = 0; this.z = 0; } Instanciação myVector1 = new Vector(); myVector2 = new Vector(1,2,3); Adição de atributos myVector2.name = “vetorNinja"; Criação de Métodos function vectorMultiply(scalar) { this.x *= scalar; this.y *= scalar; this.z *= scalar; } function Vector() { this.x = 0; this.y = 0; this.z = 0; this.multiply = vectorMultiply; } Exemplo de chamada: myVector2.multiply(a); O tipo Objeto é uma agregado de propriedades (campos) e métodos(funções). Funciona de forma parecida com Java. Ele possui um construtor para sua iniciação, cujos campos são referenciados pelo prefixo “this.”. Para instanciar um objeto, basta atribuir a nova variável um “new object()” com o sem parâmetros. Caso haja passagem de parâmetros, eles serão atribuídos de maneira seqüencial, condizendo com a ordem de inicialização no construtor. É possível adicionar novos atributos em um objeto mesmo após usa construção, como mostra o exemplo. Para se criar métodos num objeto, deve-se, primeiramente, criar uma função definida externamente ao objeto para representar esse método e, após isso, associá-lo a uma variável com o nome do método em si. A chamada se dá, então, pelo nome do método que representa a função dentro do objeto seguido pela passagem dos parâmetros dessa função. Temos aí um exemplo de chama de método.

175 Codificação básica - ECMAScript cont.
Objetos VRML Objetos ECMAScript pré-definidos Mapeiam tipos em VRML, adicionando funcionalidades SFFloat, SFInt32, SFTime -> Number SFBool -> Boolean SFSTRING -> String ... Exemplos de funções em objetos ECMAScript Vector: produto escalar, produto vetorial, tamanho normalização; Array: tamanho, conversão para String; Procurar referências de objetos antes de programar! Existem objetos pré-definidos em ECMAScript que mapeiam os tipos de dados existentes em VRML. Esses objetos, além de auxiliarem na interação entre as duas linguagens, provêem funções extras para facilitar a vida do programador. Exemplo disso são funções de cálculo de produtos escalar e vetorial para vetores ou de tamanho de um array e sua conversão para String. É importante, então, que sempre se leia sobre os métodos existentes nos objetos ECMAScript que mapeiam os tipos que se vai utilizar em um script para aumentar o reuso e poupar tempo de implementação. No final das transparências serão dadas referências para esse assunto.

176 Codificação básica - ECMAScript cont.
Browser Object Permite modificar o mundo virtual e a relação entre seus objetos Métodos Browser.getName() Browser.getVersion() Browser.getWorldURL() Browser.getCurrentFrameRate() Browser.getCurrentSpeed() Browser.setDescription(string description) Browser.loadURL(MFString url, MFString parameter) Browser.replaceWorld(MFNode nodes) Browser.createVrmlFromString(String string) Browser.createVrmlFromURL(MFString url, SFNode node, String eventIn) Browser.addRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn) Browser.deleteRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn) LEGENDA (campos do nó Script a ativar): Script.directOutput = TRUE Script.mustEvaluate = TRUE Nenhum do dois Aqui apresentamos um dos objetos disponíveis em ECMAScript e de grande importância na garantia de total controle sobre o seu mundo. O objeto Browser serve para manipular informações de seu navegador, obviamente. Mas, além disso, ele permite manipular seu mundo e a interação entre seus objetos. Observe a descrição de seus métodos abaixo. Alguns desses métodos requerem que o nó Script a que pertencem tenham valores específicos para os campos directOutput e mustEvaluateOutput. Distinguimos tal necessidade de acordo com a legenda. Os métodos que necessitam de mustEvaluate ativado estão em cor verde enquanto que os que precisam de directOutput ativado estão em laranja. Vamos à descrição dos nós: Browser.getName(): obtém nome (String) do navegador VRML utilizado. Ex.: “Cortona”; Browser.getVersion(): obtém versão (String) do navegador; Browser.getWorldURL(): obtém a URL (String) onde o mundo se encontra; Browser.getCurrentFrameRate(): obtém a taxa de frames em que o mundo está rodando; Browser.getCurrentSpeed(): obtém a velocidade de deslocamento do avatar do usuário; Browser.setDescription(string description): define a descrição do mundo (configura o campo de Description do nó WorldInfo). Parâmetro description: string contendo descrição do mundo. Esse método precisa que o campo mustEvaluate do nó Script ao qual pertence esteja ativado (TRUE); Browser.loadURL(MFString url, MFString parameter): carrega um novo mundo de um outro arquivo. Parâmetros:MFString url:lista de URLs onde possivelmente o mundo a ser carregado se encontra; MFString parameter:outros parâmetros a serem passados (igual ao nó AnchorMode - consultar). Esse método precisa que o campo mustEvaluate do nó Script ao qual pertence esteja ativado (TRUE); Browser.replaceWorld(MFNode nodes): substitui o mundo atual por um outro passado como parâmetro. Esse método precisa que o campo mustEvaluate do nó Script ao qual pertence esteja ativado (TRUE); Browser.createVrmlFromString(String string): cria um objeto VRML no mundo a partir de sua descrição em VRML passada em formato String (sem o cabeçalho”VRML V2.0 utf8”); Browser.createVrmlFromURL(MFString url, SFNode node, String eventIn): cria um objeto VRML no nó passado como segundo parâmetro a partir de um arquivo VRML localizado numa das URLs (pode ser um array delas) passadas no primeiro parâmetro. O terceiro parâmetro indica a que campo de entrada de evento do browser o nó a receber os novos objetos (que foi passado como segundo parâmetro) será passado quando na chamada desse método; Browser.addRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn): cria uma nova rota do campo passado no segundo parametro (pertencente ao nó passado no primeiro parâmetro) para o campo passado no quarto parâmetro (pertencente ao nó passado no terceiro parâmetro). Esse método precisa que o campo directOutput do nó Script ao qual pertence esteja ativado (TRUE); Browser.deleteRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn):destrói a rota que liga o campo passado no segundo parametro (pertencente ao nó passado no primeiro parâmetro) ao campo passado no quarto parâmetro (pertencente ao nó passado no terceiro parâmetro) . Esse método precisa que o campo directOutput do nó Script ao qual pertence esteja ativado (TRUE);

177 Codificação Avançada - Java
VRML permite uso de chamada a classes Java Passos para se gerar uma classe Java compatível com o nó Script de VRML Importa pacote VRML de Java; Classe deve estender classe Script; Atrela variáveis do nó Script a variáveis da classe Java; Processa/Captura-se eventos recebidos de VRML; Processa os dados...; Atribui resultados às variáveis atreladas a eventOut; Adiciona localização das classes VRML do navegador VRML no CLASSPATH; Gera o “.class”; Adiciona-o ao campo url do nó Script. É possível adicionar código Java à seu mundo virtual. O processo é bastante simples. Basta seguir os passos abaixo. Esses passos estão relacionados, em sua maioria, ao exemplo dado a seguir: Colocar importação do pacote VRML de Java no arquivo onde as classes estão descritas; Fazer com que a classe estenda a classe Script; Atrelar variáveis do nó Script a variáveis da classe Java. Faz-se isso dentro do método initialize(); Processar eventos recebidos de VRML através do método processEvent; Processa dados da maneira que quiser Atribui resultados às variáveis atreladas a eventOut; Adicionar localização das classes VRML do navegador VRML no CLASSPATH; Gera o “.class” – gerar para a versão 1.1 para garantir compatibilidade com navegadores; Adiciona o arquivo “.class” ao campo url do nó Script no arquivo VRML;

178 Codificação Avançada - Java
Exemplo: gerador de ondas senoidais Objetivo Transformar sinal de um TimeSensor em valores de seno TimeSensor Script Interpolador set_fraction set_... fraction_changed fraction_changed #VRML V2.0 utf8 DEF myTimer TimeSensor { cycleInterval 5 loop TRUE startTime 0 stopTime -1 } DEF myScript Script { eventIn SFFloat set_fraction eventOut SFFloat fraction_changed field SFFloat amplitude 1 url “GeraSeno.class" } ROUTE myTimer.fraction_changed TO myScript.set_fraction Aqui temos um exemplo que explicará melhor o processo. Esse exemplo transformará o sinal emitido por um TimeSensor em valores de uma onda senoidal (de -1 a 1). Esse valor pode então ser ligado a um interpolador para gerar movimentos senoidais em objetos. Aqui, entretanto, abordaremos, apenas, o time Sensor e o nó Script. Veja abaixo o arquivo VRML que descreve esses dois nós. Observem que eles estão ligados entre si por uma rota e que o nó Script possui um campo de entrada para receber sinais do TimeSensor e um de saída pro onde enviará os sinais de seno. Ainda, ele possui um campo de amplitude, onde pode se definir a amplitude da onda senoidal sendo criada. O nó script faz referência a um arquivo “.class” que contém o código Java responsável por transformar o sinal do Timer, código esse descrito a seguir.

179 Codificação Avançada - Java cont.
Exemplo: GeraSeno.java import vrml.*; import vrml.node.*; import vrml.field.*; public class SineGen extends Script { private SFFloat fraction_changed; private SFFloat amplitude; public void initialize() { fraction_changed = (SFFloat) getEventOut("fraction_changed"); amplitude = (SFFloat) getField("amplitude"); } public void processEvent (Event e) { if (e.getName().equals("set_fraction")) { sine((ConstSFFloat)e.getValue()); } } private void sine (ConstSFFloat fraction) { double result = Math.sin(fraction.getValue() * Math.PI * 2); result *= amplitude.getValue(); fraction_changed.setValue((float)result); } } 1. Pacotes VRML 2. Extensão de Script 3. Atrelamento entre variáveis 4. Processamento de eventos A descrição da classe do exemplo anterior segue aqui. Aqui temos um exemplo bem simples de como uma classe em Java deve ser adaptada para seu uso com VRML. O código está relacionado aos passos anteriormente mencionados: Colocar importação do pacote VRML de Java no arquivo onde as classes estão descritas; Fazer com que a classe estenda a classe Script; Atrelar variáveis do nó Script a variáveis da classe Java. Faz-se isso dentro do método initialize(); Processar eventos recebidos de VRML através do método processEvent; Processa dados da maneira que quiser Atribui resultados às variáveis atreladas a eventOut; 5. Processamento de dados 5. Resultados passados para EventOut

180 Codificação Avançada - Java
Exemplo: Gerando o .class Modifica o classpath set CLASSPATH=C:\Arquivos de programas\Arquivos comuns\ParallelGraphics\Cortona\classes.zip; Gera o class javac -target 1.1 GeraSeno.java Adiciona o nome do “.class” ao nó Script DEF myScript Script { eventIn SFFloat set_fraction eventOut SFFloat fraction_changed field SFFloat amplitude 1 url “GeraSeno.class" } Aqui temos os passos para compilação e geração do classe. Acredito que todos vocês já saibam fazer isso. 6. Adicionar localização das classes VRML do navegador VRML no CLASSPATH; 7. Gera o “.class” – gerar para a versão 1.1 para garantir compatibilidade com navegadores; 8. Adiciona o arquivo “.class” ao campo url do nó Script no arquivo VRML;

181 Referências Transparências comentadas!! Floppy’s VRML 97 Tutorial:
Web 3D Consortium – VRML Archives Funções de ECMAScript: Aqui estão as referências da 5ª aula de VRML.


Carregar ppt "VRML Virtual Reality Modeling Language"

Apresentações semelhantes


Anúncios Google