ILUMINACIÓN

Hasta ahora todo los objetos que hemos dibujado les hemos puesto cada cara de un color diferente sino la imagen no se ve con claridad, pero tampoco es del todo real ya que las caras siempre tienen la misma tonalidad, con la iluminación no necesitaremos pintar las caras de los objetos de diferentes colores, y le dará mas realismo.

Para poder aplicar iluminación necesitamos asociar a cada vértice de nuestro objeto un vector normal asociado. Cuando tenemos la normal calculada tenemos que normalizarla, o sea, dividir ese vector por su propio modulo para que sea unitario, pero también podemos hacer que se encargue la OpengGl activando la normalización,
glEnable GL_NORMALIZE
o desactivarla con,
glDisable GL_NORMALIZE
el usar GL_NORMALIZE dependerá de nuestra aplicación ya que forzando a que sea OpenGl que las utilice se ralentiza ya que le estamos hacer mas cálculos de los que debe.

Para definir las normales en opengl utilizaremos la función glNormal3f(X,Y,Z) por ejemplo para definir una cara con 4 vértices la definiremos de la siguiente manera

GlBegin GL_QUADS
glNormal3f nX,nY,nZ
glvertex3f x,y,z
glvertex3f x,y,z
glvertex3f x,y,z
glvertex3f x,y,z
glEnd

Es decir, cada vez que queremos definir una normal a un vértice usamos glNormal y el vértice/s que siguen se asocian a esta normal.

TIPOS DE ILUMINACIÓN

FLAT ( plana )
SMOOTH / GOURAUD (suave)
PHONG

La luz de tipo FLAT el polígono que definamos será todo del mismo color por lo que es la menos realista, pero la mas eficiente ya que es la que menos cálculos requiere.

La luz de tipo SMOOTH el polígono que definamos tendrá un color definido para cada vértice, asociando las normales a los vértices OpenGL puede hacer los cálculos de los colores a cada uno del vértice y después hace una interpolación de colores con este tipo de luz se acerca bastante al realismo pero aun la podemos mejorar.

La luz de tipo PHONG utiliza lo que se llama interpolación bilineal para calcular la normal de cada punto del polígono, con este tipo de luz tenemos que tener una asociación a cada vértice diferente. PHONG se complica porque previamente nosotros tendremos que interpolar las normales para a si tener las normales de cada vértice diferente.

ESPECIFICACIÓN DE MATERIALES

Porque tenemos que especificar un material ? La respuesta es sencilla, porque no es lo mismo ver reflejado la iluminación a una caja de cartón que a un metal, la intensidad de color no es la misma.

Para un material tenemos cinco características, que son:
Reflexión difusa
Reflexión especular
Reflexión ambiental
Coeficiente de brillo
Coeficiente de emisión

La reflexión difusa : color de base que reflejaría el objeto si incidiera sobre el una luz pura blanca.
Reflexión especular: son los puntos brillantes de los objetos iluminados
Reflexión ambiental: Define como un objeto determinado refleja la luz que viene del ambiente de la escena.
Coeficiente de brillo: Define la cantidad de puntos luminosos y su concentración, dependiendo de este valor nos acercamos mas o menos al metal.
Coeficiente de emisión: es el color de la luz que emite el objeto.

Para definir los materiales usaremos la función glMaterialfv(cara,caracteristica,parametro)

Los parámetros pueden llevar los siguientes valores.

Cara:
GL_FRONT
GL_BACK
GL_FRONT_AND_BACK

Caracterostoca:

            GL_DIFFUSE
GL_AMBIENT
GL_AMBIENT_AND_DIFFUSE
GL_EMISSION
GL_SPECULAR
GL_SHININESS

Parámetro:

Aquí ponemos los valores que queremos para el tipo definido. Tendremos que definir ls valores para RGB, menos para GL_SHININESS que tendrá un valor entre 0 y 128.

LUZ

Como máximo en OpenGL podemos tener 8 luces al mismo tiempo en nuestra escena. Cada una de estas luces tiene un identificador, que estos son:
GL_LIGHT0
GL_LIGHT1
GL_LIGHT2
GL_LIGHT3
GL_LIGHT4
GL_LIGHT5
GL_LIGHT6
GL_LIGHT7

Para activar o desactivar alguna de las luces utilizamos la típica función glEnable o glDisable, por ejemplo si queremos activar la luz 0 es tan simple como:

glEnable GL_LIGHT0

para activar o desactivar los cálculos de iluminación tenemos que utilizar la constante GL_LIGHTING. Al igual que antes para activar o desactivar los cálculos de iluminación lo hacemos de la misma forma:

glEnable GL_LIGHTING

Que nos queda, bueno… Falta saber colocar el foco de iluminación de que color ilumina y hacia donde ilumina. Para ello utilizamos la función glLightfv(Light,name,paramaetro) , el valor para Light es siempre la luz a a la que nos estamos refiriendo, ya sea GL_LIGHT0 o otra, en name, ponemos la característica de la luz, por ejemplo luz ambiente (GL_AMBIENT) , etc… y en parámetros pues los valores para RGB.

Como colocaremos la luces ? como he comentado antes pues con la función glLightfv(Light, name, parámetro) para definir que queremos colocar una luz en una posición en concreto en el parámetro name pondremos la constantes GL_POSITION, y así OpenGL sabrá que tiene que posicionar la luz que definimos en el parámetro Light, y a la posición que le indicamos en parámetro, en el que le indicaremos la posición X,Y,Z,W. como nos imaginamos X,Y;Z es la posición de la luz pero para que sirve la W, pues para definir si la luz se encuentra muy muy lejos para ello tiene que tener el valor de 0, en este caso su dirección se deduce del vector que pasa por el origen y por el punto X;Y,Z o si su valor es 1 se considera su posición con toda normalidad. 
Por defecto la luz se encuentra en la posición 0,0,1,0 iluminando en la dirección negativa de la Z.

Atenuación con la distancia.

Es para definir como se va perdiendo la luz en la distancia ya que no será lo mismo si un objeto esta muy cerca de la luz o si esta lejos.
Tenemos 3 constantes para definir esto.
GL_CONSTANT_ATTENUATION, por defecto tiene el valor de 1
GL_LINEAR_ATTENUATION, por defecto tiene el valor de 0
GL_QUADRATIC_ATTENUATION, por defecto tiene el valor de 0

Tenemos que la función que atenúa la iluminación con la distancia es:

1/(valor_de_ GL_CONSTANT_ATTENUATION + valor_de_ GL_LINEAR_ATTENUATION * distancia + valor_de_ GL_QUADRATIC_ATTENUATION * distancia^2 )

Con esta función se reduce la intensidad de color a medida que la luz se va distanciando.

Para pasar estos valores a OpenGL volvemos a utilizar la función por ejemplo

glLightfv( GL_LIGHT0 , GL_CONSTANT_ATTENUATION, 0.6 )

Area de cobertura.

También tenemos que definir el área que cubre la luz, para ello tenemos las siguientes constantes

            GL_SPOT_CUTOFF, define la luz como un cono de luz, especificando el angulo de obertura del cono con el valor entre 0 y 90 grados.

            GL_SPOT_DIRECTION esta constante sirve para restringir la dirección de la luz emitida.

            GL_SPOT_EXPONENT esta constante es la que regula la perdida de intensidad de la luz a medida que nos vamos alejando del centro del cono los valores que podemos configurar son entre 0 y 128

DESCARGATE AQUI EL EJEMPLO

Director Web Directorio AdirLink directorio web Agregar Web
Directorio Gratis Pala.net directorio de enlaces Pala.net directorio de enlaces