Alberto Raposo – PUC-Rio INF 1366 – Computação Gráfica Interativa X3D – Iluminação,...
Transcript of Alberto Raposo – PUC-Rio INF 1366 – Computação Gráfica Interativa X3D – Iluminação,...
Alberto Raposo – PUC-Rio
INF 1366 – Computação Gráfica Interativa
X3D – Iluminação, Environment Sensors e Protótipos
Alberto B. Raposo
http://www.tecgraf.puc-rio.br/~abraposo/INF1366
Alberto Raposo – PUC-Rio
Iluminação
• Conceito básico: fontes de luz virtual atuam como fontes de raios que atingem objetos e chegam ao viewpoint– X3D não define forma
de renderização (raytracing, etc.) – é definição de maisalto nível
Alberto Raposo – PUC-Rio
Renderização
• Processo que combina as contribuições de todas as fontes de luz, formas e efeitos, computando o que será visto pixel a pixel.
• Muitas fontes de luz “encarece” a renderização– Browsers X3D tendem a limitar o número de
fontes de luz em 8.– Não há sombras geradas por objetos
Alberto Raposo – PUC-Rio
3 tipos de fontes de luz em X3D
• Direcional
• Puntual
• Spot
Alberto Raposo – PUC-Rio
DirectionalLight
• Todos os raios em uma direção. Intensidade constante (como se fosse o Sol)
Alberto Raposo – PUC-Rio
DirectionalLight
Alberto Raposo – PUC-Rio
PointLight
Alberto Raposo – PUC-Rio
PointLight
Alberto Raposo – PUC-Rio
SpotLight
Alberto Raposo – PUC-Rio
SpotLight
Alberto Raposo – PUC-Rio
Background Node
• Provê cubo que “rodeia” a cena, definindo 6 URLs com as imagens que representarão o fundo
• TextureBackground Node– Idêntico ao Background, só que usa 6
ImageTexture Nodes ao invés de URLs
Alberto Raposo – PUC-Rio
Background Node
Alberto Raposo – PUC-Rio
Fog
• Simula a Fog:– Branco ou cinza: neblina– Preto: “night-time” effect
Alberto Raposo – PUC-Rio
Fog
Type accessType Name Default Range Profile
SFColor inputOutput Color 1 1 1 Immersive
SFString inputOutput fogType “LINEAR” [ “LINEAR” | ”EXPONENTIAL”]
Immersive
SFFloat inputOutput visibilityRange 0 [0, ) Immersive
SFBool inputOnly set_bind Immersive
SFBool outputOnly isBound Immersive
SFTime outputOnly bindTime Immersive
SFNode inputOutput metadata NULL [X3DMetadataObject] Core
visibilityRange: distância da câmera onde objetos estarão totalmente obscurecidospelo Fog
fogType: como o fog se comporta em função da distância do objeto
Alberto Raposo – PUC-Rio
Environment Sensors
• LoadSensor– Lida com recursos externos, indicando quando
imagens de texturas, sons e outros arquivos X3D são carregados antes de começar uma animação.
• ProximitySensor
• VisibilitySensor
Alberto Raposo – PUC-Rio
ProximitySensor
• Detecta mudanças de posição e orientação do observador em relação a uma caixa que delimita o volume ativo do sensor
Alberto Raposo – PUC-Rio
VisibilitySensor
• Similar ao ProximitySensor, mas detecta quando o volume associado ao objeto está no campo de visão do usuário.
Alberto Raposo – PUC-Rio
Sound
• Define fonte, localização, intensidade, direção e características espaciais de uma fonte de som na cena.
• Tem um nóAudioClip comofilho
Alberto Raposo – PUC-Rio
AudioClip
• Refere-se a um arquivo de áudio externo
Alberto Raposo – PUC-Rio
Prototyping
• Criação de novos nós que podem ser reutilizados repetidamente em X3D, como qualquer outro nó.
• ProtoDeclare precede ProtoInstance usada na cena• ExternProtoDeclare
– Permite manter “cópia mestre” do protótipo em algum lugar e reutilizá-lo em outros arquivos X3D
• Protótipo recebe o tipo do primeiro nó declarado em seu corpo– O protótipo só pode ser colocado no grafo de cena em
locais onde esse primeiro nó poderia ser colocado.
Alberto Raposo – PUC-Rio
ProtoDeclare
• Interface– Define campos dos nós, que serão os pontos de
entrada e saída de dados do protótipo
• Corpo– Nós que são instanciados na criação do
protótipo.• São permitidos nós padrões e outros protótipos
dentro dos protótipos
Alberto Raposo – PUC-Rio
ProtoInterface
Alberto Raposo – PUC-Rio
Tiposde Campo
Alberto Raposo – PUC-Rio
Tiposde Campo
Alberto Raposo – PUC-Rio
Tiposde Campo
Alberto Raposo – PUC-Rio
ProtoInterface
Alberto Raposo – PUC-Rio
ProtoBody
• Nós que definem a funcionalidade do protótipo, formando um subgrafo que será “plugado” ao grafo de cena sempre que o protótipo for instanciado
Alberto Raposo – PUC-Rio
Exemplo
• 10_TextStringPrototype.x3d
Alberto Raposo – PUC-Rio
VRML - Tipos de Nós
• Agrupamento
• Geométricos
• Aparência
• Câmera
• Iluminação
• Sensores
• Interpoladores
• Script
Alberto Raposo – PUC-Rio
VRML – Scene Authoring Interface
Roteamento de eventos entre os nós não é suficiente para o tratamento de várias classes de comportamento
VRML define o nó Script e a EAI, que permitem ao usuário conectar o mundo a programas externos
Alberto Raposo – PUC-Rio
VRML – Nó Script (1)
EventoProgramaexterno
(processamentodo evento)
Evento(alterando estado do mundo VRML)
NóScript
Alberto Raposo – PUC-Rio
VRML – Nó Script (2) • Nós Script
– Trazem lógica de decisão e gerenciamento de estados para mundos VRML
– Capazes de receber, processar e gerar eventos que controlam o comportamento dos objetos do mundo
– Programa associado ao nó pode controlar toda a interação e o comportamento dos elementos do mundo virtual
Alberto Raposo – PUC-Rio
VRML – Nó Script (3) • Através do nó Script é possível usar técnicas mais
sofisticadas que a interpolação linear para a geração de animações
• Exemplo:
usuário clicasobre um objeto
TouchSensor TimeSensor
starta cada
pulso derelógio
Script
novaposiçãot
Nógeométrico
move
f(t) (qualquer)
Programa externo
Alberto Raposo – PUC-Rio
• Fazer download do tutorial disponível em:http://web3d.vapourtech.com/tutorials/vrml97/
Alberto Raposo – PUC-Rio
VRML – Nó Script – Exemplo 1 (1)
#VRML V2.0 utf8Group { children [ DEF Sph Transform { children Shape { geometry Cone {} appearance Appearance { material Material { diffuseColor 1 0 0 } } } } Transform { translation -2.4 .2 1 rotation 0 1 1 .9 children [ Shape { geometry Box {} appearance Appearance { material DEF MATERIAL Material {} } } DEF TS TouchSensor {} ] } DEF SC Script { url "extouchcube.class" field SFColor currentColor 0 0 0 eventIn SFColor colorIn eventOut SFBool isRed } ] }
DEF myColor ColorInterpolator { key [0.0, 0.3, 0.6, 1.0 ] keyValue [1 0 0 , 0 1 0, 1 0 0, 0 0 1] }
DEF myClock TimeSensor { cycleInterval 10 } DEF XTIMER TimeSensor { loop TRUE cycleInterval 5 }
DEF ENGINE OrientationInterpolator { key [ 0, .5, 1] keyValue [ 0 1 0 0, 0 1 0 3.14, 0 1 0 6.28] }
ROUTE TS.touchTime TO myClock.set_startTime ROUTE myClock.fraction TO myColor.set_fraction ROUTE myColor.value_changed TO MATERIAL.diffuseColor ROUTE myColor.value_changed TO SC.colorIn ROUTE SC.isRed TO XTIMER.enabled ROUTE XTIMER.fraction TO ENGINE.set_fraction ROUTE ENGINE.value_changed TO Sph.set_rotation
Alberto Raposo – PUC-Rio
VRML – Nó Script – Exemplo 1 (2)
Roteamento de eventos do exemplo anterior
Alberto Raposo – PUC-Rio
VRML – Nó Script – Exemplo 1 (3) import vrml.*; import vrml.field.*; import vrml.node.*;
public class extouchcube extends Script {
// declaração dos campos e eventOuts usadosprivate SFColor currentColor; private SFBool isRed;
public void initialize() { currentColor = (SFColor) getField("currentColor"); isRed = (SFBool) getEventOut("isRed"); }
public void processEvent(Event e) { // chamado no recebimento do evento colorIn currentColor.setValue((ConstSFColor)e.getValue()); }
public void eventsProcessed() { if (currentColor.getRed() >= 0.5) // vermelho maior que 50% isRed.setValue(false); else isRed.setValue(true); } }
Programa Java associado ao nó Script do exemplo anterior
Alberto Raposo – PUC-Rio
VRML – Nó Script – Exemplo 1 (4) Visualização do exemplo anterior
Alberto Raposo – PUC-Rio
VRML – Nó Script – Exemplo 2 (1) #VRML V2.0 utf8
Viewpoint { position 0 5 18 orientation 1 0 0 -0.24 fieldOfView 0.785398 }
SpotLight { location 0 10 0 direction 0 -1 0 radius 100 }
#Objeto móvel (esfera amarela)DEF MOV_OBJ Transform { translation -8 0 0 children [ Shape { geometry Sphere { radius 0.7 } appearance Appearance { material Material { diffuseColor 1 1 0 } } } ] }
# Sensores (Botões)Transform { translation 6.25 0 0 children [ DEF TOUCH1 TouchSensor {} Shape { geometry Box { size .5 1 1 } appearance Appearance { material Material { diffuseColor 1 0 0 } } } ] }Transform { translation 6.75 0 0 children [ DEF TOUCH2 TouchSensor {} Shape { geometry Box { size .5 1 1 } appearance Appearance { material Material { diffuseColor 0 1 0 } } } ] }
Alberto Raposo – PUC-Rio
VRML – Nó Script – Exemplo 2 (2) # Cubos que não se movem Transform { translation -5 0 0 children [ DEF CUBE_CHILDREN Shape { geometry DEF CUBE_LARGE
Box { size 1 1 1} appearance Appearance { material Material { diffuseColor 1 0 1 } } } ] }Transform { translation 0 5 0 children [ USE CUBE_CHILDREN ] } Transform { translation 0 -4.5 0 children [ USE CUBE_CHILDREN ] }
# RelógioDEF TIMER TimeSensor { loop TRUE cycleInterval 7 }
# Trajetórias para a esferaDEF I_1 PositionInterpolator { key [ 0, 0.0833, 0.167, 0.25, 0.333, 0.417, 0.5, 0.583, 0.667, 0.75, 0.833, 0.917, 1] keyValue [ -8 0 0, -7 -4 0, -4 -6 0, 0 -7 0, 2.75 -5 0, 4 -3 0, 5 0 0, 4 3 0, 2.75 5 0, 0 7 0, -4 6 0, -7 4 0, -8 0 0] }DEF I_2 PositionInterpolator { ...} # Script responsável pelo comportamento da esferaDEF S Script { eventIn SFFloat start field SFNode inside USE TOUCH1 field SFNode outside USE TOUCH2 eventOut SFVec3f newPosition field SFNode PosInterp1 USE INTERP1 field SFNode PosInterp2 USE INTERP2 url "exballs.class" }
# Roteamento de eventosROUTE TIMER.fraction_changed TO I_1.set_fractionROUTE TIMER.fraction_changed TO I_2.set_fractionROUTE TIMER.fraction_changed TO S.startROUTE S.newPosition TO MOV_OBJ.translation
Alberto Raposo – PUC-Rio
VRML – Nó Script – Exemplo 2 (3)
Programa Java associado ao nó Script do exemplo anterior
import vrml.*; (...)
public class exballs extends Script { private SFNode inside; (...) private boolean outsid = true;
public void initialize() { // mapping variables into VRML-script fields/events inside = (SFNode) getField("inside"); outside = (SFNode) getField("outside"); newPosition = (SFVec3f) getEventOut("newPosition"); (...) }
publicd processEvent (Event e) { ConstSFBool sensor1; ConstSFBool sensor2;
// Getting sensor events Node aux1 = (Node)(inside.getValue()); sensor1 = (ConstSFBool) aux1.getEventOut("isOver");
aux1 = (Node)(outside.getValue());sensor2 = (ConstSFBool) aux1.getEventOut("isOver");
// boolean outsid stores the last sensor touchif(sensor2.getValue()) outsid = true;else if(sensor1.getValue()) outsid = false;
// Choosing which trajectory to follow, // according to the boolean outsid. ConstSFFloat f = (ConstSFFloat) e.getValue(); if( outsid && ff > f.getValue() ) aux = (Node) PosInterp2.getValue(); else if ( !outsid && ff > f.getValue() ) aux = (Node) PosInterp1.getValue(); ff = f.getValue();
// Mapping new position into an EventOutConstSFVec3f tmp = (ConstSFVec3f) aux.getEventOut("value_changed"); newPosition.setValue(tmp); } }
Alberto Raposo – PUC-Rio
VRML – Nó Script – Exemplo 2 (4)
Visualização do exemplo anterior
Alberto Raposo – PUC-Rio
VRML: JavaScript
Ver código em 10_javascript.wrl
Alberto Raposo – PUC-Rio
VRML - EAI (External Authoring Interface)
mundo VRML
appletJava
EAI
EAI é uma inteface para pemitir que ambientes externos acessem nós de uma cena VRML
Alberto Raposo – PUC-Rio
VRML - EAI
mundo VRML
appletJava
EAI
Evento Programaexterno
(processamentodo evento)
Evento(alterando estado do mundo VRML)
NóScript
EAI Nó Script
Alberto Raposo – PUC-Rio
VRML - EAI• EAI
– Maior modularidade e simplicidade dos programas
– Maior liberdade para criação de interfaces sofisticadas para inteação com mundos VRML
– Adequada para a criação de sistemas multimídia complexos
• Nó Script– Adequado para dar comportamento individual a objetos da
cena
Alberto Raposo – PUC-Rio
EAI• Para usar a EAI é necessário criar página
HTML incluindo a cena VRML e um applet que realiza a interação com a cena.
• O seguinte trecho deve estar na página HTML
Alberto Raposo – PUC-Rio
EAI
• Programa Java precisa pegar referência ao objeto Browser
Vêm com o browser (ex., Cortona)
Alberto Raposo – PUC-Rio
Bibliografia Adicional
• The Annotated VRML 97 Reference: http://accad.osu.edu/~pgerstma/class/vnv/resources/info/AnnotatedVrmlRef/Book.html
• Web3D Consortium: http://www.web3d.org/• Cortona:
http://www.parallelgraphics.com/products/cortona/
• “VRML 2.0 - An Introductory view by examples” http://www.dca.fee.unicamp.br/~leopini/tut-vrml/vrml-tut.html
Alberto Raposo – PUC-Rio
Bibliografia Adicional
• Script– http://web3d.vapourtech.com/tutorials/vrml97
• EAI– http://www.parallelgraphics.com/developer/
products/cortona/eai
– http://dmi.uib.es/~abasolo/cursovrml/diapos/097.html
• Lista de tutoriais: http://philliphansel.com/tutorials/tutorials.htm