Sistemi multimediali
Massimiliano Piscozzi – [email protected]
Riassunto lezione precedente
• Sintassi XML
• Struttura di un file X3D-XML
– Tag case-sensitive
– Tag di apertura e chiusura
– Tag correttamente
innestati
– Caratteri speciali
– ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC
"http://www.web3d.org/x3d/content/x3d-3.0.dtd">
<X3D profile="Full">
<head/>
<Scene>
...
</Scene>
</X3D>
• Nodi principali di X3D
(specifiche e codifica XML)
– Transform
– Shape
– Appearance
– Material
– Nodi derivati da X3DGeometryNode
Trasformazioni e pivot point
• Creazione di una primitiva geometrica nel centro del sistema
di coordinate locale
<Transform DEF="PivotPoint">
<Shape>
...
</Shape>
</Transform>
• Utilizzo di due trasformazioni geometriche in modo da
posizionare il pivot point al centro della base del cilindro
<Transform DEF="PivotPoint">
<Transform translation="0 d 0">
<Shape>
...
</Shape>
</Transform>
</Transform>
d
Esercizio
• Creazione di un piano
– Box: 10m x 1cm x 10m
• Creazione di una colonna
–
–
–
–
Raggio: 30cm
Altezza: 2.5m
Appoggiata sul piano
Pivot point nella base
• “Clonazione” della colonna
– Posizionamento nel piano
di varie istanze della colonna
<Transform>
<Shape>
<Box size="10 0.01 10"/>
<Appearance>
<Material diffuseColor="0.7 0.4 0.3"/>
</Appearance>
</Shape>
</Transform>
<Transform>
<Transform DEF="Colonna" translation="0 1.25 0">
<Shape>
<Cylinder radius="0.3" height="2.5"/>
<Appearance>
<Material diffuseColor="0.8 0.7 0.3"/>
</Appearance>
</Shape>
</Transform>
</Transform>
<Transform translation="2 0 2.5">
<Transform USE="Colonna"/>
</Transform>
Nodo NavigationInfo (1)
• Descrive quali paradigmi di navigazione abilitare:
–
–
–
–
Walk
Examine
Fly
...
• Descrive le caratteristiche fisiche dell’avatar
– Dimensioni dell’avatar  rilevamento collisioni
• Abilita o disabilita una sorgente luminosa direzionale
diretta nella direzione di osseravzione
• Limite di visibilità
• E’ un nodo derivato da X3DBindableNode
– Può essere attivo solo un oggetto di quel tipo
Nodo NavigationInfo (2)
NavigationInfo : X3DBindableNode{
SFBool
[in]
set_bind
SFTime
[out]
bind_time
SFBool
[out]
isBound
MFString
[in,out] type
SFFloat
[in,out] speed
SFBool
[in,out] headlight
MFFloat
[in,out] avatarSize
...
}
[“EXAMINE” “ANY”]
1.0
Attenzione!
TRUE
[0.25La
1.6lista
0.75]dei valori
è racchiusa da
singoli apici: ‘
I singoli valori sono racchiusi da
doppi apici: “
• Esempi
– <NavigationInfo type=‘“WALK” “FLY”’/>
– <NavigationInfo type=“NONE” headlight=“false”/>
– <NavigationInfo type=“EXAMINE” avatarSize=“0.3 1.8 0.8”/>
Nodo Viewpoint (1)
• Permette di definire dei punti di vista:
– Posizione rispetto al sistema di coordinate del nodo padre
– Direzione dello sguardo
• Permette di associare ad un punto di vista una
descrizione:
– Menu dei punti di vista nel browser X3D
• Definisce l’ampiezza del campo visivo
• Definisce un centro di rotazione per il modo EXAMINE
• E’ un nodo derivato da X3DBindableNode
– Può essere attivo solo un oggetto di quel tipo
Nodo Viewpoint (2)
Viewpoint : X3DBindableNode{
SFBool
[in]
set_bind
SFTime
[out]
bind_time
SFBool
[out]
isBound
SFString
[in,out] description
SFVec3f
[in,out] position
SFRotation
[in,out] orientation
SFFloat
[in,out] fieldOfView
...
}
• Esempi
“”
0 0 10
0010
pi / 4
&apos;  ‘
– <Viewpoint description= “Dall&apos;alto”
position=“0 10 0” orientation=“1 0 0 1.57”/>
– < Viewpoint description= “Grandangolo” fieldOfView=“1.3”/>
Nodo Viewpoint (3)
• Il punto di vista è definito attraverso gli attributi:
– Position: posizione nel sistema di coordinate locale
– Orientation: rotazione del vettore “direzione di osservazione”,
inizialmente diretto lungo –z
• Per stabilire in modo più semplice un punto di vista è
consigliabile ricorrere alle trasformazioni geometriche
y
<Transform DEF="TargetPoint"
translation="..." rotation="...">
<Viewpoint description="Punto di vista"
position="0 0 d"/>
</Transform>
Direzione di
osservazione
x
z
Posizione
viewpoint
d
– Il nodo Transform “TargetPoint” rappresenta il punto osservato dal Viewpoint
– Spostando e ruotando “TargetPoint” è possibile modificare la direzione di
osservazione, la quale punterà sempre al centro del sistema di coordinate di
“TargetPoint”
Esercizio
• Viewpoints definiti attraverso posizione e orientamento
<Viewpoint description="Default" position="0 1.6 4"/>
<Viewpoint description="Inclinato" position="0 1.6 4" orientation="0 0 1 0.3"/>
<Viewpoint description="Dall&apos;alto" position="0 15 0" orientation="1 0 0 -1.57"/>
• Viewpoints inseriti in trasformazioni geometriche
<Transform rotation="1 0 0 -0.785">
<Viewpoint description="Dentro un nodo Transform" position="0 0 5"/>
</Transform>
• Impostazione dei metodi di navigazione
<NavigationInfo type='"EXAMINE" "WALK"'/>
– Provare a disabilitare la “headlight”: la scena diventa completamente
nera poiché non sono state definite delle sorgenti luminose
Illuminazione (1)
• 3 tipi di luci
– DirectionalLight: raggi paralleli generati da una sorgente luminosa ad
inifinita distanza
– PointLight: sorgente luminosa puntiforme, attenuazione
– SpotLight: sorgente luminosa puntiforma (“faretto”), attenuazione
DirectionalLight : X3DLightNode{
SFFloat
[in,out] ambientIntensity
SFColor
[in,out] color
SFFloat
[in,out] intensity
SFVec3f
[in,out] direction
SFBool
[in,out] on
...
}
0
111
1
0 0 -1
TRUE
Illuminazione (2)
PointLight : X3DLightNode{
SFFloat
[in,out] ambientIntensity
SFVec3f
[in,out] attenuation
SFColor
[in,out] color
SFFloat
[in,out] intensity
SFVec3f
[in,out] location
SFFloat
[in,out] radius
SFBool
[in,out] on
...
}
SpotLight : X3DLightNode{
SFFloat
[in,out] ambientIntensity
SFVec3f
[in,out] attenuation
SFColor
[in,out] color
SFFloat
[in,out] intensity
SFVec3f
[in,out] location
SFVec3f
[in,out] direction
SFFloat
[in,out] radius
SFFloat
[in,out] beamWidth
SFFloat
[in,out] cutOffAngle
SFBool
[in,out] on
...
}
0
100
111
1
000
100
TRUE
0
100
111
1
000
0 0 -1
100
pi/2
pi/4
TRUE
Attenuazione:
1/max(a + b × r + c × r2, 1)
Anchor
• Permette di creare dei link attivabili cliccando sui suoi
oggetti figli:
– Link a file distribuiti sulla rete e a viewpoint di scene X3D
• url = “fileName”
• url = “fileName.x3d#viewpointName”
• url = “#viewpointName”
• Permette di specificare dei parametri al Browser
– “keyword=value” (ex: “target = name_of_frame”)
Anchor: X3DGroupNode{
MFNode
[in]
addChildren
MFNode
[in]
removeChildren
MFNode
[in]
children
SFString
[in,out] description
MFString
[in,out] url
MFString
[in,out] parameter
...
}
“”
[]
[]
Animazioni time-based
• Timers
– Sensori che generano eventi al passare del tempo
• Interpolatori
– Interpolazione lineare fra:
•
•
•
•
•
Posizioni
Rotazioni
Colori
Scalari
...
0
1
0
1
– Definiscono un insieme di valori chiave (posizioni,
colori, ...) associati a valori compresi nell’intervallo [0,1]
Nodo TimerSensor (1)
TimerSensor : X3DTimeDependentNode, X3DSensorNode{
SFBool
[in,out] enabled
TRUE
SFTime
[in,out] cycleInterval
1
SFBool
[in,out] loop
FALSE
SFTime
[in,out] startTime
0
SFTime
[in,out] stopTime
0
SFTime
[in,out] pauseTime
0
SFTime
[in,out] resumeTime
0
SFFloat
[out]
fraction_changed
SFTime
[out]
cycleTime
SFTime
[out]
time
SFTime
[out]
elapsedTime
SFBool
[out]
isActive
SFBool
[out]
isPaused
...
}
– Il passare del tempo è
basato su cicli temporali
– E’ possibile stabilire in che
momento far partire e
fermare il timer
– Il timer genera un evento
fraction_changed: valore
compreso tra 0 (inizio del
ciclo) e 1 (fine del ciclo)
Nodo TimeSensor (2)
• Inizialmente un TimeSensor è inattivo:
– Viene attivato impostando loop a true
– Oppure impostando appropriatamente il valore di startTime
• Il TimeSensor si disattiva al primo dei seguenti eventi:
– Raggiungimento della fine di un ciclo e loop=false
– now >= stopTime, se stopTime >= startTime
loop = true
stopTime
startTime
cycleInterval
t
isActive = true
Nodo TimeSensor (2)
• Inizialmente un TimeSensor è inattivo:
– Viene attivato impostando loop a true
– Oppure impostando appropriatamente il valore di startTime
• Il TimeSensor si disattiva al primo dei seguenti eventi:
– Raggiungimento della fine di un ciclo e loop=false
– now >= stopTime, se stopTime >= startTime
loop = false
stopTime
cycleInterval
startTime
t
isActive = true
isActive = false
Nodo TimeSensor (2)
• Inizialmente un TimeSensor è inattivo:
– Viene attivato impostando loop a true
– Oppure impostando appropriatamente il valore di startTime
• Il TimeSensor si disattiva al primo dei seguenti eventi:
– Raggiungimento della fine di un ciclo e loop=false
– now >= stopTime, se stopTime >= startTime
loop = true
startTime
stopTime
cycleInterval
t
isActive = true
isActive = false
Gli
e isActive=false
vengono
generati
Allaeventi
fine diisActive=true
ogni ciclo viene
generato un evento
cycleTime:
all’inizio
fine dell’intervallo
temporale
utile perelaalla
sincronizzazione
di animazioni
Nodi interpolatori
Analogamente per:
PositionInterpolator : X3DInterpolatorNode{
SFFloat
[in]
set_fraction
MFFloat
[in,out] key
[]
MFVec3f
[in,out] keyValue
[]
SFVec3f
[out]
value_changed
...
}
set_fraction
key
0
keyValue
...
– ColorInterpolator
– OrientationInterpolator
– ScalarInterpolator
– ...
0.12 0.2
...
...
0.7 0.95
1
...
...
...
value_changed
Fornendo in input all’interpolatore un valore compreso tra 0 e 1 esso restituisce
in output il valore associato (posizione, colore, scalare...) in base
all’interpolazione definita dai valori chiave
Route
• Il tag <ROUTE .../> permette di connettere due campi di
due nodi distinti al fine di descrivere il behaviour graph
• Sintassi:
<ROUTE fromField=“...” fromNode=“...” toField=“...” toNode=“...”/>
• I campi fromNode e toNode contengono i nomi dei due nodi
– essi devono quindi essere nominati attraverso l’attributo DEF
• I campi specificati negli attributi fromField e toField devono essere
dello stesso tipo
• Il campo specificato nell’attributo fromField deve essere
– o di tipo outputOnly
– o di tipo inputOutput
• Il campo specificato nell’attributo toField deve essere
– o di tipo inputOnly
– o di tipo inputOutput
Route: esempio
• Animazione della traslazione di un nodo transform
TimeSensor
PositionInterpolator
Transform
cycleTime
set_fraction
translation
fraction_changed
key
·· ·
·· ·
keyValue
valueChanged
·· ·
<TimeSensor
DEF="Timer"
cycleInterval="5"
loop="true"/>
<PositionInterpolator
DEF="Interpolatore"
key="0 0.3 0.8 1"
keyValue="0 0 0, 0 3 0,
3 0 0, 0 0 0"/>
<ROUTE
fromField="fraction_changed"
fromNode="Timer"
toField="set_fraction"
toNode="Interpolatore"/>
<Transform
DEF=”Trasformazione”>
Nodi Figli
</Transform>
<ROUTE
fromField="value_changed"
fromNode="Interpolatore"
toField="set_translation"
toNode="Trasformazione"/>
Esercizio (1)
Animazione (in contemporanea) della rotazione di un
parallelepipedo, del colore di una sfera e della traslazione di
un cono
• Creazione dei tre oggetti distribuiti lungo l’asse X
<Transform translation="-3 0 0">
<Transform DEF="boxTransform">
<Shape>
<Box size="1 3 1"/>
<Appearance>
<Material
diffuseColor="1 0 0"/>
</Appearance>
</Shape>
</Transform>
</Transform>
<Transform>
<Shape>
<Sphere radius="1"/>
<Appearance>
<Material DEF="sphereMaterial"
diffuseColor="1 0 1"/>
</Appearance>
</Shape>
</Transform>
<Transform translation="3 0 0">
<Transform DEF="coneTransform">
<Shape>
<Cone bottomRadius="1"
height="2"/>
<Appearance>
<Material
diffuseColor="0 0 1"/>
</Appearance>
</Shape>
</Transform>
</Transform>
• Creazione di un TimeSensor
<TimeSensor DEF="timer" cycleInterval="4" loop="true"/>
Esercizio (2)
• Creazione dei 3 interpolatori
<OrientationInterpolator DEF="interpolator1" key="0 0.5 1" keyValue="0 0 1 0, 0 0 1 1.57, 0 0 1 3.14"/>
<ColorInterpolator DEF="interpolator2" key="0 0.2 0.7 1" keyValue="1 0 1, 1 1 1, 1 1 0, 1 0 1"/>
<PositionInterpolator DEF="interpolator3" key="0 0.25 0.75 1" keyValue="0 0 0, 0 2 0, 0 -2 0, 0 0 0"/>
• Routing degli eventi
<ROUTE fromNode="timer" fromField="fraction_changed" toNode="interpolator1" toField="set_fraction"/>
<ROUTE fromNode="interpolator1" fromField="value_changed" toNode="boxTransform" toField="set_rotation"/>
<ROUTE fromNode="timer" fromField="fraction_changed" toNode="interpolator2" toField="set_fraction"/>
<ROUTE fromNode="interpolator2" fromField="value_changed" toNode="sphereMaterial" toField="set_diffuseColor"/>
<ROUTE fromNode="timer" fromField="fraction_changed" toNode="interpolator3" toField="set_fraction"/>
<ROUTE fromNode="interpolator3" fromField="value_changed" toNode=“coneTransform" toField="set_translation"/>
Scarica

pps