Come accennato nel precedente capitolo, il mapping sulle
primitive viene eseguito secondo precise modalita' di default.
Quando applicata su una sfera, l'immagine di texture viene
avvolta sull'intera superficie; per quanto riguarda il cilindro,
la texture si avvolge sulla superficie laterale e altre due copie
dell’immagine vengono mappate sulle due basi; per il cono
è previsto un avvolgimento sulla superficie laterale
mentre una copia viene posta sulla base; per mappare un box
infine, VRML riporta una copia dell'immagine su ogni faccia del
cubo.
In questo capitolo si affronteranno i concetti di base per la
corretta gestione delle textures, cominciando ad analizzare un
nuovo campo del nodo Appearance: texturetransform. Questo campo
consente di gestire le modalita' secondo cui mappare le textures
sulle superfici. Il campo texturetransform contiene al suo
interno un nodo Texturetransform che consente l'utilizzo dei
seguenti campi:
scale
rotation
center
translation
Il campo scale serve per modificare le dimensioni
dell'immagine da mappare, e consente quindi di mappare sulla
superficie piu' copie della stessa texture.
Il campo rotation permette di ruotare la texture da mappare.
La rotazione viene effettuata attorno all'asse perpendicolare al
piano della texture. Il campo translation, infine, consente di
traslare la texture.
Per il corretto utilizzo dei campi rotation e translation
occorre utilizzare le coordinate s,t che indicano le variabili
utilizzate per la gestione dell'immagine da mappare. In pratica,
la coordinata s indica l'ascissa di un punto dell'immagine,
mentre la coordinata t ne rappresenta l'ordinata. La coppia 0 0
indica l'angolo in basso a sinistra; 1 0 l'angolo in basso a
destra, 0 1 l'angolo in alto a sinistra; 1 1 l'angolo in alto a
destra.
Gli esempi seguenti sono realizzati su un oggetto a forma di
cubo per consentire una più immediata visualizzazione
delle operazioni effettuate e degli effetti ottenuti. Si tenga
presente comunque che tutte queste operazioni hanno maggior senso
quando applicate a oggetti complessi del tipo IndexedfaceSet.
Inoltre, finche' ci si limita a mappare textures su forme
geometriche piuttosto semplici, si puo' fare questo lavoro con un
semplice text editor, ma nel caso di geometrie piu' complesse
diviene indispensabile l'ausilio di un tool di sviluppo.
Un' ultima considerazione prima degli esempi: non si possono
avere oggetti con diverse textures, a meno che l'oggetto stesso
non sia definito da piu' nodi Shape.
Il campo scale
Il campo scale, come detto, serve a modificare le dimensioni
dell'immagine da mappare, e consente quindi di mappare sulla
superficie piu' copie della stessa texture. Nel listato si
è deciso di mappare la superfice di un cubo con quattro
copie del file GIF:
#VRML V2.0 utf8
# esempio texture: scale
Shape {
appearance Appearance {
material Material { diffuseColor 1 1 1 }
texturetransform Texturetransform {
scale 2 2
}
texture ImageTexture { url "lux.gif" }
}
geometry Box { size 2 2 2
}
}
Tutto molto semplice. Si tenga presente che una tale
operazione puo' rivelarsi molto utile quando si debba mappare una
texture che rappresenta un certo materiale sopra una superficie
molto ampia. Applicando la texture singola a tutto l'oggetto si
assisterebbe ad una dilatazione eccessiva dell’immagine con
la conseguente visualizzazione di dettagli decisamente
grossolani. Impostando valori maggiori di 1 al campo scale si
ottiene il rimpicciolimento della texture. Valori minori di 1 (ma
comunque maggiori di 0) realizzano viceversa un
ingrandimento.
Il campo rotation
Grazie al campo rotation è possibile ruotare la texture
da mappare intorno all'oggetto. Il centro attorno a cui
effettuare la rotazione viene specificato nel campo center.
#VRML V2.0 utf8
# gestione texture: field rotation
Shape {
appearance Appearance {
material Material { diffuseColor 1 1 1 }
texturetransform Texturetransform {
center .5 .5
rotation .78
}
texture ImageTexture { url "lux.gif" }
}
geometry Box { size 2 2 2
}
}
Come si nota, si è deciso di far ruotare l'immagine di
texture per un valore di 0.78 ( pressapoco un quarto del valore
3.14, in pratica 45 gradi). Il centro attorno a cui effettuare la
rotazione è stato specificato nel campo center mediante le
coordinate s,t della texture.
Il campo translation
Il campo translation serve per traslare la texture, per
spostare cioè la sua posizione rispetto ai valori di
default 0 0 delle coordinate s,t.
#VRML V2.0 utf8
# gestione texture: field translation
Shape {
appearance Appearance {
material Material { diffuseColor 1 1 1 }
texturetransform Texturetransform {
translation 0.5 0.5
}
texture ImageTexture { url "lux.gif" }
}
geometry Box { size 2 2 2
}
}
In questo caso l'angolo inferiore sinistro dell'immagine
è stato traslato esattamente al centro di ogni faccia del
cubo.