Il.luminació.

Tutorial de VRML2.0

Hi ha tres tipus d'il.luminació en VRML: llum direccional (node DirectionalLight), llum puntual (node PointLight) i espot de llum (node SpotLight). Cada un dels tres tipus de llum correspon a un dels tres models clàssics de llum en gràfics per ordinador.

Il.luminació Ambient

El tractament de la llum ambient és diferent a altres sistemes gràfics. En VRML no es disposa d'un control únic per a simular la il.luminació sorgida de les múltiples refleccions i radiacions entre objectes que simplifiquem en la il.luminació ambient. El que tenim és un control d'emissió de llum ambient per a cada tipus de llum i un control de reflecció de llum ambient per a cada material.

En el node Material hi ha el field ambientIntensity el qual determina en quina proporció el material reflecteix la intensitat ambient dels llums que hi ha definits en l'entorn. El valor per aquest field ha de ser dins del rang [0, 1] i el seu valor per defecte és 0.2.

node DirectionalLight

Amb aquest tipus de llum podem il.luminar els objectes amb raigs paral.lels com si fossin els raigs del sol en arribar a la terra. En altres paraules, no tenim un punt de llum d'on surten radialment els raigs, si no que tots els raigs só paral.lels entre ells i per tant incideixen amb el mateix angle sobre una superfície. Vejam un exemple:

Exemple1: Definició d'una il.luminació paral.lela que prové de dalt a la dreta cap avall a l'esquerra.


DirectionalLight {
	ambientIntensity 0.5
	color 1 1 1
	intensity 1
	direction -0.5 -0.5 0
}

Shape { 
	appearance Appearance {
		material Material {
			ambientIntensity 1
			diffuseColor 0 0 1
		}
	}
	geometry Sphere { radius 2 }
}

Transform {
	translation 2 5 -5
	children [
		Shape { 
			appearance Appearance {
				material Material {
					ambientIntensity 1
					diffuseColor 1 1 0
				}
			}
			geometry Cone { bottomRadius 2 height 3 }
		}
	]
}

En aquest exemple hem posat que la reflecció de la intensitat ambient dels materials dels objectes sigui el màxim per així poder apreciar bé la intensitat ambient generada pel llum direccional. En aquest entorn, es veu clar com la part superior dreta dels objectes està molt il.luminada per la llum direccional i en canvi la zona inferior esquerra està en ombre, solament lleugerament il.luminat per la intensitat ambient.

Analitzant el codi del node DirectionalLight, veiem el field ambientIntensity amb un valor intermig. Si posem un valor baix, les ombres queden molt més dures o contrastades. En canvi, si posem un valor alt, les obres queden poc notòries i per tant molt suaus.

El field següent és field color on definim el color que tindrà la llum. Cal deixar clar que no és la intensitat, si no el color. El color que hem posat és totalment blanc, com la llum del sol al migdia. Si volguessim simular una posta de sol, posariem una llum taronjosa (per exemple: RGB = [0.8 0.4 0]).

Després del color, ve el field intensity on es defineix la potència amb que el llum il.lumina. Hem posat el màxim per tal que es veies clarament la influència de la llum sobre els objectes.

Finalment, el field direction és el que determina la direcció dels raigs de llum. El que cal definir és un vector director. En aquest cas hem posat [-0.5 -0.5 0] que vol dir que si partim de l'orígen de coordenades el raig surt cap avall i cap a l'esquerra amb la mateixa proporció, però no surt ni en davant ni en darrere.

NOTA: Existeix una llum que està encesa per defecte i que pot destorbar en fer proves d'il.luminació. És un llum associat al punt de vista enomenat "HeadLight" i que ve a ser una mena de llum de casc de miner. Aquest llum pot ser apagat des del menú del browser, però també es pot apagar des del codi de VRML amb una comanda especial. Nosaltres hem apagat aquest llum mitjançant la comanda en el codi de l'exemple, tot i que no ho hem inclos a dalt. Per tant no veureu l'efecte destorbador d'aquest llum. La comanda per fer això és: NavigationInfo { headlight FALSE }. Si voleu saber com es veuria amb aquest llum ences, el podeu encendre des del menú del browser.

NOTA: En el moment d'escriure el tutorial (01/97), el Cosmo Player no aplica el la intensitat ambient en cap model de llum.

A continuació farem un exemple jugant amb els colors del llum.

Exemple2: Definició de tres llums paral.leles amb tres colors diferents sobre una esfera blanca.


DirectionalLight { # Llum vermella
	ambientIntensity 0.5
	color 1 0 0
	intensity 1
	direction 0.5 -0.5 -0.1
}

DirectionalLight { # Llum verda
	ambientIntensity 0.5
	color 0 1 0
	intensity 1
	direction -0.5 -0.5 -0.1
}

DirectionalLight { # Llum blava
	ambientIntensity 0.5
	color 0 0 1
	intensity 1
	direction 0 0.5 -0.1
}

Shape { 
	appearance Appearance {
		material Material {
			ambientIntensity 1
			diffuseColor 1 1 1
		}
	}
	geometry Sphere { radius 2 }
}

Amb aquest exemple es pot veure la interacció entre llums. Els tres llums que hem definit són dels tres colors bàsics de llum: Vermell a dalt a l'esquerra, Verd a dalt a la dreta i Blau a baix al centre. D'aquesta manera podem veure l'esfera s'il.lumina uniformement tenint les zones on incideix tan sols un dels llums, del color d'aquell llum, i en les zones on incideix més d'un llum s'hi pot veure la combinació (per exemple vermell i verd fan groc, etc.).

