Massimiliano Piscozzi – Sistemi multimediali
Riassunto lezione precedente Sintassi XML –Tag case-sensitive –Tag di apertura e chiusura –Tag correttamente innestati –Caratteri speciali –... <!DOCTYPE X3D PUBLIC " Struttura di un file X3D-XML Nodi principali di X3D (specifiche e codifica XML) –Transform –Shape –Appearance –Material –Nodi derivati da X3DGeometryNode
Trasformazioni e pivot point d Creazione di una primitiva geometrica nel centro del sistema di coordinate locale Utilizzo di due trasformazioni geometriche in modo da posizionare il pivot point al centro della base del cilindro
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
Nodo NavigationInfo (1) Descrive quali paradigmi di navigazione abilitare: –Walk –Examine –Fly –... Descrive le caratteristiche fisiche dellavatar –Dimensioni dellavatar 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) Esempi – NavigationInfo : X3DBindableNode{ SFBool [in] set_bind SFTime [out] bind_time SFBool [out] isBound MFString [in,out] type[EXAMINE ANY] SFFloat[in,out]speed1.0 SFBool [in,out] headlightTRUE MFFloat [in,out] avatarSize[ ]... } Attenzione! La lista dei valori è racchiusa da singoli apici: I singoli valori sono racchiusi da doppi apici:
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 lampiezza 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) Esempi –<Viewpoint description= Dall'alto position= orientation= /> – 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] fieldOfViewpi / 4... } '
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 x z Direzione di osservazione d <Transform DEF="TargetPoint" translation="..." rotation="..."> <Viewpoint description="Punto di vista" position="0 0 d"/> Posizione viewpoint –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 Viewpoints inseriti in trasformazioni geometriche Impostazione dei metodi di navigazione –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] ambientIntensity0 SFColor [in,out] color1 1 1 SFFloat [in,out] intensity1 SFVec3f[in,out] direction SFBool [in,out] onTRUE... }
Illuminazione (2) Attenuazione: 1/max(a + b × r + c × r 2, 1) PointLight : X3DLightNode{ SFFloat [in,out] ambientIntensity0 SFVec3f[in,out]attenuation1 0 0 SFColor [in,out] color1 1 1 SFFloat [in,out] intensity1 SFVec3f[in,out] location0 0 0 SFFloat[in,out]radius100 SFBool [in,out] onTRUE... } SpotLight : X3DLightNode{ SFFloat [in,out] ambientIntensity0 SFVec3f[in,out]attenuation1 0 0 SFColor [in,out] color1 1 1 SFFloat [in,out] intensity1 SFVec3f[in,out] location0 0 0 SFVec3f[in,out] direction SFFloat[in,out]radius100 SFFloat[in,out]beamWidthpi/2 SFFloat[in,out]cutOffAnglepi/4 SFBool [in,out] onTRUE... }
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... –Definiscono un insieme di valori chiave (posizioni, colori,...) associati a valori compresi nellintervallo [0,1] 01 01
Nodo TimerSensor (1) TimerSensor : X3DTimeDependentNode, X3DSensorNode{ SFBool [in,out] enabledTRUE SFTime [in,out] cycleInterval1 SFBool [in,out] loopFALSE SFTime [in,out] startTime0 SFTime[in,out]stopTime0 SFTime[in,out] pauseTime0 SFTime [in,out] resumeTime0 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 t startTime stopTime loop = true isActive = true cycleInterval
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 t startTime stopTime loop = false isActive = true isActive = false cycleInterval
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 t startTime loop = true isActive = true isActive = false cycleInterval stopTime Alla fine di ogni ciclo viene generato un evento cycleTime: utile per la sincronizzazione di animazioni Gli eventi isActive=true e isActive=false vengono generati allinizio e alla fine dellintervallo temporale
Nodi interpolatori PositionInterpolator : X3DInterpolatorNode{ SFFloat [in] set_fraction MFFloat [in,out] key[] MFVec3f [in,out] keyValue[] SFVec3f [out] value_changed... } Analogamente per: –ColorInterpolator –OrientationInterpolator –ScalarInterpolator –... key keyValue set_fractionvalue_changed
Route Il tag permette di connettere due campi di due nodi distinti al fine di descrivere il behaviour graph Sintassi: I campi fromNode e toNode contengono i nomi dei due nodi –essi devono quindi essere nominati attraverso lattributo DEF I campi specificati negli attributi fromField e toField devono essere dello stesso tipo Il campo specificato nellattributo fromField deve essere –o di tipo outputOnly –o di tipo inputOutput Il campo specificato nellattributo toField deve essere –o di tipo inputOnly –o di tipo inputOutput
Route: esempio TimeSensor cycleTime fraction_changed · · · PositionInterpolator set_fraction key · · · Transform translation · · · Animazione della traslazione di un nodo transform keyValue value_changed <TimeSensor DEF="Timer" cycleInterval="5" loop="true"/> <PositionInterpolator DEF="Interpolatore" key=" " keyValue="0 0 0, 0 3 0, 3 0 0, 0 0 0"/> <Transform DEF="Trasformazione"> Nodi Figli <ROUTE fromField="fraction_changed" fromNode="Timer" toField="set_fraction" toNode="Interpolatore"/> <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 TimeSensor cycleInterval · · · loop fraction_changed OrientationInterp. set_fraction · · · key keyValue value_changed ColorInterpolator set_fraction · · · key keyValue value_changed PositionInterp. set_fraction · · · key keyValue value_changed Transform rotation · · · Transform translation · · · Material diffuseColor · · ·
Esercizio (2) <Material diffuseColor="1 0 0"/> Creazione dei tre oggetti distribuiti lungo lasse X <Material DEF="sphereMaterial" diffuseColor="1 0 1"/> <Cone bottomRadius="1" height="2"/> <Material diffuseColor="0 0 1"/> Creazione di un TimeSensor
Esercizio (3) Creazione dei 3 interpolatori Routing degli eventi
TouchSensor Rileva quando lutente punta ad un oggetto figlio del nodo padre del sensore Utile soprattutto per la creazione di pulsanti TouchSensor : X3DTouchSensorNode{ SFString [in,out] description SFBool[in,out] enabledTRUE SFVec3f [out] hitNormal_changed SFVec3f [out] hitPoint_changed SFVec3f[out]hitTexCoord_changed SFBool[out]isActive SFBool[out]isOver SFTime[out]touchTime... }
Esercizio Spostamento di una piccola sfera sulla superficie di un cono Creazione della sfera Creazione del cono e del sensore Routing dellevento <ROUTE fromNode="sensor" fromField="hitPoint_changed" toNode="sphereTransform" toField="set_translation"/>
Esercizio (1) Creazione di un pulsante per far apparire un oggetto TouchSensor touchTime · · · Transform · · ·... TimeSensor cycleInterval loop · · · startTime ScalarInterpolator set_fraction · · · key keyValue value_changed Material diffuseColor · · · fraction_changed children
Esercizio (2) Creazione del pulsante Creazione delloggetto da far apparire <Material DEF="sphereMaterial" diffuseColor="1 1 0" transparency="1"/>
Esercizio (3) Creazione del timer Creazione dellinterpolatore <ScalarInterpolator DEF="interpolator" key="0 1" keyValue="1 0"/> Routing degli eventi <ROUTE fromNode="touchSensor" fromField="touchTime" toNode="timer" toField="startTime"/> <ROUTE fromNode="timer" fromField="fraction_changed" toNode="interpolator" toField="set_fraction"/> <ROUTE fromNode="interpolator" fromField="value_changed" toNode="sphereMaterial" toField="set_transparency"/>
PlaneSensor : X3DDragSensorNode{ SFString[in,out]description SFBool [in,out] autoOffsetTRUE SFVec3f[in,out] offset0 0 0 SFBool[in,out] enabledTRUE SFVec2f [in,out] minPosition0 0 SFVec2f[in,out]maxPosition SFBool[out]isActive SFBool[out]isOver SFVec3f[out]trackPoint_changed SFVec3f[out]translation_changed... } Altri sensori (1) Sensori per il dragging: –PlaneSensor: dragging rispetto ad un piano (z=0 nel sistema di coordinate locali) –SphereSensor: dragging di tipo rotazionale rispetto ad un punto (il centro del sistema di coordinate locale) –CylinderSensor: dragging di tipo rotazionale rispetto allasse Y del sistema di coordinate locali x y z minPosition maxPosition
Altri sensori (2) SphereSensor : X3DDragSensorNode{ SFString[in,out]description SFBool [in,out] autoOffsetTRUE SFVec3f[in,out] offset0 0 0 SFBool[in,out] enabledTRUE SFBool[out]isActive SFBool[out]isOver SFVec3f[out]trackPoint_changed SFRotation[out]rotation_changed... } CylinderSensor : X3DDragSensorNode{ SFString[in,out]description SFBool [in,out] autoOffsetTRUE SFVec3f[in,out] offset0 0 0 SFBool[in,out] enabledTRUE SFFloat [in,out] minAngle0 SFFloat[in,out]maxAngle -1 SFFloat[in,out]diskAngle pi/12 SFBool[out]isActive SFBool[out]isOver SFVec3f[out]trackPoint_changed SFRotation[out]rotation_changed... } x y z x y z diskAngle
Esercizio Utilizzo del nodo SphereSensor per ruotare un oggetto Creazione di un cubo Creazione di un cubo e di un sensore sphereSensor ad esso associato Routing dellevento <ROUTE fromNode="sensor" fromField="rotation_changed" toNode="boxTransform" toField="set_rotation"/>
Definizione di nuovi nodi E possibile definire nuovi tipi di nodo a partire da nodi esistenti (built-in o definiti dallutente) PROTOTYPE –Nome –Interfaccia –Corpo Zero o più campi: –Nome –Tipo –Tipo di accesso (input/output per il routing degli eventi) –Valori di default Uno o più nodi: –Deve esistere un nodo radice –Il nodo radice determina quando il prototipo può essere istanziato A differenza di USE il prototipo può possedere dei campi il cui valore può variare per ogni istanza
colore Esempio di prototipo Prototipo Colonna caratterizzato da un colore e un raggio Transform · · · Shape geometry · · · Appearance · · · appearance Cylinder radius · · · Material diffuseColor · · · children material raggio Colonna
Prototipi (1) Codifica in XML della dichiarazione di prototipi <field name=... type=... accessType=... value=.../> Interfaccia costituita da campi <connect nodeField=... protoField=.../> Corpo costituito da dichiarazioni di nodi - Il collegamento tra i campi dei nodi e i campi dellinterfaccia avviene attraverso i tag e
Prototipi (2) Codifica in XML della creazione di istanze di un prototipo... Lista dei valori dei campi Se il valore di un campo non viene specificato esso assume il valore di default (specificato nellinterfaccia o in base alle specifiche X3D)
Prototipi: esempio <field name="raggio" accessType="inputOutput" type="SFFloat" value="0.3"/> <field name="colore" accessType="inputOutput" type="SFColor" value=" "/>