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
Download

10_X3D_2 - PUC-Rio