ROBOTICA

video
immagini
papers
progettati
costruiti
toolbox
vrml
simulatori

links

 

Papers
meccanica
sistemi
documents

Capitolo 10° Introduzione delle luci Capitolo 12°

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.

Directional Light

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 :

#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 }
}

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.

Spot Light

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.

#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 } } ] }

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.
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

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:

PointLight {
	radius 5
	location 0 0 -10
}

Non procedo oltre nell'esame delle luci. Penso che per il momento ne abbiate abbastanza.
Nella prossima sezione vedremo come aggiungere ulteriore realismo dettagliando le superfici con textures.