Sistemi multimediali
Massimiliano Piscozzi – [email protected]
ProximitySensor
• Rileva quando l’avatar entra (ed esce) in una zona rappresentata da
un parallelepipedo
• Quando l’utente si trova all’interno del parallelepipedo il sensore
tiene traccia della sua posizione e orientazione
ProximitySensor : X3DEnvironmentalSensorNode {
SFBool
[in,out] enabled
TRUE
SFVec3f
[in,out] center
000
SFVec3f
[in,out] size
000
SFTime
[out]
enterTime
SFTime
[out]
exitTime
SFRotation
[out]
orientation_changed
SFVec3f
[out]
position_changed
SFBool
[out]
isActive
...
}
 Permette di far iniziare (o terminare) delle animazioni quando l’avatar si avvicina
ad un particolare oggetto (o quando vi si allontana)
 Permette di muovere un oggetto in modo da replicare il movimento dell’avatar
(utile per la creazione di interfacce)
Esempio
• Animazione di un parallelepipedo in base alla vicinanza
dell’avatar
ProximitySensor
enterTime
TimeSensor
PositionInterp.
startTime
set_fraction
fraction_changed
value_changed
Transform
·· ·
·· ·
scale
·· ·
exitTime
·· ·
TimeSensor
PositionInterp.
startTime
set_fraction
fraction_changed
value_changed
·· ·
·· ·
Shape
·· ·
Appearance
·· ·
Box
·· ·
Material
·· ·
Esempio
• Posizionamento di un oggetto in base alla posizione
dell’avatar
ProximitySensor
Transform
position_changed
translation
orientation_changed
rotation
·· ·
·· ·
La grandezza del sensore (campo size)
deve essere tale da racchiudere tutta la
scena virtuale
Occorre disabilitare il rilevamento delle
collisioni:
<Collision collide=“false”>
...
</Collision>
Sistema di coordinate locali
corrispondente alla posizione
dell’avatar
Collision
·· ·
Transform
·· ·
VisibilitySensor
• Rileva quando un’area rappresentata da un parallelepipedo è
visibile all’avatar
VisibilitySensor : X3DEnvironmentalSensorNode {
SFBool
[in,out] enabled
TRUE
SFVec3f
[in,out] center
000
SFVec3f
[in,out] size
000
SFTime
[out]
enterTime
SFTime
[out]
exitTime
...
}
 Permette di far iniziare (terminare) delle animazioni quando l’avatar può o meno
vedere un particolare oggetto (utile per attirare l’attenzione dell’utente)
IndexedFaceSet (1)
• Rappresenta una superficie poligonale composta da
facce definite su un insieme di vertici
1
2
0
3
4
0 1 2 3 4
coord ... ... ... ... ...
Faccia 0  3  1
Faccia 1  3  2
Faccia 3  4  2
 L’ordine (orario/antiorario) con il quale si
enumerano i vertici di una faccia determina la
direzione della normale (e quindi il lato visibile
della faccia)
 Le facce poligonali possono avere più di 3 vertici
