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 ' ‘ – <Viewpoint description= “Dall'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'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"/>