Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Massimiliano Piscozzi – piscozzi@dico.unimi.it Sistemi multimediali
2
Prototipi (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 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 File D File X3D-XML che utilizza istanze di prototipi definiti esternamente Maggiore riusabilità dei nodi definiti dallutente Semplificazione nella scrittura dei file X3D-XML
3
ExternProtoDeclare La dichiarazione di un prototipo definito esternamente avviene attraverso il tag ExternProtoDeclare Nome utilizzato localmente per la creazione di istanze del prototipo Indirizzo del file in cui è definito il prototipo + nome del prototipo: nomeFile#nomePrototipo FileA.x3d Esempio............ FileB.x3d... <ExternProtoDeclare name=oggettoEsterno url=FileA.x3d#oggetto/>.........
4
Scripting 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 –...
5
Nodo Script 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... <![CDATA[... ]]> <field name=... type=... accessType=... value=.../> Interfaccia costituita da campi <![CDATA[ ecmascript:...lista funzioni... ]]> Funzioni definite in ECMAScript
6
ECMAScript (1) Variabili –Linguaggio debolmente tipizzato –Tipi predefiniti: boolean, number, string, object,... Operatori –Unari: ! (NOT), -, ++ (incremento), -- (decremento) –Binari: +, -,*,/,% (modulo) –Relazionali:, =, ==, != –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); if (condition) { statements } else { statements } switch (expr) { case label: statements break;... default: statements } for (expr1; epr2; expr3) { statements } while (condition) { statements } do { statements } while (condition)
7
ECMAScript (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 (a+b); } var a = new Array(); a[0] = 4; a[1] = BlaBlaBla; for (i=0; i < a.length; i++) { print(a[i]); }
8
ECMAScript (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);
9
ECMAScript (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,toField)
10
Script: esempio Movimento sinusoidale di un cubo TimeSensor cycleInterval loop · · · fraction_changed Script set_fraction value_changed · · · Transform · · · translation <![CDATA[ ecmascript: function initialize() { print(Script inizializzato!); } function set_fraction(value) { value_changed[0] = -3 + 6 * value; value_changed[1] = 2 * Math.Sin(value*6.28); value_changed[2] = 0; } ]]> set_fraction(value) oppure set_fraction(value, timestamp)
11
Button geometry Esempio (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 Transform · · · Shape · · · Sphere · · · Appearance · · · Material diffuseColor emissiveColor · · · TouchSensor isOver touchTime · · · Script isOver touchTime · · · diffuseColor emissiveColor
12
Esempio (2) Dichiarazione del prototipo... Campo costituito da un nodo: il valore di default non viene specificato nellattributo value, ma attraverso un tag innestato Connessione del campo geometry del prototipo......
13
Esempio (3) Nodo Script <field name="isOver" type="SFBool" accessType="inputOnly"/> <field name="touchTime" type="SFTime" accessType="inputOnly"/> <field name="state" type="SFBool" accessType="inputOutput"/> <field name="emissiveColor_changed" type="SFColor" accessType="outputOnly"/> <field name="diffuseColor_changed" type="SFColor" accessType="outputOnly"/> <![CDATA[ ecmascript:... ]]>
14
Esempio (4) Funzioni definite allinterno del nodo Script 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); }
15
Esempio (5) Creazione di istanze del prototipo Campo costituito da un nodo: il valore di default non viene specificato nellattributo value, ma attraverso un tag innestato Routing degli eventi allinterno di <ROUTE fromNode="Sensor" fromField="isOver" toNode="MyScript" toField="isOver"/> <ROUTE fromNode="Sensor" fromField="touchTime" toNode="MyScript" toField="touchTime"/> <ROUTE fromNode="MyScript" fromField="emissiveColor_changed" toNode="MaterialButton" toField="set_emissiveColor"/> <ROUTE fromNode="MyScript" fromField="diffuseColor_changed" toNode="MaterialButton" toField="set_diffuseColor"/>
16
ProximitySensor ProximitySensor : X3DEnvironmentalSensorNode { SFBool[in,out]enabledTRUE SFVec3f [in,out] center0 0 0 SFVec3f[in,out] size0 0 0 SFTime[out] enterTime SFTime [out] exitTime SFRotation[out]orientation_changed SFVec3f[out]position_changed SFBool[out]isActive... } 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 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)
17
Esempio (1) Animazione di un parallelepipedo in base alla vicinanza dellavatar Shape · · · Box · · · Appearance · · · ProximitySensor enterTime exitTime · · · Transform scale · · · Material · · · PositionInterp. set_fraction value_changed · · · TimeSensor startTime fraction_changed · · · PositionInterp. set_fraction value_changed · · · TimeSensor startTime fraction_changed · · ·
18
Esempio (2) Posizionamento di un oggetto in base alla posizione dellavatar ProximitySensor position_changed orientation_changed · · · Transform translation rotation · · · Transform · · · La grandezza del sensore (campo size) deve essere tale da racchiudere tutta la scena virtuale Sistema di coordinate locali corrispondente alla posizione dellavatar Collision · · · Occorre disabilitare il rilevamento delle collisioni:...
19
VisibilitySensor VisibilitySensor : X3DEnvironmentalSensorNode { SFBool[in,out]enabledTRUE SFVec3f [in,out] center0 0 0 SFVec3f[in,out] size0 0 0 SFTime[out] enterTime SFTime [out] exitTime... } Rileva quando unarea rappresentata da un parallelepipedo è visibile allavatar Permette di far iniziare (terminare) delle animazioni quando lavatar può o meno vedere un particolare oggetto (utile per attirare lattenzione dellutente)
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.