node PointLight

Els llums puntuals tenen la propietat d'irradiar raigs de llum en totes direccions a partir d'un punt donat a l'espai. Per això aquests no defineixen una direcció d'il.luminació. El que si que tenen és el que es coneix com atenuació. El que significa és que el llum té una certa força que va minvant en anar-nos allunyant d'ell.

L'atenuació és una propietat física que es manifesta degut a la pèrdua d'energia dels fotons en allunyar-se de la font de llum. Aquesta pèrdua, es pot modelar amb una fòrmula que té en compte la distància de la font a un punt determinat, i també el quadrat d'aquesta distància. Aquí no entrarem a veure com funciona la fòrmula, i només direm que en el node PointLight el field attenuation disposa de tres paràmetres, els quals, es poden variar per a obtenir diferents efectes.

Una altra propietat d'aquests llums és el radi d'acció. Es pot definir una distància a partir de la qual, independentment de l'atenuació, el llum ja no il.lumina gens.

A continuació donem dos petits exemples amb dos tipus d'atenuació diferents, amb un mateix radi d'acció:

Exemple3: Definició d'un llum puntual blau, sense atenuació sobre una superfície blanca.


PointLight { # Llum blava sense atenuació
	location 8 -3 -10
	radius 15
	ambientIntensity 0.5
	color 0 0 1
	intensity 1
	attenuation 1 0 0 # Aquesta combinació no presenta atenuació
}

Transform {
	translation 0 -5 -10
	children Shape { 
		appearance Appearance {
			material Material {
				ambientIntensity 1
				diffuseColor 1 1 1
			}
		}
		geometry Box { size 20 1 10 }
	}
}


Exemple4: Definició d'un llum puntual blau, amb atenuació sobre una superfície blanca.


PointLight { # Llum blava sense atenuació
	location 8 -3 -10
	radius 15
	ambientIntensity 0.5
	color 0 0 1
	intensity 1
	attenuation 1 0.5 0 # Presenta una certa atenuació
}

Transform {
	translation 0 -5 -10
	children Shape { 
		appearance Appearance {
			material Material {
				ambientIntensity 1
				diffuseColor 1 1 1
			}
		}
		geometry Box { size 20 1 10 }
	}
}

NOTA: En el moment d'escriure el tutorial (01/97), el Cosmo Player no aplica el radi d'actuació i l'atenuació funciona segons un algorisme diferent al de l'especificació tècnica de VRML.

node SpotLight

Aquest tipus de llum és el més complex. La propietat principal és el fet que els raigs de llum surten d'un punt determinat, en una direcció determinada. És com un llum de treatre el qual a més de la direcció en que il.lumina, també es pot definir l'angle d'obertura del feix de llum. Vejam un exemple i estudiem les seves parts:

Exemple5: Definició d'un espot de llum vermell, sense atenuació sobre una superfície blanca.


SpotLight { # Spot vermell
	location 0 0 -10
	radius 3
	ambientIntensity 0.5
	color 1 0 0
	intensity 1
	attenuation 1 0 0 # Aquesta combinació no presenta atenuació
	direction 0 -1 0 # apunta directament cap avall
	cutOffAngle 1.0472 # 60 graus en radians
	beamWidth 0.785398 # 45 graus en radians
}

Transform {
	translation -10 -4 -15
	children Shape { 
		appearance Appearance {
			material Material {
				ambientIntensity 1
				diffuseColor 1 1 1
			}
		}
		geometry ElevationGrid {
			colorPerVertex FALSE
			xDimension 20
			zDimension 10
			xSpacing 1
			zSpacing 1
			height [
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
				0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
			]
		}
	}
}

NOTA: En aquest exemple, en lloc d'una Box fem servir una ElevationGrid com a geometria per que es vegi més clar l'efecte de punt de llum. Aquest node no l'hem vist al tutorial, però no té cap complicació, l'únic que cal entendre és que és una malla de 20x10 on cada quadrat de la malla té una mida de 1x1 unitats i que en realitat no són quadrats si no parelles de triangles. L'utilitzem per que l'ombrejat dels triangles fa que sigui mé:s aparent la diferent intensitat que arriva a cada un d'ells.

En l'exemple, tot és anàleg al node PointLight fins a l'atenuació. El que varia són els fields direction, cutOffAngle i beamWidth. El field direction permet donar el vector director del feix de llum, és a dir, la direcció en que dirigim el llum.

El field cutOffAngle ens determina l'angle d'obertura total del feix de llum (com sempre, donat en radians). Cal tenir en compte, que aquest angle fa referència a la meitat de l'obertura i que per tant si volem una obertura total de 60 graus, cal especificar un field cutOffAngle de 30 graus.

El field beamWidth defineix un angle intern al field cutOffAngle on la intensitat del feix de llum és màxima i uniforme. Entre l'angle especificat per field beamWidth i l'especificat per field cutOffAngle la intensitat del feix de llum va minvant de dins cap a fora creant una zona difuminada.

Exercicis proposats:

Diversos llums
Definiu diversos tipus de llums il.luminant objectes blancs com a pràctica i experimentació.




< Anterior | Menú ^ | Següent >