• Nenhum resultado encontrado

VRML Virtual Reality Modeling Language

N/A
N/A
Protected

Academic year: 2022

Share "VRML Virtual Reality Modeling Language"

Copied!
19
0
0

Texto

(1)

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

**Atualizar data de apresentação e nome do apresentador!

2

Roteiro

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

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.

(2)

3

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.

4

Luzes

„

Headlight off!

ÎPreferences – Navigation - Headlight onX

„

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;

(3)

5

Luzes - DirectionalLight

„

DirectionalLight {

ambientIntensity 0

color 1 1 1

direction -1 0 -1

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 é 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.

6

Luzes - DirectionalLight

„

Iluminação hierárquica

ÎIlumina todos abaixo de seu pai na hierarquia

Copyright 1998-2001 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.

(4)

7

Luzes - DirectionalLight

#VRML V2.0 utf8

NavigationInfo {headlight FALSE}

DirectionalLight { ambientIntensity 1 intensity 1 color 1 1 0 direction -1 -1 -1 }

Shape {

appearance Appearance { material Material {

diffuseColor1 1 1 }

}

geometry Box {}

}

Viewpoint {

orientation 1 1 0 -0.78 position -4 4 4 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.

8

Luzes - PointLight

„ 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

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.

(5)

9

Luzes - PointLight

#VRML V2.0 utf8

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}

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.

10

Luzes - SpotLight

„

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

cutOffAngle BeamWidth

raio

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 beamWidtha 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.

(6)

11

Luzes - SpotLight

#VRML V2.0 utf8

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 {

diffuseColor1 1 1}}

geometry Box {size 10 10 0.1}}

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.

12

„

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 }

Sons - Sound

minBack

minFront

maxFront maxBack

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.

(7)

13

„

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

Sons - Sound

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.

14

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.

(8)

15

„

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

Navegação – NavigationInfo

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.

16

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:

EventOuteventos que geram informação

EventInaceitam 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 EnventIndesse 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 ).

(9)

17

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.

18

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

ÎSensores ÎInterpoladores ÎScripts

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

(10)

19

Eventos

„ Exemplos

ok

? ok

ok ok

ok?

Fan oute fan in em mesma cascata

Fan inde cascatas

distintas Loopnuma cascata

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 incom 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.

20

Sensores

„ Tipos de sensores

ÎEnvironmental

• 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

(11)

21

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

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;

22

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 { minFront5 minBack 5 maxFront50 maxBack 50

source DEF MySoundAudioClip { 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.

(12)

23

Basta ver pra acontecer – VisibilitySensor

„ 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

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);

24

Basta ver pra acontecer – VisibilitySensor

cont.

„ Exemplo

ÎCanhão “atira” quando o usuário o vê

#VRML V2.0 utf8

DEF mySensorVisibilitySensor { size 1.2 1.2 1.2

center 0 2.7 0} Sound {

minFront 5 minBack 5 maxFront 50 maxBack 50

source DEF mySoundAudioClip { 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.

(13)

25

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)

ProximitySensorssã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.

26

Chegue mais! – ProximitySensor

cont.

„ Exemplo

ÎCanhão “atira” quando o usuário se aproxima

#VRML V2.0 utf8

DEF mySensorProximitySensor { size 15 15 15

} Sound {

minFront 10 minBack 10 maxFront 100 maxBack 100

source DEF mySoundAudioClip { 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.

(14)

27

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

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ó;

28

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 30 30 30 }

}

collide TRUE }

Viewpoint { position 0 0 30 }

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.

(15)

29

„ 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 }

Detecção de Toque– TouchSensor

Posição do mouse

hitPosition hitNormal

Tela do monitor

Objeto com TouchSensor

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

30

#VRML V2.0 utf8 Group { children [

Group { children [

DEF PositionOrientationTouchSensor {}

Inline {url "canhao.wrl"} ] } DEF ShotSensorTouchSensor {}

