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>
Scarica

pps