VRML Virtual Reality Modeling Language

Documentos relacionados
Índice 1. INTRODUÇÃO E BREVE HISTÓRICO 1 2. CARACTERÍSTICAS BÁSICAS DE VRML 2 3. GERANDO MUNDOS VRML 3 4. COMBINANDO VRML E JAVASCRIPT 36

VRML Virtual Reality Modeling Language

Virtual Reality Modeling Language

VRML Virtual Reality Modeling Language

1. Realidade Virtual 1.1 Introdução 1.2 VRML Histórico VRML 1.0 VRML 2.0 VRML Aplicações

Sistemas Multimídia Aula 3 VRML

APRESENTAÇÃO... 3 IGEO... 3 ACESSO AO SISTEMA... 4 MANUAL DO USUÁRIO... 4 FUNCIONALIDADES... 5 NAVEGAÇÃO E CONSULTA... 5 MANIPULAÇÃO DE CAMADAS...

DIRETORIA DE PESQUISA E PÓS-GRADUAÇÃO PROJETO: TECNOLOGIAS DE INFORMAÇÃO E COMUNICAÇÃO NO PROCESSO DE ENSINO E APRENDIZAGEM DE MATEMÁTICA

1º Teste Computação Gráfica

Aula 4 TECNOLOGIA EM JOGOS DIGITAIS PROGRAMACAO E INTEGRACAO DE JOGOS I. Marcelo Henrique dos Santos

Sumário APRESENTAÇÃO...3 ACESSO AO SISTEMA...4 FUNCIONALIDADES...5 SIG-PCJ... 3 ACESSANDO O SISTEMA VIA WEB...4 MANUAL DO USUÁRIO...

Curso Básico. Profa. Dra. Elisamara de Oliveira

Manual do Navegador Sig Cuiabá

SUMÁRIO 1. APRESENTAÇÃO FUNCIONALIDADES COMUNS AOS USUÁRIOS... 3

Ambiente de programação

A terceira dimensão. Modelagem tridimensional Elaboração tridimensional Realidade virtual

VRML2.0. Tutorial. Marcos Carrard

EBRcart2 digital cart machine

Realidade Virtual: Conceitos e Aplicações REALIDADE VIRTUAL

Autodesk 3ds Max - Primitivas

FUNDAMENTOS DE SISTEMAS MULTIMÍDIA INTEGRAÇÃO DE OBJETOS MPEG-4

SEL-0339 Introdução à Visão Computacional. Aula 3 Processamento de Imagens Coloridas

Workshop - A Robótica em Contexto Educativo

Cosmo Worlds. truques & dicas. cosmo Worlds. José Carlos Miranda 1

AULA: BrOffice Impress segunda parte

CATIA V5 TREINAMENTO - MODELAGEM SÓLIDA TUTORIAL - 01 DESENVOLVIDO EM CATIA V5 SM - COMPUTAÇÃO GRÁFICA

Aula 5 TECNOLOGIA EM JOGOS DIGITAIS PROGRAMACAO E INTEGRACAO DE JOGOS I. Marcelo Henrique dos Santos

INF Fundamentos de Computação Gráfica /1

INSTALAÇÃO E CONFIGURAÇÃO

DESENVOLVIMENTO DE UM SOFTWARE DE GERAÇÃO E VISUALIZAÇÃO DE NANOESTRUTURAS

Explorar Restrições Esboço

Manual do programa de cálculo de grelhas equivalentes

Loops. Loops Simples Switches Simples Loops Encadeados Switches Encadeados Utilizando Loops e Switches

A terceira dimensão. A terceira dimensão. Modelagem tridimensional. A terceira dimensão Wilson de Pádua Paula Filho

MANUAL DO USUÁRIO Panoramic Cam X-Pheral - DC187

APOSTILA LOUSA INTERATIVA SMARTBOARD

Orientações sobre a apostila eletrônica

1 2 D I C A S I N F A L Í V E I S SMARTPHONES EBOOK. [ ] michael oliveira

HANDS-ON PROGRAMAÇÃO DE JOGOS PARA CRIANÇAS

Tutorial sobre o uso da ferramenta de autoria A Ferramenta de Autoria - Célula

Administração Central. Unidade do Ensino Médio e Técnico Cetec Capacitações São Paulo

