Title: Massimiliano Piscozzi
1Sistemi multimediali
Massimiliano Piscozzi piscozzi_at_dico.unimi.it
2Prototipi (3)
- La definizione di un prototipo può essere
contenuta in un file diverso da quello in cui
vengono create le istanze
File A File X3D-XML contenente la
dichiarazione di uno o più prototipi
File D File X3D-XML che utilizza istanze
di prototipi definiti esternamente
File B File X3D-XML contenente la
dichiarazione di uno o più prototipi
File C File X3D-XML contenente la
dichiarazione di uno o più prototipi
- Maggiore riusabilità dei nodi definiti
dallutente - Semplificazione nella scrittura dei file X3D-XML
3ExternProtoDeclare
- La dichiarazione di un prototipo definito
esternamente avviene attraverso il tag
ExternProtoDeclare
ltExternProtoDeclare name... url.../gt
4Scripting
- Uno script
- E un nodo facente parte dello scene graph
- Contiene un comportamento definito attraverso
funzioni scritte in ECMAScript - Può generare eventi
- Lutilizzo di scripts permette di
- Programmare comportamenti più evoluti rispetto a
quelli ottenibili tramite i nodi predefiniti (ex
pulsanti a più stati) - Definire matematicamente delle traiettore (ex
parabole, ellissi) - Automatizzare comportamenti (ex creazione di un
gran numero di istanze di un oggetto) - Convertire eventi (ex rollOver button)
- Modificare dinamicamente lo scene graph e il
behaviour graph - ...
5Nodo Script
ltScriptgt ... lt!CDATA ...
gt lt/Scriptgt
- Per gestire gli eventi in input occorre definire
delle funzioni associate ai campi InputOnly o
InputOutput - Per spedire degli eventi associati ai campi
OutputOnly o InputOutput è sufficiente
modificarne i valori allinterno delle funzioni
6ECMAScript (1)
- Variabili
- Linguaggio debolmente tipizzato
- Tipi predefiniti
- boolean, number, string, object, ...
- Operatori
- Unari ! (NOT), -, (incremento), --
(decremento) - Binari , - , ,/ , (modulo)
- Relazionali lt, gt, lt, gt, , !
- Logici (AND), (OR)
- Strutture di controllo
- Condizionali if..else, switch
- Iterative for, while, do..while
var a a 5 print(a) a Hello
World! print(a)
7ECMAScript (2)
- Funzioni
- Non occorre specificare il tipo del valore
restituito - Oggetto Array
- Array dinamico costituito da elementi di
qualsiasi tipo - Proprietà length
- Oggetto Math
- Oggetto globale non va istanziato tramite new
- Costanti matematiche (proprietà) PI, E, SQRT2,
LN2, LN10, ... - Funzioni matematiche (metodi) max(), min(),
pow(), sqrt(), - sin(), cos(), tan(), random()
function myFunction(parameters) ...
function somma(a,b) return (ab)
8ECMAScript (3)
- ECMAScript e nodi Script (X3D)
- I tipi di dato booleani (SFBool), scalari
(SFFloat, SFDouble, SFInt32, SFTime) e le
stringhe (SFString) sono rappresentati attraverso
i tipi base di ECMAScript (boolean, number,
string) - I restanti tipi di dato singoli (SFColor,
SFVec3f, ...) sono rappresentati attraverso degli
oggetti - Ex verde new SFColor(0,1,0)
- Ex origine new SFVec3f(0,0,0)
- I tipi di dato multipli (MFInt32, MFVec3f, ...)
sono rappresentati attraverso degli array - Ex v new MFInt32(2,5,1,-3)
9ECMAScript (4)
- ECMAScript e nodi Script (X3D)
- Per ogni campo di tipo InputOnly e InputOutput
bisogna definire una funzione con lo stesso nome - E possibile definire due funzioni richiamate
quando lo script è caricato o eliminato dal
Browser initialize() e shutdown() - La funzione print() permette di scrivere sulla
console (debug) - Tramite loggetto globale Browser() è possibile
modificare dinamicamente lo scene graph e il
behaviour graph - Browser.createFromVRMLString(stringVRML)
- Browser.addRoute(fromNode,fromField,toNode,toField
) - Browser.deleteRoute(fromNode,fromField,toNode,toFi
eld)
10Script esempio
- Movimento sinusoidale di un cubo
TimeSensor
Script
Transform
cycleInterval
translation
set_fraction
loop
value_changed
fraction_changed
ltScript DEF"MyScript"gt ltfield
name"set_fraction" type"SFFloat"
accessType"inputOnly"/gt ltfield
name"value_changed" type"SFVec3f"
accessType"outputOnly"/gt lt!CDATA
ecmascript function initialize()
print(Script inizializzato!)
function set_fraction(value)
value_changed0 -3 6 value
value_changed1 2 Math.Sin(value6.28)
value_changed2 0 gt
lt/Scriptgt
11Esempio (1)
- Creazione di un prototipo di un pulsante a due
stati - Lo stato del pulsante deve essere rappresentato
dal suo colore (variazione del diffuseColor) - Il pulsante deve illuminarsi al passaggio del
mouse (variazione dellemissiveColor) - Il pulsante può avere forme diverse
12Esempio (2)
ltProtoDeclare nameButtongt
ltProtoInterfacegt ltfield name"geometry"
type"SFNode" accessType"inputOnly"gt
ltSphere/gt lt/fieldgt lt/ProtoInterfacegt
ltProtoBodygt ... lt/ProtoBodygt lt/ProtoDecla
regt
- Dichiarazione del prototipo
13Esempio (3)
ltScript DEF"MyScript"gt ltfield name"isOver"
type"SFBool" accessType"inputOnly
"/gt ltfield name"touchTime" type"SFTime"
accessType"inputOnly"/gt ltfield
name"state" type"SFBool"
accessType"inputOutput"/gt ltfield
name"emissiveColor_changed" type"SFColor"
accessType"outputOnly"/gt ltfield
name"diffuseColor_changed" type"SFColor"
accessType"outputOnly"/gt
lt!CDATA ecmascript ...
gt lt/Scriptgt
14Esempio (4)
function state(value) function
touchTime(value) state !state if
(state) diffuseColor_changed new
SFColor(1, 0.2, 0.5) else
diffuseColor_changed new SFColor(0.2, 1, 0.5)
function isOver(value) if (value)
emissiveColor_changed new SFColor(0.2,
0.2, 0.2) else
emissiveColor_changed new SFColor(0, 0, 0)
- Funzioni definite allinterno del nodo Script
15Esempio (5)
- Routing degli eventi allinterno di ltProtoBodygt
ltROUTE fromNode"Sensor" fromField"isOver"
toNode"MyScript" toField"isOver"/gt lt
ROUTE fromNode"Sensor" fromField"touchTime"
toNode"MyScript" toField"touchTime"
/gt ltROUTE fromNode"MyScript" fromField"emissiveC
olor_changed" toNode"MaterialBut
ton" toField"set_emissiveColor"/gt ltROUTE
fromNode"MyScript" fromField"diffuseColor_change
d" toNode"MaterialButton"
toField"set_diffuseColor"/gt
- Creazione di istanze del prototipo
ltProtoInstance name"button"gt ltfieldValue
name"geometry"gt ltBox/gt
lt/fieldValuegt lt/ProtoInstancegt
16ProximitySensor
- Rileva quando lavatar entra (ed esce) in una
zona rappresentata da un parallelepipedo - Quando lutente si trova allinterno del
parallelepipedo il sensore traccia la sua
posizione e orientazione
ProximitySensor X3DEnvironmentalSensorNode
SFBool in,out enabled TRUE SFVec3f
in,out center 0 0 0 SFVec3f in,out
size 0 0 0 SFTime out enterTime SFTime
out exitTime SFRotation out orientation_
changed SFVec3f out position_changed SFBool
out isActive ...
- Permette di far iniziare (terminare) delle
animazioni quando lavatar si avvicina
(allontana) ad un particolare oggetto - Permette di muovere un oggetto in modo da
replicare il movimento dellavatar (utile per la
creazione di interfacce)
17Esempio (1)
- Animazione di un parallelepipedo in base alla
vicinanza dellavatar
PositionInterp.
TimeSensor
set_fraction
startTime
value_changed
fraction_changed
Transform
ProximitySensor
scale
enterTime
exitTime
PositionInterp.
TimeSensor
Shape
set_fraction
startTime
value_changed
fraction_changed
Appearance
Box
Material
18Esempio (2)
- Posizionamento di un oggetto in base alla
posizione dellavatar
ProximitySensor
Transform
position_changed
translation
orientation_changed
rotation
Collision
Transform
19VisibilitySensor
- Rileva quando unarea rappresentata da un
parallelepipedo è visibile allavatar
VisibilitySensor X3DEnvironmentalSensorNode
SFBool in,out enabled TRUE SFVec3f
in,out center 0 0 0 SFVec3f in,out
size 0 0 0 SFTime out enterTime SFTime
out exitTime ...
- Permette di far iniziare (terminare) delle
animazioni quando lavatar può o meno vedere un
particolare oggetto (utile per attirare
lattenzione dellutente)