Existen tres tipos de iluminación en VRML: luz direccional (node DirectionalLight), luz puntual (node PointLight) y espot de luz (node SpotLight). Cada uno de los tres tipos de luz corresponde a uno de los tres modelos clásicos de luz en gráficos per ordenador.
El tratamiento de la luz ambiental es diferente en VRML respecto a otros sistemas gráficos. Es decir, tradicionalmente aquella parte de la luz que ilumina los objetos de forma indirecta, por rebotes de luz provinientes de las múltiples reflexiones y radiaciones sobre otros objetos adyacentes, es modelada mediante un único concepto llamado luz ambiental o luz ambiente. Esta luz ambiente se acostumbra a modelar mediante un valor único que representa un incremento de intensidad que se aplicará al color de los objetos, de forma uniforme. Esto es una simplificación de lo que, de otra forma, resultaría muy costoso en tiempo de cálculo.
En VRML no se dispone de un control único para simular la iluminación ambiente. En VRML disponemos de un control de emisión de luz ambiente por cada tipo de luz y un control de reflexión de luz ambiente por cada material. Es decir, que cada tipo de luz define su incremento de intensidad (que en caso de haber múltiples luces definidas, se van acumulando sus ilumiaciones ambiente sobre la intensidad de cada objeto), y por otra parte, cada material define en qué proporción se verá afectado por esa iluminación ambiente de cada luz.
En el node Material se encuentra el field ambientIntesity el cual determina en qué proporción el material refleja la intensidad ambiente de las luces definidas en el entorno. El valor de este field debe estar dentro del rango [0, 1] y su valor por defecto es 0'2.
Con este tipo de luz podemos iluminar los objetos con rayos paralelos entre sí, como si fueran los rayos del sol al llegar a la tierra. En otras palabras, no tenemos un punto de luz del que salen radialmente los rayos, sino que todos los rayos son paralelos entre sí y por tanto inciden con el mismo ángulo sobre una superfície. Veamos un ejuemplo:
|
Ejemplo1: Definición
de una iluminación paralela que proviene de arriba a la derecha en
dirección hacia abajo a la izquierda.
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 este entorno se ve claramente como la parte superior derecha de los objetos está muy iluminada por la luz direccional y en cambio la zona inferior izquierda está en sombra, solamente ligeramente iluminada por la intensidad ambiente. En este ejemplo hemos definido que la reflexión de la intensidad ambiente de los materiales sea el máximo para así poder apreciar bien la intensidad ambiente generada por la luz direccional.
Analizando el código del node DirectionalLight vemos el field ambientIntensity con un valor intermedio. Si ponemos un valor bajo, las sombras se intensifican resultando más duras o contrastadas. En cambio, si ponemos un valor elevado, las sombras quedan poco notorias y en consecuencia suaves.
El field siguiente es el field color donde definimos el color que tendrá la luz. Cabe resaltar que no es la intensidad, sino sólo el color. El color que hemos definido es totalmente blanco, como la luz del sol al mediodía. Si quisiéramos simular una puesta de sol, definiríamos una luz anaranjada (por ejemplo: RGB = [0.8 0.4 0]).
Después del color viene el field intensity donde se define la potencia con que la luz ilumina. Hemos definido el valor máximo para que se viera claramente la influencia de la luz sobre los objetos.
Finalmente, el field direction es el que determina la dirección de los rayos de luz. Lo que se debe definir es un vector director. En este caso hemos definido el [-0.5 -0.5 0] que significa que si partimos del origen de coordenadas, el rayo sale hacia abajo e izquierda con la misma proporción, pero no sale ni hacia delante ni atrás.
NOTA: Existe una luz que está encendida por defecto y que puede estorbar al hacer pruebas de iluminación. Es una luz asociada al punto de vista llamada "Headlight" y que viene a ser como una luz de casco de minero. Esta luz puede ser apagada desde el menú del browser (o en el CosmoPlayer con el asterisco "*"), pero también puede ser totalmente eliminada desde VRML con un comando especial. Nosotros hemos apagado esta luz mediante el comando en el código del ejemplo, aunque no lo hemos incluido arriba. Por lo tanto no veréis el efecto de esta luz. El comando para conseguir apagarla es: NavigationInfo { headlight FALSE }. Si quisierais saber como se vería el entorno con esta luz encendida, lo podéis hacer desde el menú del browser.
A continuación veremos un ejemplo jugando con los colores de luz.
|
Ejemplo2: Definición
de tres luces direccionales con tres colores diferentes sobre una esfera
blanca.
DirectionalLight { # Luz Roja
ambientIntensity 0.5
color 1 0 0
intensity 1
direction 0.5 -0.5 -0.1
}
DirectionalLight { # Luz Verde
ambientIntensity 0.5
color 0 1 0
intensity 1
direction -0.5 -0.5 -0.1
}
DirectionalLight { # Luz Azul
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 }
}
|
Con este ejemplo se puede ver la interacción entre luces distintas.
Las tres luces que hemos definido son de tres colores básicos de la luz:
Rojo arriba a kla izquierda, Verde arriba a la derecha y Azul abajo al centro.
De este modo podemos ver la esfera iluminada uniformemente obteniendo zonas
donde sólo incide una sola luz (y sólo se ve el color de esa luz),
y otras zonas donde inciden más de una luz resultando el color de la
mezcla de luces (por ejemplo rojo y verde forman amarillo).
las luces puntuales tienen la propiedad de irradiar rayos de luz en todas direcciones a partir de un punto dado en el espacio. Por esta razón no definen una dirección de iluminación. Lo que si definen es lo que se conoce como atenuación. Lo que significa es que la luz tiene una cierta fuerza que va menguando conforme nos alejamos de la fuente luminosa.
La atenuación es una propiedad física que se manifiesta debido a la pérdida de energía de los fotones al alejarse de la fuente de luz. Esta pérdida se puede modelar mediante una fórmula matemática que tiene en cuenta la distancia de la fuente de luz a un punto determinado, así como el cuadrado de esta distancia. Aquí no entraremos a ver el funcionamiento de la fórmula y solo diremos que en el node PointLight el field attenuation dispone de tres parámetros, los cuales se pueden variar para obtener diversos efectos de atenuación.
Otra propiedad de estas luces es el radio de acción. Se puede definir una distancia a partir de la cual, independientemente de la atenuación, la luz ya no actúa. Esto sirve para hacer más eficiente el render a tiempo real.
Acontinucaión damos dos pequeños ejemplos con dos tipos de atenuación distintos y un mismo radio de acción.
|
Ejemplo3: Definición
de una luz puntual azul, sin atenuación sobre una superfície
blanca.
PointLight { # Luz azul sin atenuación
location 8 -3 -10
radius 15
ambientIntensity 0.5
color 0 0 1
intensity 1
attenuation 1 0 0 # Esta combinación no presenta atenuación
}
Transform {
translation 0 -5 -10
children Shape {
appearance Appearance {
material Material {
ambientIntensity 1
diffuseColor 1 1 1
}
}
geometry Box { size 20 1 10 }
}
}
|
|
Ejemplo4: Definición
de una luz puntual azul, con atenuación sobre una superfície
blanca.
PointLight { # Luz azul con atenuación
location 8 -3 -10
radius 15
ambientIntensity 0.5
color 0 0 1
intensity 1
attenuation 1 0.5 0 # Presenta una cierta atenuación
}
Transform {
translation 0 -5 -10
children Shape {
appearance Appearance {
material Material {
ambientIntensity 1
diffuseColor 1 1 1
}
}
geometry Box { size 20 1 10 }
}
}
|
Este tipo de luz es el más complejo. La propiedad principal es el hecho
que los rayos de luz salen de un punto determinado, en una dirección
determinada. Es como una luz de teatro a la cual además de la dirección
en que ilumina, también se define el ángulo de apertura del haz
de luz. Veamos un ejemplo y estudiemos sus partes:
|
Ejemplo5: Definición
de un espot de luz roja, sin atenuación sobre una superfície
blanca.
SpotLight { # Spot rojo
|
NOTA: En este ejemplo, en vez de un Box utilizamos una ElevationGrid como geometría para que sea más claro el efecto de punto de luz. Este nodo no lo hemos visto en el tutorial, pero no presenta ninguna complicación. Lo único que debe entenderse es que es una malla se 20x10 donde cada cuadrado de la malla tiene un teamaño de 1x1 unidades y que en realidad no son cuadrados, sino parejas de triángulos. Lo utilizamos para que el sombreado de los triángulos haga más visible la diferente intensidad que llega a cada uno de ellos.
En el ejemplo, todo es análogo al node PointLight hasta la atenuación. Lo que varía son los fields direction, cutOffAngle y beamWidth. El field direction permite dar el vector director dhaz de luz, es decir, la dirección en la que dirigimos la luz.
El field cutOffAngle nos determina el ángulo de apertura total del haz de luz (como siempre, definido en radianes). Se debe tener en cuenta que este ángulo hace referencia a la mitad de la apertura y que por lo tanto si queremos una apertura total de 60 grados, debemos especificar un field cutOffAngle de 30 grados.
El field beamWidth define un ángulo interno al field
cutOffAngle donde la intensidad del haz de luz es máxima y uniforme.
Entre el ángulo especificado por field beamWidth y el especificado
por field cutOffAngle la intensidad del haz de luz va menguando
de dentro a fuera creando una zona difuminada.
Ejercicios propuestos:
|