IndexedFaceSet (2)
IndexedFaceSet : X3DComposedGeometryNode{
MFInt32
[in]
set_colorIndex
MFInt32
[in]
set_coordIndex
MFInt32
[in]
set_normalIndex
MFInt32
[in]
set_texCoordIndex
SFNode
[in,out] color
NULL
SFNode
[in,out] coord
NULL
SFNode
[in,out] normal
NULL
SFNode
[in,out] texCoord
NULL
MFInt32
[]
colorIndex
[]
MFInt32
[]
coordIndex
[]
MFInt32
[]
normalIndex
[]
MFInt32
[]
texCoordIndex
[]
SFBool
[]
colorPerVertex
TRUE
SFBool
[]
normalPerVertex
TRUE
SFBool
[]
ccw
TRUE
SFBool
[]
solid
TRUE
...
}
[X3DColorNode]
[X3DCoordinateNode]
[X3DNormalNode]
[X3DTextureCoordinateNode]
IndexedFaceSet (3)
<IndexedFaceSet coordIndex="0, 1, 2, -1, 2, 1, 3"
colorIndex="0, 1, 2, -1, 3, 3, 3">
<Coordinate point="0 0 0, 2 0 0, 0 2 0, 2 2 0"/>
<Color color="1 0 0, 0 0 1, 1 1 0, 1 1 1"/>
</IndexedFaceSet>
• Il valore ‘-1’ nelle liste degli indici funge da delimitatore per gli indici
delle singole facce
• I valori delle coordinate, dei colori, delle normali e delle coordinate di
superficie (texture) sono memorizzate nei nodi:
<Coordinate point=“...”/>
<Color color=“...”/>
<Normal vector=“...” />
<TextureCoordinate point=“...”/>
(MFVec3f)
(MFColor)
(MFVec3f)
(MFVec2f)
Texturing (1)
• L’aspetto di un oggetto può essere definito attraverso una o
più immagini (textures) applicate sulla superficie:
– Se l’immagine è in una componente (scala di grigi) allora viene utilizzata
per modificare l’intensità del colore definito all’interno del nodo Material
• Le textures sono applicate alle facce di un oggetto definendo
per ogni vertice di ogni faccia delle coordinate di superficie
– Per le primitive geometriche (cube, sphere, ...) non è necessario
specificare le coordinate di superficie
t
(0.5, 1)
(1, 0.5)
1
(1, 0.5)
(0.5, 1)
0
(0.5, 0)
1
s
(0.5, 0)
Texturing (2)
• All’interno di un nodo Appearance è possibile specificare
uno dei seguenti nodi:
– ImageTexture:
– PixelTexture:
– MovieTexture:
immagine bitmap
immagine definita da un nodo SFImage
filmato video
ImageTexture : X3DTexture2DNode {
MFString
[in,out] url
SFBool
[in]
repeatS
SFBool
[in]
repeatT
...
}
PixelTexture : X3DTexture2DNode {
SFImage
[in,out] image
SFBool
[in]
repeatS
SFBool
[in]
repeatT
...
}
“”
TRUE
TRUE
000
TRUE
TRUE
Texturing (3)
MovieTexture : X3DTexture2DNode {
MFString
[in,out] url
SFBool
[in,out] loop
SFFloat
[in,out] speed
SFTime
[in,out] startTime
SFTime
[in,out] stopTime
SFTime
[in,out] pauseTime
SFTime
[in,out] resumeTime
SFBool
[]
repeatS
SFBool
[]
repeatT
SFTime
[out]
duration_changed
SFTime
[out]
elapsedTime
SFBool
[out]
isActive
SFBool
[out]
isPaused
...
}
“”
TRUE
1.0
0
0
0
0
TRUE
TRUE
• All’interno del nodo Appearance è possibile specificare anche
un nodo TextureTransform
TextureTransform : X3DTextureTransform2DNode {
SFVec2f
[in,out] center
00
SFFloat
[in,out] rotation
0
SFVec2f
[in,out] scale
11
SFVec2f
[in,out] translation
00
...
}
Esempio
• Creazione di un tetraedro e applicazione di un’immagine
distinta per ogni faccia
3
2
1
4
<Shape>
<IndexedFaceSet coordIndex="0,2,1, -1, 0,1,3, -1, 1,2,3, -1, 2,0,3"
texCoordIndex="1,2,6, -1, 3,5,8, -1, 5,7,9, -1, 0,1,4">
<Coordinate point="-0.5 0 0.289, 0.5 0 0.289, 0 0 -0.577, 0 0.816 0"/>
<TextureCoordinate point="0 0, 0.5 0, 1 0, 0 0.5, 0.25 0.5, 0.5 0.5, 0.75 0.5, 1 0.5, 0.25 1, 0.75 1"/>
</IndexedFaceSet>
<Appearance>
<ImageTexture url="textureFaces.jpg"/>
</Appearance>
</Shape>
Billboard
• Il nodo Billboard definisce un sistema di coordinate locali tale
che l’asse Z sia indirizzato sempre verso il “punto di vista”
• Utile per approssimare degli elementi grafici tridimensionali
attraverso semplici pannelli bidimensionali con applicate delle
texture
Billboard : X3DGroupingNode {
MFNode
[in]
addChildren
MFNode
[in]
removeChildren
SFVec3f
[in,out] axisOfRotation
MFNode
[in,out] children
...
}
[X3DChildNode]
[X3DChildNode]
010
[]
[X3DChildNode]
Esempio
• Creazione di un gruppo di alberi: ogni albero è rappresentato
attraverso una texture applicata su un pannello bidimensionale
<Transform translation= "…">
<Billboard DEF="Albero" axisOfRotation="0 1 0">
<Shape>
<IndexedFaceSet coordIndex="0,1,2,3" texCoordIndex="0,1,2,3">
<Coordinate point="-1,0,0, 1,0,0, 1,4,0, -1,4,0"/>
<TextureCoordinate point="0,0, 1,0, 1,1, 0,1"/>
</IndexedFaceSet>
<Appearance>
<ImageTexture url="tree.png"/>
</Appearance>
</Shape>
</Billboard>
</Transform>
<Transform translation= "…">
<Billboard USE=“Albero”/>
</Transform>
Sound (1)
• Il nodo Sound permette di creare delle sorgenti acustiche
nello spazio 3D
Sound : X3DSoundNode
SFVec3f
[in,out]
SFVec3f
[in,out]
SFFloat
[in,out]
SFFloat
[in,out]
SFFloat
[in,out]
SFFloat
[in,out]
SFFloat
[in,out]
SFNode
[in,out]
SFBool
[]
...
}
{
location
direction
intensity
minFront
minBack
maxFront
maxBack
source
spatialize
000
001
1.0
0
0
0
0
NULL
TRUE
[X3DSoundSourceNode]
• Modello acustico
minFront
maxFront
location
direction
maxBack
minBack
Sound (2)
• File audio (.wav, .midi, .mp3)
AudioClip : X3DSoundSourceNode {
SFBool
[in,out] loop
SFFloat
[in,out] pitch
SFTime
[in,out] startTime
SFTime
[in,out] stopTime
SFTime
[in,out] pauseTime
SFTime
[in,out] resumeTime
MFString
[in,out] url
SFTime
[out]
duration_changed
SFTime
[out]
elapsedTime
SFBool
[out]
isActive
SFBool
[out]
isPaused
...
}
TRUE
1
0
0
0
0
“”
I campi loop, startTime e
stopTime permettono di
attivare l’Audioclip allo stesso
modo di quanto avviene per il
TimeSensor
 La variazione del pitch modifica sia il tono sia la velocità di riproduzione
• Esempio
<Sound minBack="6" minFront="6" maxBack="11" maxFront="11">
<AudioClip description="LittleBirds" loop="true" url="Littlebirds.mid"/>
</Sound>
Text
• Il nodo Text permette di creare del testo bidimensionale nello
spazio 3D:
– È un nodo del tipo X3DGeometryNode quindi va utilizzato all’interno di
un nodo Shape
Text : X3DGeometryNode {
SFNode
[in,out] fontStyle
MFString
[in,out] string
MFFloat
[in,out] length
SFFloat
[in,out] maxExtent
SFBool
[in.out] solid
...
}
NULL [X3DFontStyleNode]
[]
[]
0.0
FALSE
 E’ possibile specificare più stringhe di caratteri; ognuna di esse sarà
visualizzata su una riga differente
 I valori memorizzati in length specificano la lunghezza di ogni stringa;
essi non sono obbligatori, ma permettono di allungare o comprimere
arbitrariamente le stringhe di caratteri
FontStyle
• Il nodo FontStyle permette di specificare le proprietà di
formattazione del testo specificato nel nodo Text
FontStyle : X3DFontStyleNode {
SFString
[in,out] style
SFString
[in,out] justify
SFBool
[in,out] horizontal
SFBool
[in,out] leftToRight
SFBool
[in,out] topToBottom
SFFloat
[in,out] size
SFFloat
[in,out] spacing
...
}
“PLAIN”
“BEGIN”
TRUE
TRUE
TRUE
1.0
1.0
[“PLAIN” | “BOLD” | “ITALIC” | “BOLDITALIC”]
[“BEGIN” | “END” | “FIRST” | “MIDDLE”]
• Esempio
<Shape>
<Text string='"Hello" "X3D-World!"' length="5 5">
<FontStyle style="BOLDITALIC"/>
</Text>
<Appearance …/>
</Shape>
<Shape>
<Text string='"Hello" "X3D-World!"'>
<FontStyle horizontal="false" />
</Text>
<Appearance …/>
</Shape>
Background
• Il background della scena virtuale può essere definito
attraverso una serie di colori (ground e sky) oppure attraverso
sei immagini (front, back, left, right, top, bottom)
• Il nodo Backround è un nodo di tipo bindable: solo un’istanza
alla volta può essere attiva.
Background : X3DBackgroundNode {
SFBool
[in]
set_bind
SFTime
[out]
bind_time
SFBool
[out]
isBound
MFColor
[in,out] groundColor
MFColor
[in,out] skyColor
MFFloat
[in,out] groundAngle
MFFloat
[in,out] skyAngle
MFString
[in.out] backUrl
MFString
[in.out] bottomUrl
MFString
[in.out] frontUrl
MFString
[in.out] leftUrl
MFString
[in.out] rightUrl
MFString
[in.out] topUrl
...
}
[]
[]
[]
[]
“”
“”
“”
“”
“”
“”
E’ possibile specificare più colori
per il cielo e la terra. Essi vanno
associati ad un determinato angolo
(zenith = 0, orizzonte=pi/2,
nadir=pi)
Scene di grandi dimensioni
• La gestione di scene di grandi dimensioni può essere
agevolata utilizzando prototipi definiti esternamente oppure
attraverso i nodi inline
• Un nodo inline permette di inserire all’interno della scena
corrente i nodi di una scena X3D definita esternamente
<Inline url=“…”/>
 I nodi importati attraverso inline non sono “visibili” agli altri nodi della
scena ed è quindi impossibile stabilire con essi delle connessioni per il
routing degli eventi
X3D in pagine HTML
• L’inserimento di una scena X3D in una pagina HTML avviene
attraverso il tag HTML “EMBED”
<EMBED src=“…” width=“…” height=“…”>
• Esempio
<html>
<head>
<title> X3D in una pagina HTML </title>
</head>
<body bgcolor="white">
<center>
<h1> Integrazione di "MyScene.x3d" in una pagina "html“ </h1>
<EMBED src="MyScene.x3d" width=“700" height="450">
</center>
</body>
</html>
X3D-Edit
• Installazione di X3D-Edit (PC Windows)
– Installare Java sul PC
• “Java FRE – Java Run-Time Environment”
• oppure “Java SDK – Java Software Development Kit”
– Installare l’editor XML Xeena di IBM
(www.alphaworks.ibm.com/tech/xeena)
• Lasciare il path di installazione predefinito (“C:\”)
– Installare la versione di X3D-Edit senza VirtualMachine
(www.web3d.org/x3d/content/X3D-EditAutoInstall/Web_Installers/install.htm)
• Lasciare il path di installazione predefinito
– Creare una variabile d’ambiente
(“Pannello di Controllo””Sistema””Avanzate””Variabili d’ambiente”)
• Nome variabile: JAVA_HOME
• Valore variabile: il path di installazione di Java (la cartella contenente al
suo interno la cartella bin)
Scarica

pps