Sistemi multimediali Massimiliano Piscozzi – [email protected] Esercizio (1) • Animazione (in contemporanea) della rotazione di un parallelepipedo, del colore di una sfera e della traslazione di un cono OrientationInterp. set_fraction key keyValue value_changed Transform rotation ·· · ·· · TimeSensor cycleInterval loop fraction_changed ·· · ColorInterpolator set_fraction key keyValue value_changed Material diffuseColor ·· · ·· · PositionInterp. set_fraction key keyValue value_changed ·· · Transform translation ·· · Esercizio (2) • 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 (3) • Creazione dei 3 interpolatori <OrientationInterpolator DEF="interpolator1" key="0 0.2 1" keyValue="0 0 1 0, 0 0 1 1.57, 0 0 1 0"/> <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"/> TouchSensor • Rileva quando l’utente “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] enabled SFVec3f [out] hitNormal_changed SFVec3f [out] hitPoint_changed SFVec3f [out] hitTexCoord_changed SFBool [out] isActive SFBool [out] isOver SFTime [out] touchTime ... } “” TRUE Esercizio • Spostamento di una piccola sfera sulla superficie di un cono • Creazione della sfera • Creazione del cono e del sensore • Routing dell’evento <Transform DEF="sphereTransform"> <Shape> <Sphere radius="0.1"/> <Appearance> <Material diffuseColor="0 0 1"/> </Appearance> </Shape> </Transform> <Transform> <Shape> <Cone bottomRadius="1" height="3"/> <Appearance> <Material diffuseColor="1 0 0"/> </Appearance> </Shape> <TouchSensor DEF="sensor"/> </Transform> <ROUTE fromNode="sensor" fromField="hitPoint_changed" toNode="sphereTransform" toField="set_translation"/> Esercizio (1) • Creazione di un pulsante per far apparire un oggetto Transform children ·· · Material diffuseColor ·· · TouchSensor touchTime ·· · ... TimeSensor ScalarInterpolator cycleInterval set_fraction loop key startTime keyValue fraction_changed value_changed ·· · ·· · Esercizio (2) • Creazione del pulsante <Transform translation="-3 0 0"> <Shape> <Sphere radius="1"/> <Appearance> <Material diffuseColor="0.7 0.7 0.7"/> </Appearance> </Shape> <TouchSensor DEF="touchSensor"/> </Transform> • Creazione dell’oggetto da far apparire <Transform translation="3 0 0"> <Shape> <Sphere radius="1"/> <Appearance> <Material DEF="sphereMaterial" diffuseColor="1 1 0" transparency="1"/> </Appearance> </Shape> </Transform> Esercizio (3) • Creazione del timer • Creazione dell’interpolatore • Routing degli eventi <TimeSensor DEF="timer" cycleInterval="3" loop="false"/> <ScalarInterpolator DEF="interpolator" key="0 1" keyValue="1 0"/> <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"/> 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 all’asse Y del sistema di coordinate locali PlaneSensor : X3DDragSensorNode{ SFString [in,out] description SFBool [in,out] autoOffset SFVec3f [in,out] offset SFBool [in,out] enabled SFVec2f [in,out] minPosition SFVec2f [in,out] maxPosition SFBool [out] isActive SFBool [out] isOver SFVec3f [out] trackPoint_changed SFVec3f [out] translation_changed ... } “” TRUE 000 TRUE 00 -1 -1 y maxPosition x z minPosition Altri sensori (2) SphereSensor SFString SFBool SFVec3f SFBool SFBool SFBool SFVec3f SFRotation ... } : X3DDragSensorNode{ [in,out] description [in,out] autoOffset [in,out] offset [in,out] enabled [out] isActive [out] isOver [out] trackPoint_changed [out] rotation_changed y x z diskAngle y “” TRUE 000 TRUE x z CylinderSensor : X3DDragSensorNode{ SFString [in,out] description SFBool [in,out] autoOffset SFVec3f [in,out] offset SFBool [in,out] enabled SFFloat [in,out] minAngle SFFloat [in,out] maxAngle SFFloat [in,out] diskAngle SFBool [out] isActive SFBool [out] isOver SFVec3f [out] trackPoint_changed SFRotation [out] rotation_changed ... } “” TRUE 000 TRUE 0 -1 pi/12 Esercizio • Utilizzo del nodo SphereSensor per ruotare un oggetto • Creazione di un cubo <Transform translation="3 0 0"> <Shape> <Box size="2 2 2"/> <Appearance> <Material diffuseColor="0 0 1"/> </Appearance> </Shape> </Transform> • Creazione di un cubo e di un sensore sphereSensor ad esso associato <Transform translation="-3 0 0"> <Transform DEF="boxTransform"> <Shape> <Box size="2 2 2"/> <Appearance> <Material diffuseColor="1 0 0"/> </Appearance> </Shape> </Transform> <SphereSensor DEF="sensor"/> </Transform> • Routing dell’evento <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 dall’utente) Zero o più campi: PROTOTYPE Uno o più nodi: – Nome – Nome – Interfaccia – Corpo – Deve esistere un nodo radice – Tipo – Tipo di accesso (input/output per il routing degli eventi) – Valori di default – 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 Esempio di prototipo • Prototipo “Colonna” caratterizzato da un colore e un raggio Colonna Transform children ·· · Shape geometry appearance ·· · raggio colore Cylinder Appearance radius material ·· · ·· · Material diffuseColor ·· · Prototipi (1) • Codifica in XML della dichiarazione di prototipi <ProtoDeclare name=“nomePrototipo”> <ProtoInterface> ... </ProtoInteface> <ProtoBody> ... </ProtoBody> </ProtoDeclare> Interfaccia costituita da campi <field name=“...” type=“...” accessType=“...” value=“...”/> Corpo costituito da dichiarazioni di nodi - Il collegamento tra i campi dei nodi e i campi dell’interfaccia avviene attraverso i tag <IS> e <connect> <unNodo> <IS> <connect nodeField=“...” protoField=“...”/> </IS> </unNodo> Prototipi (2) • Codifica in XML della creazione di istanze di un prototipo <ProtoInstance name=“nomePrototipo”> ... </ProtoInstance> Lista dei valori dei campi <fieldValue name=“...” value=“...”/> Se il valore di un campo non viene specificato esso assume il valore di default (specificato nell’interfaccia o in base alle specifiche X3D) Prototipi: esempio <ProtoDeclare name="Colonna"> <ProtoInterface> <field name="raggio" accessType="inputOutput" type="SFFloat" value="0.3"/> <field name="colore" accessType="inputOutput" type="SFColor" value="0.8 0.7 0.3"/> </ProtoInterface> <ProtoBody> <Transform translation="0 1.25 0"> <Shape> <Cylinder height="2.5"> <IS> <connect nodeField="radius" protoField="raggio"/> </IS> </Cylinder> <Appearance> <Material diffuseColor="0.8 0.7 0.3"> <IS> <connect nodeField="diffuseColor" protoField="colore"/> </IS> </Material> </Appearance> </Shape> </Transform> </ProtoBody> </ProtoDeclare> <ProtoInstance name="Colonna"/> <ProtoInstance name="Colonna"> <fieldValue name="colore" value="0 0 2"/> </ProtoInstance> <ProtoInstance name="Colonna"> <fieldValue name="raggio" value="0.1"/> </ProtoInstance> <ProtoInstance name="Colonna"> <fieldValue name="colore" value="0 0 2"/> <fieldValue name="raggio" value="0.1"/> </ProtoInstance>