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.
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.
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.
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.
Open Graph Protocol, Facebook e il Web SemanticoCome sfruttare il Web Semantico "made in Facebook" |
Introduzione a RDFa - 2Arricchire un documento HTML con metadati semantici presi dal... |
Introduzione a RDFaCos'è e a cosa serve il linguaggio che potrebbe aprire il campo alle... |
Usare SVG per creare sfondi flessibili, scalabili e divertentiScopriamo cos'è il formato SVG e come possiamo usarlo in modo... |
Visualizzare i metadati RDF Dublin core con le trasformazioni XSLMettere insieme XSL, XPATH e le definizioni Dublin core per... |
Guida PodcastingUn percorso in 16 lezioni, per entrare nella filosofia del podcast... |
Guida Smil 2.0Un percorso pratico alla scoperta di SMIL: il linguaggio (XML) per... |
Guida Web serviceCosa sono, a cosa servono e come si creano servizi Web, i sistemi... |
Ogni mese, direttamente nella tua e-mail: articoli, guide, FAQ e approfondimenti sui linguaggi della famiglia XML.
Iscriviti alla newsletter