DEF shotAim Transform { children [ Sound {

minFront50 minBack 50 maxFront100 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

Detecção de Toque– TouchSensor

„ Detecção de clique, arraste e sobreposição com o mouse em objetos com mesmo nó pai.

Group

Group Touch Sensor

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.

(16)

31

„ 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 }

Rotação Manual – SphereSensor

Posição do mouse trackPoint offSet

Tela do monitor

Objeto com SphereSensor

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 Pipara 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);

32

#VRML V2.0 utf8

NavigationInfo {type "NONE"}

Group { children [

DEF MySensorSphereSensor {autoOffsetTRUE}

DEF boxTransformTransform { children

Shape{

appearance Appearance { material Material {

diffuseColor 0 1 1 }

}

geometry Box{}

} } ] }

ROUTE MySensor.rotation_changed TO boxTransform.rotation

Rotação Manual – SphereSensor

„ Detecção de rotação com o mouse em objetos com mesmo nó pai.

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.

(17)

33

„ 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 }

Rotação Manual Restrita – CylinderSensor

Posição do mouse trackPoint offSet

Tela do monitor

Objeto com SphereSensor DiskAngle

y

2 1

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 Pipara 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;

34

#VRML V2.0 utf8 Group {

children [

DEF mySensorCylinderSensor {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

Rotação Manual Restrita – CylinderSensor

„ Detecção de rotação no eixo y com o mouse em objetos com mesmo nó pai.

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.

(18)

35

„ 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 }

Translação Planar Manual – PlaneSensor

maxPosition

minPosition y

maxPosition minPosition

x

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 Pipara 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.

36

#VRML V2.0 utf8

NavigationInfo {type "EXAMINE"}

Shape {geometry Box{size5 5 0.1}}

Transform { translation 0 0 1 children [

DEF mySensorPlaneSensor { maxPosition 2.2 2.2 minPosition -2.2 -2.2 }

DEF myBoxTransform { children Shape {

appearance Appearance {

material Material {diffuseColor0.5 0 0} } geometry Box {size 0.3 0.3 0.3} } }

] }

Viewpoint {position0 0 30}

ROUTE mySensor.translation_changed TO myBox.translation

Translação Planar Manual – PlaneSensor

„ Detecção de translação no plano XY com o mouse em objetos com mesmo nó pai.

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.

(19)

37

„ 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

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.

Referências

Documentos relacionados

OS BENS SERÃO VENDIDOS NO ESTADO DE CONSERVAÇÃO EM QUE SE ENCONTRAM, NÃO CABENDO AOS COMITENTES NEM AO LEILOEIRO QUALQUER RESPONSABILIDADE QUANTO À GARANTIA,

Não o tinha porém reconhecido, o que era de suma importância, pois além de existir a mãe do fazendeiro lá para as bandas de Minas, o sujeito ainda estava robusto e podia bem

Prestadores Prestadores Ciclo de Debates Ciclo de Debates GV Sa GV Sa ú ú de de 18.outubro.2006 18.outubro.2006 1. Aç ções SulAm ões SulAmé érica rica - - Curto/Mé

Descobriu-se mais tarde que o Jorge tinha desaparecido depois da sua mãe, Janine, lhe ter dado 60 euros para pagar a aparelhagem que tínhamos levado de minha casa!. Mas ele não deu

Este trabalho tem como objetivo a elaboração de uma tabela regional que servirá para estimar os volumes comer- ciais de fustes de árvores em pé, para um grupo de espécies

Entretanto, para se explorar de forma mais otimizada a fixação biológica de nitrogênio (FBN) é necessário que se conheça a ecologia das bactérias do grupo dos rizóbios

Após o corte longitudinal a 1/3 da largura verifica-se que o resultado são duas fitas: uma com 1/3 da largura, com maior diâmetro e com duas voltas; e outra mais estreita mas que

Esta criatura é derrubada: a próxima carta jogada nela que usaria o valor de movimento rápido utilizará seu valor de movimento lento (seu bônus de jogo sujo não se aplica).