TUTORIAL VIDEO - HANGOUTS ON AIR. Siga o passo a passo para que possa criar e transmitir um evento.

Autodesk Inventor 9 DocTec4 Construção de um Modelo Tridimensional Parte 1

Capítulo 3 Primeiros Passos em OpenGL Função Desenha Função Teclado Função Inicializa Programa Principal...

CRIAÇÃO RÁPIDA DE PROGRAMAS (SHOWS)

Tutorial básico para Kdenlive

CURSO BÁSICO. Ao selecionar a sua disciplina, aparecerá a página principal contendo as informações e as atividades disponíveis.

Solid Edge ST6. Tutorial 1. Modelando um pino MODELAGEM SÍNCRONA E ORDENADA (SYNCHRONOUS AND ORDERED):

Configurações. Alterar o papel de parede

Réguas, a Flecha Azul e os Marcadores

3. Conhecimentos Básicos

Aula 3 - Ondas Eletromagnéticas

POV-Ray. André Tavares da Silva.

ACESSANDO O EADFASA. Passo a passo para acadêmicos. Núcleo de Educação a Distância - NEAD

Processamento de Imagens Coloridas. Prof. Adilson Gonzaga

Tutorial básico para Kdenlive

BLOCO LOOP. Figura 1 Bloco loop (repetir para sempre) Figura 2 Bloco loop (repetir até o sensor de toque ser activado) PARÂMETROS DO BLOCO LOOP

Tarefa 03 Professor Bernadelli

GUIA PRÁTICO. Câmera frontal. Diminuir/ Aumentar volume. Tecla Liga/ Desliga. Câmera. Sensor de impressão digital 5026J CJB1L43ALBRA

Material reorganizado e adaptado por: Suéllen Rodolfo Martinelli. Disponibilizado em:

Manual de Utilização do Convert Video. Passo Fundo, abril de Av. Presidente Vargas, 1305 / Sala 201 Passo Fundo RS

Manual para App Android e Software Windows

Física 1. Resumo e Exercícios P1

Tutorial de instalação e configuração do Software Giga VMS

thereiny Manual do Usuário ThereMy

SOLID EDGE ST6 TUTORIAL 9 GERANDO VISTAS A PARTIR DE UM MODELO 3D. Aqui isso será feito com o corpo da Biela que você desenhou no tutorial 6.

ELABORADO POR ALBINO SZESZ JUNIOR E JEAN POPOATZKI (NUTEAD/UEPG) PONTA GROSSA, MARÇO DE 2017

Manual Caça-Pardal e Caça-Radares

SIMULAÇÃO DO LABORATÓRIO DE SUPERFÍCIES EQUIPOTENCIAIS BASEADA EM REALIDADE VIRTUAL

Fís. Monitor: Leonardo Veras

LISTA 2 ESPELHOS PLANOS (MÓD. 3 E 4)

Planejamento de Produção

Manual do Usuário Instrutor

Utilização e visão geral dos aplicativos de Ensino Digital EvoBooks

Velocidade do Som. Comprimento da Onda

MANUAL DE OPERAÇÃO WCV EQUIPAMENTOS ELETRÔNICOS LTDA AL. DOS ANAPURUS, 1939 MOEMA - SÃO PAULO BRASIL

Transcrição:

Roteiro VRML Virtual Reality Modeling Language PRIMITIVAS AVANÇADAS II Baseada na apresentação de: Márcio Bueno, Paulo Gonçalves de Barros, Dênio Mariz Judith Kelner, Alejandro Frery 1. O que é VRML 2. Histórico 3. Objetivos da VRML 4. VRML, Internet e WWW 5. Visão geral do VRML 6. Estrutura do Arquivo VRML 7. Conceitos-chave 8. Semântica dos Nós 9. Primitivas Básicas 10.Primitivas Avançadas 2 **Atualizar data de apresentação e nome do apresentador! 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. 1 2

Primitivas Básicas e Avançadas Luzes 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 3 Headlight off! 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 4 SpotLight: cone de luz 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. 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. 3 4

