INF 1366 – Computação Gráfica Interativa X3D – Iluminação, Environment Sensors e Protótipos Alberto B. Raposo [email protected] 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 (ray tracing, etc.) – é definição de mais alto 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 SFColor inputOutput Color 111 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 Range Profile Immersive [X3DMetadataObject] Core visibilityRange: distância da câmera onde objetos estarão totalmente obscurecidos pelo 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 como filho 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 Tipos de Campo Alberto Raposo – PUC-Rio Tipos de Campo Alberto Raposo – PUC-Rio Tipos de 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) Evento Nó Script Programa externo (processamento do evento) Evento (alterando estado do mundo VRML) 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: TouchSensor usuário clica sobre um objeto Script TimeSensor start a cada pulso de relógio t nova posição f(t) (qualquer) Alberto Raposo – PUC-Rio Programa externo Nó geométrico move • 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 utf8 Group { 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 } ] } Alberto Raposo – PUC-Rio 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 VRML – Nó Script – Exemplo 1 (2) Roteamento de eventos do exemplo anterior Alberto Raposo – PUC-Rio VRML – Nó Script – Exemplo 1 (3) import vrml.*; Programa Java associado ao nó Script do exemplo anterior import vrml.field.*; import vrml.node.*; public class extouchcube extends Script { // declaração dos campos e eventOuts usados private 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); } } 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 } } } ] } Alberto Raposo – PUC-Rio # 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 } } } ] } 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 ] } # Trajetórias para a esfera DEF 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 { ...} # Relógio DEF TIMER TimeSensor { loop TRUE cycleInterval 7 } Alberto Raposo – PUC-Rio # Roteamento de eventos ROUTE TIMER.fraction_changed TO I_1.set_fraction ROUTE TIMER.fraction_changed TO I_2.set_fraction ROUTE TIMER.fraction_changed TO S.start ROUTE S.newPosition TO MOV_OBJ.translation # Script responsável pelo comportamento da esfera DEF 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" } VRML – Nó Script – Exemplo 2 (3) Programa Java associado ao nó Script do exemplo anterior import vrml.*; (...) aux1 = (Node)(outside.getValue()); sensor2 = (ConstSFBool) aux1.getEventOut("isOver"); public class exballs extends Script { private SFNode inside; (...) private boolean outsid = true; // boolean outsid stores the last sensor touch if(sensor2.getValue()) outsid = true; else if(sensor1.getValue()) outsid = false; // Choosing which trajectory to follow, public void initialize() { // according to the boolean outsid. // mapping variables into VRML-script fields/events ConstSFFloat f = (ConstSFFloat) e.getValue(); inside = (SFNode) getField("inside"); outside = (SFNode) getField("outside"); if( outsid && ff > f.getValue() ) newPosition = (SFVec3f) getEventOut("newPosition"); aux = (Node) PosInterp2.getValue(); (...) } publicd processEvent (Event e) { ConstSFBool sensor1; ConstSFBool sensor2; // Getting sensor events Node aux1 = (Node)(inside.getValue()); sensor1 = (ConstSFBool) Alberto Raposo –aux1.getEventOut("isOver"); PUC-Rio else if ( !outsid && ff > f.getValue() ) aux = (Node) PosInterp1.getValue(); ff = f.getValue(); // Mapping new position into an EventOut ConstSFVec3f tmp = (ConstSFVec3f) aux.getEventOut("value_changed"); newPosition.setValue(tmp); } } 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 E A I applet Java EAI é uma inteface para pemitir que ambientes externos acessem nós de uma cena VRML Alberto Raposo – PUC-Rio VRML - EAI EAI Nó Script mundo VRML E A I applet Java Alberto Raposo – PUC-Rio Evento Nó Script Programa externo (processamento do evento) Evento (alterando estado do mundo VRML) 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/resour ces/info/AnnotatedVrmlRef/Book.html Web3D Consortium: http://www.web3d.org/ Cortona: http://www.parallelgraphics.com/products/corto na/ “VRML 2.0 - An Introductory view by examples” http://www.dca.fee.unicamp.br/~leopini/tutvrml/vrml-tut.html Alberto Raposo – PUC-Rio Bibliografia Adicional • Script – • EAI – – • http://web3d.vapourtech.com/tutorials/vrml97 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 Alberto Raposo – PUC-Rio