Massimiliano Piscozzi – piscozzi@dico.unimi.it Sistemi multimediali Massimiliano Piscozzi – piscozzi@dico.unimi.it
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 · · · ColorInterpolator set_fraction · · · key keyValue value_changed TimeSensor cycleInterval Material loop diffuseColor · · · fraction_changed · · · 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> <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> Creazione di un TimeSensor <TimeSensor DEF="timer" cycleInterval="4" loop="true"/>
Esercizio (3) Creazione dei 3 interpolatori Routing degli eventi <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 TRUE 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 <Transform DEF="sphereTransform"> <Shape> <Sphere radius="0.1"/> <Appearance> <Material diffuseColor="0 0 1"/> </Appearance> </Shape> </Transform> Creazione del cono e del sensore <Transform> <Shape> <Cone bottomRadius="1" height="3"/> <Appearance> <Material diffuseColor="1 0 0"/> </Appearance> </Shape> <TouchSensor DEF="sensor"/> </Transform> Routing dell’evento <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 set_fraction · · · key keyValue value_changed cycleInterval loop startTime fraction_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 <TimeSensor DEF="timer" cycleInterval="3" loop="false"/> Creazione dell’interpolatore <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"/>
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 TRUE SFVec3f [in,out] offset 0 0 0 SFBool [in,out] enabled TRUE SFVec2f [in,out] minPosition 0 0 SFVec2f [in,out] maxPosition -1 -1 SFBool [out] isActive SFBool [out] isOver SFVec3f [out] trackPoint_changed SFVec3f [out] translation_changed ... } x y z minPosition maxPosition
Altri sensori (2) y x z y x z diskAngle SphereSensor : X3DDragSensorNode{ SFString [in,out] description “” SFBool [in,out] autoOffset TRUE SFVec3f [in,out] offset 0 0 0 SFBool [in,out] enabled TRUE SFBool [out] isActive SFBool [out] isOver SFVec3f [out] trackPoint_changed SFRotation [out] rotation_changed ... } x y z CylinderSensor : X3DDragSensorNode{ SFString [in,out] description “” SFBool [in,out] autoOffset TRUE SFVec3f [in,out] offset 0 0 0 SFBool [in,out] enabled TRUE SFFloat [in,out] minAngle 0 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 diskAngle
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"/> 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) 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
Esempio di prototipo Prototipo “Colonna” caratterizzato da un colore e un raggio Colonna Transform children · · · Shape geometry appearance · · · raggio Cylinder Appearance radius material · · · · · · colore Material diffuseColor · · ·
Prototipi (1) Codifica in XML della dichiarazione di prototipi <ProtoDeclare name=“nomePrototipo”> <ProtoInterface> ... </ProtoInteface> <ProtoBody> </ProtoBody> </ProtoDeclare> <field name=“...” type=“...” accessType=“...” value=“...”/> Interfaccia costituita da campi <unNodo> <IS> <connect nodeField=“...” protoField=“...”/> </IS> </unNodo> 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>
Prototipi (2) Codifica in XML della creazione di istanze di un prototipo <ProtoInstance name=“nomePrototipo”> ... </ProtoInstance> <fieldValue name=“...” value=“...”/> Lista dei valori dei campi 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"> <connect nodeField="diffuseColor" protoField="colore"/> </Material> </Appearance> </Shape> </Transform> </ProtoBody> </ProtoDeclare> <ProtoInstance name="Colonna"/> <ProtoInstance name="Colonna"> <fieldValue name="colore" value="0 0 2"/> </ProtoInstance> <fieldValue name="raggio" value="0.1"/>