Fino ad ora si sono associati dei colori alle superfici
tramite il nodo Material (contenuto a sua volta nel nodo
Appearance). Nella realtà è però comune
trovare oggetti dalle superfici non uniformi quali il legno, il
marmo ecc; a tale scopo il VRML prevede l’impiego di
immagini di textures. Grazie ad esse è possibile
rappresentare in maniera più realistica le superfici degli
oggetti. In pratica si tratta di mappare sopra di essi delle
immagini. I formati grafici supportati sono GIF, JPG e PNG.
Il nodo Appearance contiene oltre al field material, altri 2
campi: il field texture e il field texturetransform. In questo
capitolo si analizzerà il campo texture.
Per caratterizzare una superficie con una texture, è
sufficiente introdurre nel nodo Appearance il field texture e
fornire le appropriate indicazioni relative all’immagine da
impiegare. Il seguente esempio illustra chiaramente l’uso
di tale campo:
#VRML V2.0 utf8
# pianeta Terra: field textures
Shape {
appearance Appearance {
material Material { }
texture ImageTexture {url "ilmondo.jpg"}
}
geometry Sphere { radius 2 }
}
In questo semplice esempio, si è mappata la superficie
della sfera con l’immagine contenuta nel file
‘ilmondo.jpg’. Il risultato è la
visualizzazione, all’interno del player, del pianeta
Terra.
Il field texture contiene al suo interno il nodo ImageTexture,
questi a sua volta contiene il field url che specifica il
percorso per la localizzazione del file da utilizzare come
texture.
L’immagine viene mappata in maniera tale da ricoprire
tutta la superficie della sfera. Come si può notare, si
è utilizzato anche il campo material pur senza attributi.
Si provi ad eliminare dal sorgente tale field e a rivisualizzare
la scena per verificare la differenza del risultato. Si consideri
inoltre la possibilità di attribuire comunque un colore
alla sfera: il colore in questione verrà visualizzato in
alternativa all’immagine fino al completo download di
quest’ultima.
L’impiego di textures, come visto nel semplice esempio,
consente indubbiamente di creare mondi tridimensionali di
notevole qualità dal punto di vista estetico, contribuendo
a fornire ad essi un forte impatto realistico. Possibili
svantaggi risiedono nel fatto che ogni texture introdotta nel
mondo deve essere caricata dal browser dell’utente, con le
immaginabili conseguenze relative ai tempi di caricamento.
Inoltre, un altro problema di cui è bene prendere nota
è che inserendo molte textures all’interno di un
mondo, si diminuisce in maniera considerevole il frame rate in
fase di rendering, e questo può causare una sensazione di
movimento a scatti in fase di navigazione. Si può in parte
ovviare a tali problemi cercando di ottimizzare al meglio le
immagini da utilizzare ed evitando l’impiego di immagini
troppo grandi in termini di pixel.
Textures trasparenti e textures animate
VRML offre ulteriori possibilità realative
all’impiego di textures. Come texture nel campo url si
può specificare infatti anche un’immagine gif con
attributi di trasparenza. Se per esempio si utilizza una texture
contenente il numero 1 su sfondo bianco, è possibile
rendere il bianco trasparente in un editor grafico (Photoshop,
PaintShop Pro, Fireworks, ecc.) e poi mappare la texture su una
box. In fase di rendering, si osserverà soltanto il
numero 1 ripetuto sulle facce della scatola creata.
VRML consente inoltre di utilizzare come textures immagini
animate: è sufficiente specificare nel nodo Appearance un
field texture contenente un nodo MovieTexture. Il formato
supportato è MPEG-1.
Il seguente semplice esempio mappa il filmato MPEG-1 su una
faccia.
#VRML V2.0 utf8
# texture animate: nodo MovieTexture
Shape {
appearance Appearance {
texture MovieTexture {
url "movie.mpg"
loop trUE
startTime 1
}
}
geometry IndexedfaceSet {
coord Coordinate {
point [ 0 0 0, 20 0 0, 20 20 0, 0 20 0 ]
}
coordIndex [0, 1, 2, 3, -1]
}
}
Il campo loop impostato a trUE indica che il video è da
ripetere in continuazione. Il campo startTime indica invece il
punto da cui partire.
A maggior ragione qui valgono le considerazioni circa la
cautela con cui usare textures nei file VRML. Impiegare video
MPEG nei nostri mondi può portare infatti a tempi di
download snervanti e a fastidiosi rallentamenti in fase di
rendering della scena.
Nodo LOD
Quando si realizzano oggetti molto complessi formati da
migliaia di poligoni, o quando si decide di ricoprire molte
superfici con textures diverse, è assai probabile andare
incontro a rallentamenti più o meno marcati in fase di
rendering. Tutto sommato, comunque, un alto livello di dettaglio
non risulta essere necessario in ogni momento. In genere è
necessario ottenere il massimo dettaglio di un oggetto quando ci
si trova vicini ad esso; quando invece ci si trova ad una certa
distanza da esso non è più necessario apprezzare
tutte le particolarità dell’oggetto: dopotutto nella
realtà accade proprio questo.
In VRML, si può implementare questa caratteristica con
l’introduzione del nodo LOD (Level Of Detail). Con il nodo
LOD si possono specificare cioè diversi valori di distanza
nei quali l'oggetto in questione viene renderizzato in maniera
diversa.
Si consideri il seguente esempio:
#VRML V2.0 utf8
# esempio di utilizzo del nodo LOD
LOD {
range [6]
level [
Shape {
appearance Appearance {
material Material { emissiveColor 0 0 0 }
texture ImageTexture { url "mondo.jpg" }
}
geometry Sphere { radius 2 }
}
Shape {
appearance Appearance {
material Material { emissiveColor .2 0.1 1 }
}
geometry Sphere { radius 2 }
}
]
}
Il risultato di questo breve sorgente VRML è quello di
visualizzare una sfera senza texture quando l'utente si trova ad
una distanza superiore ai 6 metri e di applicare invece la
texture quando l’utente si avvicina ad una distanza
inferiore ai 6 metri. Si possono definire più livelli di
dettaglio: è sufficiente indicare diversi livelli
all’interno del field range. I vari nodi da utilizzare per
i livelli sono contenuti nel campo level. Il primo nodo indicato
è quello che si riferisce al primo livello, quello
cioè dove l’osservatore è più vicino
all’oggetto.
Accenno alla gestione delle mappature
VRML si comporta in maniera diversa nel mapping delle textures
a seconda delle primitive su cui vengono applicate. Non sempre
però questo metodo di default risulta l’approccio
più soddisfacente per quello che si propone il
programmatore di mondi VRML. Quello che occorre è un
maggior controllo su come vengono mappate le immagini, come si
avrà modo di verificare nel prossimo capitolo.