|
||||||
ROBOTICA
video
immagini
papers
progettati
costruiti
toolbox
vrml
simulatori
Introduzione delle luci |
Fino ad ora abbiamo considerato
gli aspetti di creazione degli oggetti. In particolare abbiamo visto come usare
le semplici primitive messe a disposizione da vrml e come creare oggetti più
articolati definendo i poligoni che li compongono. Abbiamo tralasciato alcuni
nodi molto interessanti come il nodo ElevationGrid o Extrusion ; questi verranno
analizzati in un approfondimento finale.
A questo punto siamo
dunque in grado di costruire oggetti di qualunque forma. Ci manca ancora molto
però per dare un tocco di realismo al nostro mondo. Intanto le superfici degli
oggetti creati sono completamente privi di tessitura (texture) ; inoltre,
in tutti gli esempi visti sinora non abbiamo considerato le luci. In questo
paragrafo ci occuperemo di quest'ultimo argomento ; nel prossimo rivolgeremo
la nostra attenzione all'introduzione di textures.
Come già accennato in
precedenza, il modo in cui le luci vengono implementate è al momento (febbraio
1997) molto dipendente dal browser con cui si effettua il rendering della
scena. Usando per esempio Cosmo Player (Beta 3) e Live3d (Beta 1) si ottengono
risultati molto diversi. Mondi che appaiono molto chiari con un browser potrebbero
apparire molto scuri con l'altro. Questa situazione pone parecchi problemi,
soprattutto considerando che non possiamo sapere quale sarà il browser con
cui l'utente di Internet vedrà il nostro mondo. Il massimo che possiamo fare
è cercare di provare il mondo su più browsers e cercare di trovare le soluzioni
che vanno bene per la maggior parte (o semplicemente progettare il mondo con
il browser più diffuso e assumere che l'utente lo possieda).
Detto questo passiamo
ad analizzare le diverse tipologie di luci che vrml 2.0 introduce.
Una prima possibilità
per illuminare il nostro mondo è quella di inserire una luce direzionale.
In questo caso, tutti i raggi luminosi sono paralleli.
Prima di vedere un esempio,
dovremmo porci la seguente domanda : nei precedenti esempi non abbiamo inserito
luci ; come facevamo allora a vedere gli oggetti inseriti nel mondo ? La risposta
è semplice. Infatti negli esempi precedenti abbiamo sempre definito per ogni
oggetto un campo emissiveColor. Questo campo ci consentiva di colorare la
superficie dell'oggetto. In pratica non si faceva altro che far emettere all'oggetto
una luce di un certo colore, specificato con la tripletta di valori RGB indicati.
Non useremo più ora il campo emissiveColor, in quanto, se impiegato annullerebbe
gran parte degli effetti della luce esterna. In pratica, i nostri oggetti
non sono radioattivi ; il fatto che siano visibili o meno, che abbiano un
colore o un altro è dovuto essenzialmente alla luce che proviene dall'esterno.
Detto questo consideriamo
il semplice esempio seguente :
esempio di utilizzo di un nodo Directional Light
Come si può vedere, non
ho utilizzato il campo emissiveColor, bensì all'interno del nodo Material
ho inserito il campo diffuseColor. Anche in questo caso il colore dell'oggetto
si seleziona specificando una tripletta di valori RGB.
Il nodo DirectionalLight
viene spesso posto all'inizio e indica la presenza di una sorgente luminosa
molto lontana e i cui raggi di luce sono paralleli. Qui ho indicato un solo
field : direction. Il campo direction specifica direzione e verso dei raggi
di luce. In questo caso ho imposto che i raggi si propaghino lungo gli assi
y e z, dall'alto verso il basso e nella direzione negativa dell'asse z. Esistono
altri campi del nodo DirectionalLight. Uno di questi, 'intensity' consente
di specificare la intensità della luce, che altrimenti rimane impostata al
suo valore di default che è 1.
Prima di terminare questo
modello di illuminazione si deve fare una osservazione. In questo caso non
si vede, ma se avessi avuto un piano sottostante alla sfera (o un qualunque
altro oggetto), i raggi di luce avrebbero illuminato il piano nella sua interezza,
senza generare ombre. Tutti gli oggetti sono illuminati nello stesso modo,
senza considerare eventuali ostacoli sul percorso dei raggi luminosi.
Il nodo DirectionalLight
consente di introdurre luce sottoforma di raggi paralleli. Tutti gli oggetti
della scena saranno colpiti da questa luce. Se invece si vuole illuminare
un oggetto in particolare, si deve ricorrere ad un altro modello. Il nodo
SpotLight consente di introdurre highlights su qualche oggetto specificato.
Nel seguente esempio
definiamo due oggetti : una sfera e un cubo. Illuminiamo poi la sola sfera
lasciando in ombra il cubo.
Esempio di utilizzo di un nodo SpotLight
Si può notare come si
sia riusciti nell'intento di illuminare la sola sfera. In pratica non si userà
quasi mai solo pointlights. Solitamente verranno impiegate assieme a modelli
direzionali.
Il nodo PointLight consente
di introdurre una sorgente luminosa in una certa posizione e fare in modo
che essa emetta raggi luminosi in tutte le direzioni. La sintassi del nodo
è molto semplice. Riporto semplicemente il seguente frammento:
Non procedo oltre nell'esame
delle luci. Penso che per il momento ne abbiate abbastanza.
Directional Light
#VRML V2.0 utf8
# esempio di utilizzo di luce direzionale
DirectionalLight {
direction 0 -1 -1
}
Shape {
appearance Appearance {
material Material { diffuseColor 1 0 0 }
}
geometry Sphere { radius 1 }
}
Spot Light
#VRML V2.0 utf8
# esempio di utilizzo di SpotLight
Transform {
translation -3 0 0
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 1 1 1
}
}
geometry Box { size 1 1 1 }
}
]
}
Transform {
translation 3 0 0
children [
SpotLight {
direction 0 0 -1
location 0 0 2
radius 5
beamWidth 1
cutOffAngle 1
}
Shape {
appearance Appearance {
material Material { diffuseColor 0 1 0 }
}
geometry Sphere { radius 1 }
}
]
}
Vediamo brevemente la sintassi del nodo SpotLight.
Concettualmente è meglio mettere il nodo SpotLight all'interno del campo children
dell'oggetto di cui si vuole fare l'highlight. E' comunque possibile porre
il nodo in qualsiasi altra parte del file. I campi di questo nodo sono abbastanza
semplici. Il primo specifica la direzione del fascio luminoso ; il secondo
la posizione della sorgente luminosa ; il terzo il raggio oltre il quale la
luce non ha più effetto. Gli ultimi 2 campi consentono di specificare quanto
concentrato è il fascio luminoso. Bisogna cercare di fare un tuning dei valori
da assegnare a questi campi in modo da ottenere i risultati voluti.
Point Light
PointLight {
radius 5
location 0 0 -10
}
Nella prossima sezione
vedremo come aggiungere ulteriore realismo dettagliando le superfici con textures.