Luzes - DirectionalLight DirectionalLight { ambientintensity 0 color 1 1 1 direction -1 0-1 intensity 1 on TRUE Luzes - DirectionalLight Iluminação hierárquica Ilumina todos abaixo de seu pai na hierarquia Raiz Group Raios de luz paralelos luz do sol 5 Copyright 1998-2001 Vapour Technology Ltd. 6 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 é 0 0-1, 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. 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. 5 6

Luzes - DirectionalLight Luzes - PointLight NavigationInfo {headlight FALSE DirectionalLight { ambientintensity 1 intensity 1 color 1 1 0 direction -1-1 -1 Shape { appearance Appearance { material Material { diffusecolor 1 1 1 geometry Box { Viewpoint { orientation 1 1 0-0.78 position -4 4 4 description "view 1" 7 PointLight { ambientintensity 0 attenuation 1 0 0 color 1 1 1 intensity 1 location 0 0 0 on TRUE radius 100 Luz emana de ponto no espaço lâmpada incandescente 8 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. 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*r 2 ) 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. 7 8

Luzes - PointLight Luzes - SpotLight NavigationInfo {headlight FALSE PointLight { ambientintensity 1 intensity 1 color 1 1 0 attenuation 0 0.8 0 location 0 0 0 radius 30 DEF mysphere Transform { translation 2 0 0 children Shape { appearance Appearance { material Material {diffusecolor 1 1 1 geometry Sphere { Transform { translation 4 0 0 children USE mysphere Transform { translation -4 0 0 children USE mysphere Transform {translation -8 0 0 children USE mysphere 9 SpotLight { ambientintensity 0 attenuation 1 0 0 beamwidth 1.57 color 1 1 1 cutoffangle 0.78 direction 0 0-1 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 raio cutoffangle BeamWidth 10 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. 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*r 2 ) 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. 9 10

Luzes - SpotLight Sons - Sound NavigationInfo {headlight FALSE SpotLight { ambientintensity 1 attenuation 0 0.75 0 beamwidth 1.57 color 1 1 1 cutoffangle 0.7 direction 0 0-1 intensity 1 location 0 0 5 on TRUE radius 10 Shape { appearance Appearance { material Material { diffusecolor 1 1 1 geometry Box {size 10 10 0.1 11 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 maxfront direction 12 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. 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. 11 12

Sons - Sound 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 13 Exemplo Música ambiente Sound { maxback 50 maxfront 50 minback 5 minfront 5 source AudioClip { description "Musica ambiente" loop TRUE url "musica.mid" spatialize FALSE 14 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. 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. 13 14

Navegação NavigationInfo 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 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 15 16 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. 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 http://web3d.vapourtech.com/tutorials/vrml97/en/nodes.html ). 15 16

Rotas Eventos e Rotas cont. 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 Sensor EventOut TouchTime Route Sound EventIn StartTime Se houver objetos com mesmo nome, todos serão afetados! 17 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 Sensores Interpoladores Scripts 18 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. 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. 17 18

Eventos Sensores Exemplos Fan out e fan in em mesma cascata ok? Fan in de cascatas distintas ok ok? Loop numa cascata ok ok Tipos de sensores Environmental TimeSensor VisibilitySensor ProximitySensor Collision Pointing-device TouchSensor SphereSensor CylinderSensor PlaneSensor 19 20 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. 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 19 20

Contando o tempo TimeSensor 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 Contando o tempo TimeSensor Exemplo Som tocado a cada 3 segundos 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 cont. 21 22 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; 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. 21 22

Basta ver pra acontecer VisibilitySensor Basta ver pra acontecer VisibilitySensor cont. VisibilitySensor { exposedfield SFVec3f center 0 0 0 exposedfield SFBool enabled TRUE exposedfield SFVec3f size 0 0 0 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 23 Exemplo Canhão atira quando o usuário o vê DEF mysensor VisibilitySensor { size 1.2 1.2 1.2 center 0 2.7 0 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 24 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); 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. 23 24

Chegue mais! ProximitySensor ProximitySensor { exposedfield SFVec3f center 0 0 0 exposedfield SFBool enabled TRUE exposedfield SFVec3f size 0 0 0 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) 25 Chegue mais! ProximitySensor Exemplo Canhão atira quando o usuário se aproxima DEF mysensor ProximitySensor { size 15 15 15 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 cont. 26 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. 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. 25 26

Obstruindo o Caminho Collision Collision { exposedfield MFNode children [] exposedfield SFBool collide TRUE eventout SFTime collidetime field SFNode proxy NULL field SFVec3f bboxcenter 0 0 0 field SFVec3f bboxsize -1-1 -1 eventin MFNode addchildren eventin MFNode removechildren Controla detecção de colisão entre nós Nó de agrupamento Obstruindo o Caminho Collision Exemplo Não é possível encostar no canhão NavigationInfo{type "WALK" Collision { children Inline { url "canhao.wrl" proxy Shape { geometry Box { size 30 30 30 collide TRUE Viewpoint { position 0 0 30 cont. 27 28 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ó; 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. 27 28

Detecção de Toque TouchSensor 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 Posição do mouse hitnormal hitposition Objeto com TouchSensor Tela do monitor 29 Detecção de Toque TouchSensor Detecção de clique, arraste e sobreposição com o mouse em objetos com mesmo nó pai. Group Touch Sensor Group { children [ 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 Group 30 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; 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. 29 30

Rotação Manual SphereSensor Rotação Manual SphereSensor SphereSensor { exposedfield SFBool enabled TRUE eventout SFBool isactive exposedfield SFBool autooffset TRUE exposedfield SFRotation offset 0 1 0 0 eventout SFRotation rotation_changed eventout SFVec3f trackpoint_changed Posição do mouse trackpoint offset Objeto com SphereSensor Tela do monitor 31 Detecção de rotação com o mouse em objetos com mesmo nó pai. 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 32 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 P i para um posição final P f. Se AutoOffset for igual a TRUE, da próxima vez que o objeto for rodado ele começará a rodar da posição P f. Se o AutoOffset for igual a FALSE, da próxima vez que o objeto for rodado ele começará a rodar da posição P i ; 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); 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. 31 32

Rotação Manual Restrita CylinderSensor Rotação Manual Restrita CylinderSensor CylinderSensor { exposedfield SFBool enabled TRUE eventout SFBool isactive exposedfield SFBool autooffset TRUE exposedfield SFFloat offset 0 exposedfield SFFloat diskangle 0.262 exposedfield SFFloat maxangle -1 exposedfield SFFloat minangle 0 eventout SFRotation rotation_changed eventout SFVec3f trackpoint_changed 2 y 1 DiskAngle Posição do mouse trackpoint offset Objeto com SphereSensor Tela do monitor 33 Detecção de rotação no eixo y com o mouse em objetos com mesmo nó pai. 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 34 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 P i para um posição final P f. Se AutoOffset for igual a TRUE, da próxima vez que o objeto for rodado ele começará a rodar da posição P f. Se o AutoOffset for igual a FALSE, da próxima vez que o objeto for rodado ele começará a rodar da posição P i ; 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; 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. 33 34

Translação Planar Manual PlaneSensor Translação Planar Manual PlaneSensor PlaneSensor { exposedfield SFBool enabled TRUE eventout SFBool isactive exposedfield SFBool autooffset TRUE exposedfield SFVec3f offset 0 0 0 exposedfield SFVec2f maxposition -1-1 exposedfield SFVec2f minposition 0 0 eventout SFVec3f trackpoint_changed eventout SFVec3f translation_changed maxposition y minposition minposition x maxposition 35 Detecção de translação no plano XY com o mouse em objetos com mesmo nó pai. NavigationInfo {type "EXAMINE" Shape {geometry Box{size 5 5 0.1 Transform { translation 0 0 1 children [ DEF mysensor PlaneSensor { maxposition 2.2 2.2 minposition -2.2-2.2 DEF mybox Transform { children Shape { appearance Appearance { material Material {diffusecolor 0.5 0 0 geometry Box {size 0.3 0.3 0.3 ] Viewpoint {position 0 0 30 ROUTE mysensor.translation_changed TO mybox.translation 36 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 P i para um posição final P f. Se AutoOffset for igual a TRUE, da próxima vez que o objeto for deslocado ele começará a deslocar da posição P f. Se o AutoOffset for igual a FALSE, da próxima vez que o objeto for rodado ele começará a deslocar da posição P i ; 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. 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. 35 36

Referências Floppy s VRML 97 Tutorial: http://web3d.vapourtech.com/tutorials/vrml97/ Web 3D Consortium VRML Archives http://www.web3d.org/x3d/vrml/index.html 37 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. 37