Nothing Special   »   [go: up one dir, main page]

Iluminación en Java 3D

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 34

Iluminacin en Java 3D

Este mdulo presenta las tcnicas para proporcionar detalles de los objetos visuales a travs de
sombras y texturas. Esta pgina explica el modelo de iluminacin y cmo utilizar luces en Java
3D para conseguir sombras.
Java 3D sombrea los objetos visuales basndose en la combinacin de sus caractersticas
materiales y en las luces del universo virtual. El sombreado resulta de aplicar un modelo de
iluminacin a un objeto visual en presencia de fuentes de luz. La siguiente seccin da una
descripcin del modelo de iluminacin usado en el renderizador de Java 3D y cmo la luz
interacta con las caractersticas materiales para proporcionar sombreado. Cada una de las
siguientes secciones explica las caractersticas relevantes del API Java 3D para el modelo de
iluminacin.

Sombreado en Java 3D
Sombrear objetos visuales en Java 3D depende de muchos factores. Esta seccin proporciona
una descripcin abreviada del modelo de iluminacin de Java 3D, del modelo de color, y del
modelo de sombreado. La especificacin del API Java 3D presenta una informacin ms detallada
sobre el modelo de iluminacin de Java 3D. Como la mayor parte de la iluminacin de Java 3D y
del modelo de sombreado se basa en OpenGL, se puede encontrar ms informacin en pginas
sobre OpenGL.
Modelo de Iluminacin
En el mundo real, los colores que percibimos son una combinacin de las caractersticas fsicas
del objeto, de las caractersticas de las fuentes de luz, de las posiciones relativas de los objetos a
las fuentes de luz, y del ngulo desde el cual se ve el objeto. Java 3D utiliza un modelo de
iluminacin para aproximar la fsica del mundo real. El resto de esta seccin explica el modelo de
iluminacin de Java 3D en trminos generales. La seccin E.2 de la especificacin del API Java 3D
presenta las ecuaciones matemticas para el modelo de iluminacin Java 3D.
La ecuacin del modelo de iluminacin depende de tres vectores: la superficie normal (n), la
direccin de la luz (l), y la direccin al ojo del espectador (e) adems de las caractersticas
materiales del objeto y de las caractersticas de la luz. La Figura 6-1 muestra los tres vectores
para dos vrtices de una superficie esfrica. Los vectores para cada vrtice pueden tener
distintas direcciones dependiendo de especficidades de la escena. Cuando los vectores de la luz
y del ojo varan, se clculan en tiempo de ejecucin. Por lo tanto, cada vrtice de la esfera
potencialmente se renderiza como una sombra diferente.

El modelo de iluminacin incorpora tres tipos de reflexiones de luz del mundo real: ambiente,
difuso, y especular. La reflexin ambiente resulta de la luz ambiente, luz constante de bajo nivel,
en una escena. La reflexin difusa es la reflexin normal de una fuente de luz desde un objeto
visual. Las reflexiones especulares son las reflexiones sobreiluminadas de una fuente de luz
sobre un objeto, que ocurren en ciertas situaciones.

La Figura 6-2 muestra una esfera y un plano renderizados por Java 3D. Los tres tipos de reflexin
se pueden ver en la esfera de la Figura 6-2. La parte ms oscura de la esfera exhibe slo la
reflexin ambiente. El centro de la esfera est iluminado por la luz difusa y ambiente. Con una
esfera azul y una luz blanca, la reflexin difusa es azul. La parte ms brillante de la esfera es el
resultado de la reflexin especular con reflexiones ambiente y difusa.

Ojo Local contra Vectores de Ojos Infinitos


Si cada vrtice de cada objeto visual en una escena requiere un vector de luz, un vector del ojo,
y el clculo de la sombra, una porcin significativa del clculo de representacin se utiliza en los
vrtices sombreados. La cantidad de clculo puede reducirse si el vector de luz, o el vector del
ojo, o ambos vectores son constantes. El vector de luz es constante cuando usa una luz
direccional.. El vector del ojo es constante por defecto, aunque podemos especificar un vector
variable del ojo usando un mtodo del objeto View.
Efectos inter-objetos no Considerados
Mientras que el modelo de iluminacin se basa en la fsica, los fenmenos fsicos complejos no se
modelan. Obviamente, la sombra echada por la esfera sobre el plano no est en la Figura 6-2. No
tan obvio, tambin falta la luz reflejada de la esfera sobre el plano. Tambin falta la luz reflejada
desde el plano sobre la esfera que de nuevo se refleja en el plano... etctera.
A menudo es difcil comprender la complejidad del clculo de la accin de la luz. Consideremos la
dificultad de calcular cmo cada gota del agua se comporta en una ducha. Las gotas vienen de la
cabeza de la ducha en distintas direcciones. Cuando encuentran un objeto, la colisin que resulta
produce muchas gotas ms pequeas que viajan en distintas direcciones. El proceso se repite
muchas veces antes de que el agua se vaya por el desague. La complejidad de interacciones de
la luz con los objetos visuales es muy semejante. Algunas de las diferencias entre los
comportamientos del agua y la luz son que la luz no tiene ninguna adherencia (luz no se pega a
los objetos visuales) y el efecto de la gravedad es insignificante para la luz.
Para reducir la complejidad del clculo, el modelo de iluminacin considera solamente un objeto
visual al mismo tiempo. Consecuentemente, las sombras y las reflexiones inter-objetos no son
renderizadas por el modelo de iluminacin. Estos dos efectos requieren la consideracin de todos
los objetos junto con sus posiciones relativas en el momento de la representacin. Se necesita
considerablemente ms clculo para renderizar una sola escena con efectos inter-objetos. Java
3D, y el resto de los sistemas grficos en tiempo real, no hacen caso de efectos inter-objetos en
la representacin. Algunos de los efectos ignorados del mundo real se pueden agregar a las
escenas cuando sea necesario.
Modelo de Color
El modelo del color no est basado en la fsica. Java 3D modela el color de las luces y los
materiales como una combinacin de rojo, verde, y azul. El color blanco, como el color de la luz o

del material, es la combinacin de los tres componentes con la intensidad mxima. Cada luz
produce un solo color de luz especificado por un tuple RGB. El modelo de iluminacin se aplica a
cada uno de los componentes del color RGB. Por ejemplo, una bola roja en presencia de una luz
azul no ser visible puesto que la luz azul no se refleja desde un objeto rojo. En realidad, el color
es una combinacin de muchas longitudes de onda de la luz, no solo tres. El modelo de color
RGB representa muchos colores, pero no todos.
Influencia de las Luces
En Java 3D, la porcin de una escena donde los objetos visuales son iluminados por una fuente
de luz determinada se llama la regin de influencia de ese objeto de luz. La regin de influencia
ms simple para una fuente de luz usa un objeto Bounds y el mtodo
setInfluencingBounds() de Light. Cuando un objeto fuente de luz con lmites de influencia
intersecciona con los lmites de un objeto visual, se utiliza la luz para sombrear todo el objeto.
Los lmites de influencian de una luz determinan qu objetos iluminar, no qu porciones de
objetos se iluminan.
Modelo de Sombreado
El modelo de iluminacin sombrea todos los vrtice de un objeto visual por cada luz de
influencia. La sombra de un vrtice es la suma de las sombras proporcionadas por cada fuente
de luz para la vrtice. El resto de un objeto visual se sombrea basndose en la sombra de los
vrtices. El modelo de sombra de un objeto visual, especificado como atributo Appearance
NodeComponent, determina cmo se hace el sombreado para el resto del objeto visual.
El ColoringAttributes NodeComponent especifica el modelo de sombra para los objetos
visuales donde el modelo de sombra se especifica como uno de SHADE_GOURAUD,
SHADE_FLAT, FASTEST, NICEST. Debemos tener cuidado ya que el color de un objeto
ColoringAttributes nunca se utiliza en el sombreado.
En el sombrado Gouraud, cada pixel se sombrea con un valor derivado de la interpolacin
trilinear del valor de la sombra de cada vrtice del polgono que lo encierra. En el sombreado
plano, todos los pixeles de un polgono se asignan el valor de la sombra a partir de un vrtice del
polgono. La Figura 6-3 muestra una esfera sombreada plana y una esfera sombrada Gouraud.
La ventaja del sombreado plano es la velocidad en la representacin del software. El sombreado
de Gouraud tiene la ventaja de la apariencia visual.

Un ltimo punto antes de ir a un ejemplo; los objetos fuentes de luz no son objetos visuales.
Incluso si una fuente de luz se situa dentro de la vista, no ser renderizada.

Receta para Iluminar Objetos Visuales

Se necesita una serie de pasos para permitir la iluminacin de los objetos visuales en el universo
virtual. Adems de crear y de personalizar objetos para requisitos particulares de luz, cada
objeto de luz debe ser agregado al escenario grfico y haber especificado un objeto Bound.
Cada objeto visual que se va a sombrear debe tener superficies normales y caractersticas de
material. Abajo podemos ver la receta con los pasos necesarios:
1.

2.

Especificacin de la fuente de Luz


1.

seleccionar los lmites

2.

aadirla al escenario grfico

Objeto Visual
1.

superficies

2.

propiedades de material

Si falta algunos de estos elementos no se podr usar la iluminacin. La presencia del objeto
Material en un manojo Appearance de un objeto visual permite el modelo de iluminacin para
ese objeto. Sin el objeto Material el objeto visual ser coloreado, pero no sombreado por el
ColoringAttribute o los colores de vrtice del objeto Geometry. Si ni uno ni otro estn
presentes, el objeto ser blanco slido. La Figura 6-5 muestra la excepcin lanzada cuando un
objeto visual tiene un objeto Material pero no tiene superficies normales.

javax.media.j3D.IllegalRenderingStateException:
without
specifying normals in geometry object

Cannot

do

lighting

Los errores con fuentes de luz pueden no ser fciles de encontrar. No hay ningn aviso de que
dejamos sin luz un escenario grfico. Ni hay ninguna alerta por no fijar los lmites de influencia
de una fuente de luz. En cualquiera de estos casos, el objeto de luz no tendr ninguna influencia
sobre los objetos visuales en el escenario grfico. Un objeto visual especificado correctamente
para sombreado (es decir, uno con un objeto Material) en un escenario grfico vivo pero fuera
de los lmites de influencia de todos los objetos fuente de luz se renderizar a negro.
Es posible especificar correctamente una escena en la cual un objeto visual con las
caractersticas materiales influenciadas por un objeto de luz y que se renderice a negro. La
orientacin relativa de la luz, el objeto visual, y la direccin de la visin entran en juego en el
renderizado.

Ejemplos de Luces Sencillas

Segn lo mencionado arriba, crear renderizados con sombras implica la especificacin apropiada
de la fuente de luz y de los objetos visuales. Hasta el momento, ni la clase Light ni los objetos
Material se han discutido en detalle. Sin embargo, aprovechndo los valores por defecto del API
y sus caractersticas, podemos proceder a iluminar mundos virtuales. Los primitivos geomtricos
generan superficies normales cuando se solicitan. Los valores por defecto del objeto Material
especifican un objeto visual razonable. Los valores por defecto de los constructores de la fuente
de luz especifican fuentes de luz utilizables.
Usando la clase SimpleUniverse con los dos mtodos del Fragmento de cdigo 6-1 se produce
un universo virtual que incluye una sola esfera con las caractersticas materiales con sus valores

por defecto iluminada por un solo objeto fuente de luz AmbientLight. El primer mtodo del
fragmento del cdigo ensambla un objeto Material con un objeto Apeareance para la esfera. El
segundo mtodo crea un objeto BranchGroup para servir como la raz de la rama de contenido
grfico, despus agrega los objetos Sphere y AmbientLight al escenario grfico. El objeto
Material en el manojo del aspecto se agrega al objeto Sphere en la construccin de la esfera
(lneas 12 y 13). Un valor por defecto BoundingSphere proporciona la regin de influencia para
el objeto AmbientLight (lneas 15 a 17). El diagrama del escenario grfico de este mundo
virtual aparece en La Figura 6-6.
Fragmento de Cdigo 6-1, Crear un Escena con un Esfera Iluminada.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.

Appearance createAppearance() {
Appearance appear = new Appearance();
Material material = new Material();
appear.setMaterial(material);
return appear;
}
BranchGroup createScene (){
BranchGroup scene = new BranchGroup();
scene.addChild(new Sphere(0.5f, Sphere.GENERATE_NORMALS,
createAppearance()));
AmbientLight lightA = new AmbientLight();
lightA.setInfluencingBounds(new BoundingSphere());
scene.addChild(lightA);
return scene;
}

Las lneas 4 y 5 del Fragmento de cdigo 6-1 podran ser reemplazadas por la siguiente lnea
que crea y usa un objeto Material annimo.

Appear.setMaterial(new Material());
Los objetos Material son completamente personalizables con los parmetros de su constructor,
simplificando el uso de objetos Material annimos. Por el contrario, crear un objeto Light
annimo hace mucho ms dficil la adiccin de lmites de influencia. Debemos tener en cuenta
que el nombramiento del objeto Material puede hacer el objeto sea ms fcil de compartir entre
varios manojos del aspecto, dando como resultado un funcionamiento mejor.
El SimpleUniverse proporciona los objetos VirtualUniverse y Locale junto con el la rama de
vista grfica para el diagrama de escenario grfico mostrado en la Figura 6-6. Sin una
transformacin, el objeto Sphere y el objeto BoundingSphere estarn centrados en el origen, y
se interseccionarn. El objeto Sphere se sombrea por la fuente AmbientLight. La Figura 6-7
muestra la imagen que resulta con un fondo blanco. La especificacin del fondo no se muestra
en el cdigo.

La esfera de la Figura 6-7 es de color gris uniforme, que es el valor por defecto de la propiedad
ambiente del material.

La Figura 6-7 muestra que las escenas iluminadas unicamente con luz ambiente son opacas.
Como la iluminacin ambiente es uniforme, produce la sombra uniforme. La luz ambiente est
pensada para llenar de luz una escena donde otras fuentes no iluminan. La adicin de una fuente
DirectionalLight har esta escena ms interesante.
Insertando el Fragmento de cdigo 6-2 en el Fragmento de cdigo 6-1 se aade un
DirectionalLight a la rama de contenido grfico de la escena. Una vez ms los valores por
defecto se utilizan para la fuente de luz, y se utiliza un BoundingSphere por defecto para la
regin de influencia. La Figura 6-8 muestra el diagrama del escenario grfico que resulta sin los
objetos proporcionados por el SimpleUniverse.
Fragmento de Cdigo 6-2, Aadir una Luz Direccional a la Escena.

1.
2.
3.
4.

DirectionalLight lightD1 = new DirectionalLight();


lightD1.setInfluencingBounds(new BoundingSphere());
// customize DirectionalLight object
scene.addChild(lightD1);

La Figura 6-9 muestra la imagen producida por la combinacin de los dos fragmentos del cdigo.
La influencia del objeto AmbientLight apenas se puede ver con la fuente DirectionalLight.
Obviamente, es necesaria la personalizacin de los requisitos particulares de los objetos de luz
y/o las caractersticas materiales del objeto visual para crear escenas interesantes.

Dnde Aadir un Objeto Light en un Escenario Grfico

La influencia de un objeto de luz en el mundo no est afectada por la posicin del objeto de luz
en el escenario grfico; sin embargo, el objeto bounds referenciado por la luz si lo est. El objeto
bounds est sujeto a las coordenadas locales del escenario grfico donde se inserta el objeto de
luz. Consideremos la Figura 6-10 como ejemplo. El mismo objeto BoundingSphere referenciado
por dos fuentes de luz proporciona dos regiones de influencia distintas debidas la traslacin
proporcionada por el objeto TransformGroup. El origen del sistema de coordenadas local del
escenario grfico debajo del TransformGroup est 2 metros por debajo del origen del mundo
(Locale) y la otra regin de la esfera de influencia.

Si dependen o no, los objetos de la fuente de luz del escenario grfico en la Figura 6-10
influencian el sombreado (luz) del objeto visual iluminado si los lmites del objeto visual
interseccionan con la regin de influencia de los objetos de luz. Especificar la regin de influencia
de una luz como un slo bounds podra no funcionar para todas las aplicaciones.

Clase Light

El API Java 3D proporciona cuatro clases para luces. Todas se derivan de la clase Light. La Figura
6-11 muestra la jerarqua de clases de Java 3D relacionada con las luces. Light, una clase
abstracta, proporciona los mtodos y las constantes de capacidades asociadas para manipular el
estado, color, y los lmites de un objeto Light. El estado de la luz es un boleano que activa y
desactiva la luz.

El siguiente bloque de referencia lista los mtodos y las constantes de la clase Light. Debemos
recordar que los lmites seleccionados con setInfluencingBounds() activan una luz cuando
el objeto bounds referenciado intersecciona con la vista.

Lista Parcial de Mtodos de la Clase Light


Light es una clase abstracta que contiene variables de ejemplar comunes a todas las luces.

void setColor(Color3f color)


Selecciona el color actual de la luz.

void setEnable(boolean state)


Activa y desactiva la luz.

void setInfluencingBounds(Bounds bounds)


Selecciona los lmites de influencia de la luz.

Sumario de Capacidades de la Clase Light

ALLOW_INFLUENCING_BOUNDS_READ | WRITE
ALLOW_STATE_READ | WRITE
ALLOW_COLOR_READ | WRITE.

Luz Ambiente

Los objetos de luz ambiente proporcionan luz de la misma intensidad en todas las localizaciones
y en todas las direcciones. Los objetos de luz ambiente modelan la luz reflejada desde otros
objetos visuales. Si miramos la superficie inferior de nuestro escritorio, veremos la parte inferior
del escritorio aunque ninguna fuente de luz est dando directamente en esa superficie (a menos
que tengamos una lmpara bajo el escritorio). La luz que brillaba hacia arriba en el fondo del
escritorio se reflej en el suelo y en otros objetos. En ambientes naturales con muchos objetos, la
luz se refleja desde muchos objetos para proporcionar la luz ambiente. La clase AmbientLight
de Java 3D simula este efecto.
El siguiente bloque de referencia enumera los constructores de la clase AmbientLight. La clase
abstracta Light proporciona los mtodos y las capacidades para esta clase (enumerada en el
bloque de referencia anterior).

Sumario de Constructores de la clase AmbientLight


Un objeto fuente de luz ambiente proporciona la misma intensidad de luz en todas las
localizacin y direcciones. Modela la compleja reflexin inter-objetos de la luz presente en
escenas naturales.

AmbientLight()
Construye e inicializa un objeto fuente de luz ambiente usando los siguientes valores por
defecto:

lightOn true

color (1, 1, 1)

AmbientLight(Color3f color)
Construye e inicializa una luz ambiente usando los parmetros especificados.

AmbientLight(boolean lightOn, Color3f color)


Construye e inicializa una luz ambiente usando los parmetros especificados.

Mientras que podra ser natural pensar que una fuente de luz ambiente se puede aplicar
globalmente, esto no es necesariamente cierto en un programa Java 3D. La influencia de la
fuente AmbientLight est controlada por sus lmites igual que otras fuentes de luz Java 3D. Se
pueden utilizar varios objeto fuente AmbientLight en un programa de Java 3D. No hay lmite en
el nmero de los objetos fuentes AmbientLight que se pueden utilizar.
Segn lo mencionado en secciones anteriores, la sombra de un vrtice es el resultado de las
fuentes de luz, de las caractersticas materiales del objeto visual, y de su geometra relativa
(distancia y orientacin). Para las reflexiones ambiente, la geometra no es un factor. La
propiedad ambiente del material slo se utiliza para calcular la reflexin ambiente. El modelo de
iluminacin calcula la reflexin ambiente de la luz como el producto la intensidad del
AmbientLight y la propiedad ambiente del material del objeto visual.

Luz Direccional

Una fuente DirectionalLight aproxima fuentes de luz muy distantes tales como el sol. Al
contratrio que las fuentes AmbientLight, las fuentes DirectionalLight proporcionan una sola
direccin al brillo de luz. Para los objetos iluminados con una fuente DirectionalLight, el vector
de luz es constante.
La Figura 6-12 muestra dos vrtices de la misma esfera que estn siendo iluminados por una
fuente DirectionalLight. El vector de luz es igual para estos dos y para todos los vrtices.
Compara La Figura 6-12 con la Figura 6-1 para ver la diferencia. Puesto que todos los vectores de
luz de una fuente DirectionalLight son paralelos, la luz no se atena. En otras palabras, la
intensidad de una fuente DirectionalLight no vara con la distancia al objeto visual y la fuente
DirectionalLight.

Los siguientes bloques de referencia listan los constructores y los mtodos de DirectionalLight,
respectivamente.

Sumario de Constructores de la Clase DirectionalLight


Los objetos DirectionalLight modelan fuentes de luz muy distantes teniendo una direccin del
vector de luz constante

DirectionalLight()
Construye e inicializa una fuente direccional usando los siguientes valores por defecto:

lightOn true

color (1, 1, 1)

direction (0, 0, -1)

DirectionalLight(Color3f color, Vector3f direction)


Construye e inicializa una luz direccional con el color y la direccin especificados. Por defecto el
estado es true (on).

DirectionalLight(boolean lightOn, Color3f color, Vector3f direction)

Construye e inicializa una luz direccional con el estado, el color y la direccin especificados.

Sumario de Mtodos de la Clase DirectionalLight

void setDirection(Vector3f direction)


Selecciona la direccin de la luz.

void setDirection(float x, float y, float z)


Selecciona la direccin de la luz.

Sumario de Capacidades de la Clase DirectionalLight


Adems de las Capacidades heredadas de la clase Light, los objetos DirectionalLight tienen la
siguiente capacidad:

ALLOW_DIRECTION_READ | WRITE
Los DirectionalLights slo participan en las porciones difusas y specular de la reflexin del
modelo de la iluminacin. Para las reflexiones difusas y specular, la geometra es un factor (al
contrario que las reflexiones ambiente). Variar la direccin de la fuente de luz cambiar el
sombreado de los objetos visuales. Solo las caractersticas materiales difusas y specular se
utilizan para calcular las reflexiones difusas y specular.

Punto de Luz

Un PointLight es el contrario de un DirectionalLight. Es una fuente de luz omnidireccional


cuya intensidad se atena con la distancia y tiene una localizacin. (un DirectionalLight no
tiene ninguna localizacin, solo una direccin). Los objetos PointLight se aproximan a bombillas,
velas, u otras fuentes de luz sin reflectores o lentes.
Un modelo de ecuacin cuadrtica modela la atenuacin de las fuentes PointLight. La ecuacin
se encuentra en la seccin E.2 de la especificacin del API Java 3D. La Figura 6-13 ilustra la
relacin de un objeto PointLight con una esfera. Observa que los vectores de luz no son
paralelos.

Los siguientes bloques de referencia listan los constructores y los mtodos de PointLight,
respectivamente.

Sumario de Constructores de la Clase PointLight


El objeto PointLight especifica una fuente de luz atenuada en el espacio que irradia la luz
igualmente en todas las direcciones desde la fuente de luz.

PointLight()
Construye e inicializa una fuente de punto de luz usando los siguientes valores por defecto:

lightOn true

color (1, 1, 1)

position (0, 0, 0)

attenuation (1, 0, 0)

PointLight(Color3f color, Point3f position, Point3f attenuation)


Construye e inicializa un punto de luz. Por defecto la luz est activa.

PointLight(boolean lightOn, Color3f color, Point3f position, Point3f


attenuation)
Construye e inicializa un punto de luz.

Sumario de Mtodos de la Clase PointLight

void setAttenuation(Point3f attenuation)


Selecciona los valores de atenuacin actuales de la luz y los sita en el parmetro especificado.
Los tres valores especificados en el objeto Point3f especifican los coeficientes constante, linear,
y cuadrtico, respectivamente.

1
atenuacin =
-------------------------------------------------------------------constate+linear+cuadrtico*distancia2
donde distancia es la medida desde la fuente de luz al vrtice que est siendo sombreado.

void setAttenuation(float constant, float linear, float quadratic)


Selecciona los valores de atenuacin actuales de la luz y los sita en el parmetro especificado.
Ver la ecuacin anterior.

void setPosition(Point3f position)

Selecciona la posicin de la Luz.

void setPosition(float x, float y, float z)


Selecciona la posicin de la Luz.

Sumario de Capacidades de la Clase PointLight


Adems de las capacidades heredadas de la clase Light, los objetos PointLight tienen las
siguientes capacidades.

ALLOW_POSITION_READ | WRITE
ALLOW_ATTENUATION_READ | WRITE
Como DirectionalLight, PointLight participa solamente en las porciones difusa y de reflexin
especular del modelo de iluminacin. Para las reflexiones difusas y especular, la geometra es un
factor. Variando la localizacin de un objeto PointLight se cambiar el sombreado de los objetos
visuales en una escena.

SpotLight

SpotLight es una subclase de PointLight. La clase SpotLight agrega direccin y concentracin


a los parmetros de posicin y de atenuacin de PointLight. Los objetos SpotLight crean
manualmente modelos de fuentes de luz artificiales como flashes , lmparas, y otras fuentes con
reflectores y/o lentes.
La intensidad de la luz producida por una fuente SpotLight produce la luz dentro de un ngulo
especificado desde la direccin de la luz. Si el vrtice exterior se sale del ngulo de la extensin
de la luz, entonces no se produce ninguna luz. Por dentro del ngulo de extensin, la intensidad
vara mediante el ngulo y la distancia al vrtice. Una vez ms una ecuacin cuadrtica modela
la atenuacin debido a la distancia. El parmetro concentracin y una ecuacin diferente
gobiernan la variacin de la intensidad debido al ngulo. Las ecuaciones que gobiernan estos
lazos se encuentran en la seccin E.2 de la especificacin del API Java 3D. La Figura 6-14 ilustra
en 2D cmo la intensidad de luz vara desde una fuente PointLight en 3D.

El ngulo de extensin de un objeto SpotLight podra hacer que la luz iluminara parte de un
objeto visual. Esta es la nica luz capaz de iluminar slo una parte de un objeto visual.
Los siguientes bloques de referencia listan los constructores y mtodos de PointLight,
respectivamente.

Sumario de Constructores de la Clase SpotLight


SpotLight es una suclase de PointLight con los atributos de direccin, ngulo de extensin y
concentracin.

SpotLight()
Construye e inicializa una fuente de luz usando los siguientes valores por defecto:

lightOn true

color (1, 1, 1)

position (0, 0, 0)

attenuation (1, 0, 0)

direction (0, 0, -1)

spreadAngle PI (180 degrees)

concentration 0.0

SpotLight(Color3f color, Point3f position, Point3f attenuation, Vector3f


direction, float spreadAngle, float concentration)
Construye e inicializa un punto de luz. Puedes ver el sumario de mtodos de PointLight para
ms infromacin sobre la atenuacin. Por defecto la luz est activa.

SpotLight(boolean lightOn, Color3f color, Point3f position, Point3f


attenuation, Vector3f direction, float spreadAngle, float concentration)
Construye e inicializa un punto de luz. Puedes ver el sumario de mtodos de PointLight para
ms infromacin sobre la atenuacin.

Sumario de Mtodos de la Clase SpotLight


Adems de los mtodos listados anteriormente para PointLight, la clase SpotLight tiene los
siguientes mtodos:

void setConcentration(float concentration)


Selecciona la concentracin del punto de luz.

void setDirection(float x, float y, float z)


Selecciona la direccin de la luz.

void setDirection(Vector3f direction)


Selecciona la direccin de la luz.

void setSpreadAngle(float spreadAngle)


Selecciona el ngulo de exposicin de la luz.

Sumario de Capacidades de la Clase SpotLight


Adems de las capacidades heredadas de la clase Light, los objetos SpotLight tienen las
siguientes capacidades:

ALLOW_SPREAD_ANGLE_READ | WRITE
ALLOW_CONCENTRATION_READ | WRITE
ALLOW_DIRECTION_READ | WRITE
Como los objetos DirectionalLight y PointLight, los SpotLights participan solamente en las
porciones difusas y reflexin specular del modelo de iluminacin. Para las reflexiones difusas y
specular, la geometra es un factor. Cambiar la localizacin o la orientacin de una fuente de
SpotLight cambiar el sombreado de los vrtices dentro de la regin de influencia de la luz.

Aplicaciones de Fuentes de Luz

Con todos los tipos de fuentes de luz, y la variedad de maneras de utilizarlas, veremos una
pequea gua de su uso tpico en esta seccin. En general, desearemos utilizar tan pocas fuentes
de luz como se pueda para una aplicacin dada. Cuntas son suficientes depender del efecto de
iluminacin deseado para la aplicacin. El nmero de luces y la configuracin de atributos es
ms una consideracin artstica que cientfica.
Desde un punto de vista artstico, a menudo es suficiente tener solo dos luces para una escena
dada. Una luz proporciona la iluminacin principal, la otra se utiliza para completar la cara ms
oscura de los objetos. La luz principal normalmente se coloca a la derecha del espectador, el
relleno a la izquierda del espectador. Una vez ms stas son pautas generales para lo que pueda
ser un diseo artstico complejo.
Normalmente se prefiere incluir fuentes de luz direccionales para la mayora de las aplicaciones
puesto que el clculo requerido en la representacin es perceptiblemente menor que para los
puntos de luz. Las fuentes de puntos de luz se usan muy raramente debido a la alta complejidad
de clculo.
Es normal incluir una sola fuente de luz ambiente con una gran regin de influencia. Esto
iluminar las partes posteriores de los objetos (como la "cara oscura de la luna"). El valor por
defecto del color funcionar razonablemente bien. El tiempo requerido para incluir la luz
ambiente es pequeo comparado con otras fuentes de luz. Dejar fuera una luz ambiente puede
ser muy sensible en algunas escenas, y no ser notado en absoluto en otras.

Ejemplos de Iluminacin
La interaccin de la luz con los objetos es muy compleja en la naturaleza. Incluso en el mundo
virtual donde es menos complejo el modelo de la iluminacin, las fuentes de luz son simplistas, y
las superficies son menos detalladas, el efecto de una fuente de luz en un objeto visual es algo
complejo. Esta seccin presenta algunos ejemplos de la iluminacin para ayudar a clarificar las
caractersticas, capacidades, y las limitaciones del modelo de iluminacin en Java 3D.
Dos Luces Coloreadas
La Figura 6-15 muestra una sola esfera blanca iluminada por dos fuentes de luz direccionales,
una roja y una azul. Aunque puede sorprendernos, la sombra que resulta es magenta. Mezclar
rojo y azul da lugar a la prpura, que es el resultado en el sistema de color sustractivo. Mezclar
luces rojas y azules resulta en magenta, los resultados de un sistema de color aditivo.

En ausencia de luz, la esfera es negra. Si la nica fuente de luz es roja, entonces la esfera
aparecer roja, o algo sombreada en rojo. Con la adiccin de una fuente de luz azul, slo son
posibles el rojo, el azul y las mezclas de estos dos.
Diferentes Patrones de Iluminacin
La siguiente aplicacin ilustra las diferencia entre las fuentes de luz. En LightsNPlanesApp.java
se iluminan tres planos con una fuente de luz distinta. De izquierda a derecha, los objetos
DirectionalLight, PointLight, y SpotLight iluminan los planos. La Figura 6-16 muestra la
imagen renderizada por la aplicacin.

El DirectionalLight ilumina el plano uniformemente. El PointLight, situado directamente sobre


el borde superior del plano del centro, ilumina el plano de forma irregular debido a la direccin
variable de la luz con respecto a las superficies, y, en un grado inferior, a la atenuacin de la luz.
El SpotLight, tambin situado directamente sobre el centro de su plano, ilumina solamente una
parte pequea del tercer plano.
La Figura 6-17 ilustra la geometra implicada en la iluminacin de los primeros dos planos. En la
ilustracin izquierda, los vectores de luz constantes de la fuente DirectionalLight en conjuncin
con los vectores normales constantes de un plano dan lugar a vectores constantes de la
reflexin, e incluso de la iluminacin del plano. En la ilustracin derecha los vectores de luz
variables de la fuente PointLight se combinan con los vectores normales constantes del plano
dando por resultado las distintas direcciones para los vectores de reflexin, y una iluminacin
desigual del plano. El SpotLight es un caso especial de la fuente PointLight donde la influencia
de la fuente de luz est limitada por el ngulo de la extensin.

Concentracin y ngulo de Extensin de SpotLights


La Figura 6-18 muestra las imgenes renderizadas a partir de versiones distintas del programa
ConcentrationApp.java. Un plano es iluminado por nueve puntos de luz. Los valores del ngulo
y de la concentracin de la extensin para las luces de los puntos varan con la posicin. El
ngulo de la extensin vara por cada fila con valores de .1, .3 y .5 (radianes) desde la fila
superior a la inferior, respectivamente. La concentracin vara por cada columna con valores de
1,0, 50,0, y 100,0 desde la columna de la izquierda a la de la derecha, respectivamente.
Los valores de concentracin no tienen ningn efecto para la fila superior, el ngulo de la
extensin es el nico factor. En la fila inferior, la concentracin tiene un efecto para cada uno de
los ngulos de la extensin. El azul en las imgenes es el color difuso del material.

ConcentrationApp.java demuestra dos limitaciones del modelo de iluminacin. La primera es el

renderizado de los artefactos representados en la Figura 6-18. Artefactos similares son visibles
en la Figura 6-16. Los modelos desiguales de iluminacin para los planos verdes y rojos son
debidos al pequeo nmero de vrtices usados para representar los planos. Recordamos que el
modelo de iluminacin se aplica solamente en los vrtices. Cuantos ms vrtices, mayor es el
efecto de sombreado y ms tardar en renderizarse.
La diferencia entre las imgenes izquierda y derecha de la Figura 6-18 es debido a la diferencia
en el nmero de las vrtices usados para representar el plano. La versin del programa que
gener la imagen izquierda utiliz 16 veces ms vrtices que la que est a la derecha (2.500
vrtices contra 40.000). Los artefactos de la imagen derecha son un resultado de la reduccin de
la densidad de vrtices en la superficie y la triangulacin impuesta por el sistema de renderizado
de Java 3D.
Limitar el Nmero de Luces
La segunda limitacin demostrada en ConcentrationApp no se ve en la representacin. El plano
de ConcentrationApp son realmente cuatro objetos planos uno al lado de otro. Esto se hizo
para superar una potencial limitacin del sistema de representacin subyacente. La
especificacin de OpenGL requiere soporte para ocho fuentes de luz simultneas. Si el plano de
ConcentrationApp fuera un objeto visual, entonces OpenGL limitara el nmero de luces a
ocho en algunas mquinas.
Usando los lmites de influencia para seleccionar solamente las fuentes de luz relevantes para un
objeto visual, Java 3D crea dinmicamente las especificaciones de iluminacin para las luces
mientras que se renderizan los objetos visuales. Mientras que ningn objeto sea iluminado por
ms de ocho luces, los programas de Java 3D no estn limitados en el nmero de luces en un
mundo virtual.
Por eso proporcionar al cuadro planos ms pequeos y los lmites apropiados para asegurarse de
que ningn plano se ve influenciado por ms de ocho luces, en el ejemplo parece que hay nueve
luces (realmente diez, con la luz ambiente) iluminando un plano. Necesita un poco ms
programacin, pero el programa que resulta es ms portable. Mientras que muchas
implementaciones de OpenGL utilizan ms de ocho luces simultneas, si estamos planeando
distribuir nuestros programas, debemos tener en cuante esta limitacin potencial.
En esta seccin, algunos ejemplos muestran alguna de las caractersticas y las limitaciones de la
iluminacin Java 3D. La intencin de esta seccin es dar a los lectores algunos ejemplos de
programas bsicos y algunas figuras de ejemplo para comparar con sus propios programas. No

es posible proporcionar ejemplos de cada posible situacin de iluminacin, pues los factores en
la representacin son demasiado diferentes.
Una ltima cosa, PointLight y SpotLight utilizan la especificacin de atenuacin. La atenuacin
se especifica por los trminos constantes en la ecuacin cuadrtica inversa basada en la
distancia entre la luz y el vrtice (vase el bloque de la referencia anterior). Encontrar la
atenuacin apropiada para una aplicacin especfica es un problema artstico. No se incluye
ningun programa de ejemplo de atenuacin en este tutorial.

Objetos Material

Las caractersticas materiales de un objeto visual se especifican en el objeto Material de un


manojo de aspecto. Material es una subclase de NodeComponent. La Figura 6-19 muestra la
jerarqua de clases del API Java 3D para Material.

El objeto Material especifica colores ambiente, difusos, especular, y emisivo y un valor de


brillantez. Cada uno de los tres primeros colores se utiliza en el modelo de iluminacin para
calcular la reflexin correspondiente. El color emisivo permite que los objetos visuales "brillen
intensamente en la oscuridad". El valor de brillantez se utiliza solamente para calcular
reflexiones especulares.
Los siguientes bloques de referencia enumeran los constructores y los mtodos de la clase
Material.

Sumario de Constructores de la Clase Material


El objeto Material define la aparienia de un objeto bajo la iluminacin.

Material()
Construye e inicializa un objeto Material usando los siguientes valores por defecto:

ambientColor (0.2, 0.2, 0.2)

emissiveColor (0, 0, 0)

diffuseColor (1, 1, 1)

specularColor (1, 1, 1)

shininess 0.0

Material(Color3f ambientColor, Color3f emissiveColor, Color3f


diffuseColor,
Color3f specularColor, float shininess)
Construye e inicializa un nuevo objeto Material usando los parmetros especificados.

Lista Parcial de Mtodos de la Clase Material

void setAmbientColor(Color3f color)


Selecciona el color ambiente de este Material.

void setAmbientColor(float r, float g, float b)


Selecciona el color ambiente de este Material.

void setDiffuseColor(Color3f color)


Selecciona el color difuso de este Material.

void setDiffuseColor(float r, float g, float b)


Selecciona el color difuso de este Material.

void setDiffuseColor(float r, float g, float b, float a)


Selecciona el color difuso ms alpha de este Material.

void setEmissiveColor(Color3f color)


Selecciona el color emisivo de este Material.

void setEmissiveColor(float r, float g, float b)


Selecciona el color emisivo de este Material.

void setLightingEnable(boolean state)


Activa o desactiva la iluminacin de objetos visuales que referencian este objeto.

void setShininess(float shininess)


Selecciona la brillantez de este Material.

void setSpecularColor(Color3f color)

Selecciona el color especular de este Material.

void setSpecularColor(float r, float g, float b)


Selecciona el color especular de este Material.

java.lang.String toString()
Devuelve una representacin String de los valores de este Material.

Sumario de Capacidades de la Clase Material


Adems de las Capacidades heredadas de NodeComponent, los objetos Material tienen la
siguiente capacidad:

ALLOW_COMPONENT_READ | WRITE
Permite ller/escribir informacin de los campos individuales del componente.

Ejemplos sencillos de Material

Las reflexiones especulares ocurren naturalmente en los objetos lisos. En general, cuanto ms
lisa sea una superficie, ms definida e intensa es la reflexin especular. Cuando una superficie es
suficientemente lisa, acta como un espejo que refleja la luz sin cambiar el color de la luz. Por lo
tanto, el color especular de un objeto normalmente es blanco. Cambiamos el color specular de
un Material para alterar la intensidad de una reflexin specular (por ejemplo, Color3f(0.8f,
0.8f, 0.8f)).
El valor de brillantez controla el rango de la extensin del ngulo de la visin para el cual se
puede ver una reflexin especular. Una brillantez ms alta resulta en reflexiones especulares
ms pequeas. La Figura 6-20 muestra nueve esferas distintas iluminadas por una fuente de luz.
Cada esfera tiene un valor de brillantez distinto.

Un objeto Material se asocia a un objeto visual a travs de un objeto Apearance de la misma


manera que lo hacen los atributos del aspecto. El mtodo SetMaterial() de la clase
Appearance referencia un objeto Material para ese objeto Appearance.

Propiedades

Geometry

color,

ColoringAttributes,

Material
Hay tres maneras de especificar el color para un objeto visual: color por-vrtice especificado en
la geometra con los mtodos getColor(), ColoringAttributes de un nodo Appearance, y el
objeto Material. Java 3D permite que creemos objetos visuales sin usar ninguna, alguna, o las
tres formas de especificar color.
Cuando se ha hecho ms de una especificacin del color, dos sencillas reglas determinan qu
especificacin del color toma la precedencia.

Color Material se utiliza solamente cuando la representacin ilumina objetos y


color de ColoringAttributes slo se utiliza cuando se renderizan objetos no
iluminados.

Geometra por-vrtice siempre tiene precedencia sobre ColoringAttributes o


Material.

Las reglas pueden ser ms claras cuando el problema se divide en objetos iluminados o
apagados. La iluminacin est activa para un objeto cuando se referencia un objeto Material.
Inversamente, cuando no se asocia ningn objeto Material al objeto visual, la iluminacin est
desactivada para ese objeto. Observa que una escena puede tener tanto objetos iluminados
como apagados.
Cuando la iluminacin est activa para un objeto (es decir, se referencia un objeto Material), se
utilizan el color material o el color de la geometra por-vrtice para sombrear. Si esta presente, el
color por-vrtice reemplaza los colores de Material difusos y ambiente. Observa que el color de
ColoringAttributes nunca se utiliza para la iluminacin de objetos. La siguiente Tabla resume
las relaciones:

Color de Geometry por Vrtice

Color ColoringAttributes

NO
SI
NO
SI

NO
NO
SI
SI

Resultado
Color Material
Color Geometry
Color Material
Color Geometry

Cuando la iluminacin est desactivada para un objeto (es decir, no se referencia un objeto
Material), se usan el color de ColoringAttributes o el color de por-vrtice para colorear. Si est
presente, el color de la geometra por-vrtice reemplaza el color de ColoringAttributes. La
siguiente Tabla resume las relaciones.
Color Geometry por Vrtice
NO
SI
NO
SI

Color ColoringAttributes
NO
NO
SI
SI

Resultado
blanco plano
Color Geometry
ColoringAttributes
Color Geometry

Superficies Normales

Segn lo mencionado en secciones anteriores, las superficies normales son necesarias para
sombrear los objetos visuales. Al crear objetos visuales usando clases Geometry, utilizamos uno
de los mtodos setNormal() para especificar los vectores de los vrtices.
El NormalGenerator incluido con los utilidades de Java 3D genera superficies normales al
especificar los objetos visuales que usan objetos GeometryInfo. Para generar superficies
normales,
ponemos
nuestro
objeto
visual
Geometry
y
llamamos
a
NormalGenerator.generateNormals().
Los primitivos geomtricos generan sus propias superficies normalea cuando son especificados.
No importa cmo se especifican (o se generan) las superficies normales, slo se especifica una
superficie normal por vrtice. Esto conduce a algunos problemas interesantes. Por ejemplo,
cuando las dos superficies normales de polgonos son visibles, la normal es solamente correcta
para una de las superficies normales. El resultado es que las caras posteriores sean renderizadas
(si se renderizan) solamente con las caractersticas materiales de ambiente. Las reflexiones
difusa y especular requieren la especificacin normal apropiada.
Este problema comn se soluciona especificando caras normales detrs al contrario que las
superficies normales delanteras. Utilizamos el mtodo setBackFaceNormalFlip() de un
objeto PolygonAttributes para este propsito.
La Figura 6-21 muestra dos imgenes sombreadas de una tira doblada. La imagen de la izquierda
fue renderizada desde la superficie frontal, y la derecha muestra las superficies normales
traseras.

Cuando un vrtice es compartido por las superficies normales o varian las orientaciones, tener
solamente una superficie normal por vrtice puede dar lugar a problemas. Consideremos los
ejemplos ilustrados en la Figura 6-22. La geometra ilustrada en la cara del lado izquierdo de la
Figura 6-22 muestra la seccin transversal de una superficie donde cada polgono se orienta a un
ngulo de 90 de sus vecinos. Si se selecciona la superficie normal como el normal actual para
una superficie, es muy incorrecto para su vecino. Si las superficies normales se especifican segn
lo mostrado, entonces la superficie estar sombreada constantemente entre los vrtices con
superficies paralelas. Un problema similar ocurre con la geometra del cubo mostrada en la cara
derecha en la Figura 6-22. La solucin a ambos problemas es aumentar el nmero de vrtices
para aumentar el nmero de superficies normales. Esto, por supuesto, aumenta el uso de la
memoria y el tiempo de la renderizacin.

Especificar la Influencia de las Luces

En ejemplos anteriores, la especificacin de los lmites que influencian un objeto de luz se


consigue al referirse a un objeto Bounds. Esto conecta la localizacin de los lmites que
influencian a la localizacin de la luz. (En secciones anteriores se explic cmo las
transformaciones en el escenario grfico afectan a los volmenes de limites usados para
especificar los lmites de influencia de las luces.) Mientras que esto se hace trivial para mover
luces junto con los objetos visuales que se iluminan, otras aplicaciones necesitan una
especificacin ms flexible de la influencia de luces. Afortunadamente, el API Java 3D
proporciona un mtodo alternativo para especificar los lmites de influencia y una manera de
limitar el mbito en adicin de los lmites.

Alternativa a los Lmites de Influencia: BoundingLeaf

Un objeto BoundingLeaf es un alternativa a un objeto Bounds de influencia. Un objeto


BoundingLeaf es referido por otros nodos de la hoja para definir una regin de influencia. Como
descendiente de SceneGraphObject, los ejemplares de BoundingLeaf se agregan al escenario
grfico. El objeto BoundingLeaf est sujeto al sistema de coordenadas local de su posicin en el
escenario grfico, que podra ser independiente del sistema de coordenadas del objeto de luz. Es
decir, usar un BoundingLeaf permite a una luz y a sus lmites de influencia moverse
independientemente.
Una llamada a setInfluencingBoundingLeaf() para un objeto de luz especifica el
argumento BoundingLeaf como los lmites de influencia de la luz. Esta especificacin
reemplaza cualquier especificacin regional de los lmites de influencia. Un objeto
BoundingLeaf puede ser compartido por varios objetos de luz.
La Figura 6-23 muestra el diagrama del escenario grfico para una aplicacin de ejemplo de un
objeto BoundingLeaf con objetos de luz. En esta escena, se mueven dos luces junto con un
objeto TransformGroup (a la derecha). Estas luces podan ser ejemplares de PointLight o de
SpotLight. Sin embargo, la influencia de estas luces no cambia cuando las luces se mueven. La
influencia de las luces se mueve cuando el TransformGroup izquierdo cambia la localizacin del
objeto BoundingLeaf. Podemos comparar este diagrama del escenario grfico con el que est
en la Figura 6-10.

En la Figura 6-10, si se mueve la luz, su regin de influencia tambin se mueve. Tambin, segn
lo demostrado en la Figura 6-10, la regin de influencia de dos luces que comparten el mismo
objeto Bounds pueden o no pueden tener la misma regin de influencia. Cuando dos o ms
luces comparten el mismo objeto BoundingLeaf, tienen siempre la misma regin de la
influencia.

mbito de Lmites de Influencia de las Luces

Una regin de limites, con un objeto Bounds o un objeto BoundingLeaf, especifica la regin de
influencia de un objeto de luz. Un mbito especificado puede adems limitar la influencia de una
luz a una porcin del escenario grfico. Como valor por defecto, todas las luces tienen el alcance
del mundo virtual en el cual reside. La adicin de una especificacin del alcance reduce adems
la influencia de una luz a los objetos visuales en el escenario grfico debajo del group(s)
especificado. Por ejemplo, consideremos la aplicacin siguiente.
Ejemplo de mbito de Iluminacin
La escena consiste en una lmpara y algunos objetos visuales en una mesa. La lmpara tiene
una sombra, por eso no todos los objetos, ni toda la mesa, debe ser iluminada por la lmpara. El
interior (pero no el exterior) de la lmpara tambin se debe iluminar (en este ejemplo, la sombra
de la lmpara es completamente opaca). Sabemos que Java 3D no proporcionar la obstruccin
por nosotros. Usando slo un volumen de limitacin, la influencia de la luz puede ser controlada,
pero podra ser muy difcil, especialmente si se iluminan y apagan objetos que estn uno cerca
del otro, o se mueven.
Especificar un mbito de limitaciones para la luz nos permite controlar limitaciones complejas de
la influencia ms fcilmente. La nica consideracin es mantener los objetos iluminados y
apagados en partes separadas del escenario grfico. Nuestro pensamiento inicial pudo ser
comenzar a construir el escenario grfico BranchGroups para los objetos iluminados y
apagados, pero so no es a menudo necesario ni recomendado para la mayora de las
aplicaciones.

El diagrama del escenario grfico de la izquierda de la Figura 6-24 muestra un acercamiento


nativo a la construccin del escenario grfico. La organizacin no es natural y ser difcil de
manipular en una aplicacin animada. Por ejemplo, si la mesa se mueve, la lmpara y otros
objetos deben moverse con ella. En el escenario grfico de la izquierda, mover la mesa
(mediante la manipulacin de TransformGroup) no mover la lmpara o el rectngulo
ilumiando; solamente el rectngulo apagado se mover con la mesa.
El diagrama del escenario grfico de la derecha representa una organizacin ms natural para la
escena. Los objetos en la mesa son hijos del TransformGroup que coloca la mesa. Si la mesa se
mueve (mediante la manipulacin de TransformGroup) los objetos de la mesa se moveran con
ella.
La escena de ejemplo se crea en LightScopeApp.java. La Figura 6-25 muestra dos imgenes
renderizadas del programa de ejemplo. La imagen izquierda utiliza mbito de luz para limitar la
influencia de la luz de la lmpara a la lmpara y el rectngulo iluminado. La imagen derecha no
utiliza scoping; por lo tanto, la luz de la lmpara ilumina el ' rectngulo no iluminado'.
El rea brillante debajo de la lmpara (no representada en ningn diagrama del escenario
grfico) es un polgono situado justo sobre la tapa de la mesa. Este polgono brillante representa
la parte de la mesa que es iluminada por la lmpara. El rea brillante aparece ms ligera que el
resto de la mesa (incluso en la imagen derecha de la Figura 6-9) porque sus superficies se
alinean ms cercanas al punto de luz de la lmpara.
La sombra no aparece iluminada en ninguna imagen de la Figura 6-25 porque su caracterstica
Material difusa es negra. La sombra puede crearser con el uso del scoping solamente si un nodo
adicional del grupo que se utiliza en el escenario grfico.
La sombra en esta escena fue creada a mano. Las tcnicas para crear sombras automticamente
(incluso dinmicamente) se discuten en la siguiente seccin.

Tampoco se representan en ningn diagrama del escenario grfico las tres fuentes de luz
adicionales: dos fuentes de luz direccionales y una fuente de luz ambiente. stas son necesarias
para simular la luz de una escena natural.
El siguiente bloque de referencia muestra los mtodos de la clase Light usados para especificar
limitaciones del scoping y el uso de los objetos BoundingLeaf para especificar los lmites de
influencia.

Lista Parcial de Mtodos de la Clases Light


Otros mtodos de la clase Light aparecieron en secciones anteriores.

void addScope(Group scope)


Aade el mbito especificado a la lista de mbitos de este nodo.

java.util.Enumeration getAllScopes()
Devuelve un objeto Enumeration con todos los mbitos.

void insertScope(Group scope, int index)


Inserta el mbito especificado por el nodo grupo en el ndice especificado.

int numScopes()
Devuelve un contador con los mbitos de luces.

void removeScope(int index)


Elimina el mbito del nodo en la posicin de ndice especificada.

void setInfluencingBoundingLeaf(BoundingLeaf region)


Selecciona la regin de influencia de la luz al BoundingLeaf especificado. Seleccionar un
BoundingLeaf sobreescribe un objeto Bounds.

void setScope(Group scope, int index)


Selecciona el mbito de herencias en el ndice especifiado. Por defecto las luces tienen mbitos
slo para los lmites de su regin de influencia.

Otra ventaja de usar alcances para limitar la influencia de una luz: puede reducir el tiempo de
renderizado. Calcular la interseccin de los lmites para un objeto visual con los lmites que
influencian de una luz es ms complejo que determinar el alcance de una luz. Debemos tener
cuidado con que ni el uso de los lmites de influencia ni los alcances limitar la influencia de una
luz a una parte de un objeto visual.

Crear Objetos Brillantes-en-la-Oscuridad, Sombras y

Otros Problemas de Iluminacin


Las secciones anteriores cubren las aplicaciones tpicas de iluminacin en Java 3D. Esta seccin
cubre algunas de las caractersticas y tcnicas menos utilizadas.

Objetos Brillantes-en-la-Oscuridad

El objeto Material permite la especificacin de un color emisivo. Esto se puede utilizar para
crear el efecto de un objeto brillante en la oscuridad. Tener un color emisivo no hace del objeto
visual una fuente de luz; no iluminar otros objetos visuales. El Material Emisivo es tambin til
en aplicaciones especiales, tales como indicar un objeto especial o un objeto que se ha escogido.
La Figura 6-26 muestra la escena del programa del mbito de luz donde se le ha dado color
emisivo al rectngulo no iluminado. Comparemos esta imagen con la imagen izquierda de la
Figura 6-25. Como podemos ver, el uso del color emisivo slo modifica al objeto visual que lo
tiene. Este ejemplo tambin demuestra que el uso eficaz del color emisivo, como con la mayora
de los parmetros de la iluminacin, es ms un problema artstico que de programacin.

Calcular Sombras

La complejidad de calcular sombras es tan grande que no forma parte de ningn sistema de
grficos en tiempo real. La complejidad viene de clcular si la fuente de luz alcanza o no un
vrtice. Todo polgono de otro objeto visual debe ser considerado al calcular la respuesta.

El sombreado es mucho ms complejo en realidad. Las fuentes de luz no son fuentes puramente
direccionales ni perfectas. Por lo tanto, las sombras no tienen bordes sostenidos. Ignorando la
realidad, como hacemos a menudo en grficos, echemos una ojeada a las formas de simular
sombras.

Crear Sombras

Hay dos partes bsicas al simular (o al falsificar) sombras: calcular donde estn las sombras, y
crear geometras (o texturas) para servir como sombras. Hay varias maneras de calcular la
localizacin de la sombra, pero los detalles de las distintas tcnicas de sombreado estn ms all
del alcance de esta gua. Las dos secciones siguientes cubren dos tcnicas generales para crear
el contenido de la sombra.
Sombrear Polgonos
Un polgono especificado sin propiedades Material se puede utilizar como polgono de sombra,
llamado un polgono sombra coloreado. El color del polgono sombra, especificado por geometra
o con un objeto ColoringAttributes, se elige para aparecer como el objeto en sombra. Los
polgonos sombra especificados de esta manera pueden parecer falsos en escenas complejas.
Los polgonos sombra especificados con las caractersticas Material pero fuera de la influencia
de uno o ms objetos de luz se llaman polgonos sombra sombreados. Los polgonos sombra son
sombreados por los objetos de luz que los influencian tal que parecen ms realistas.
Obviamente, especificar un polgono sombra sombreado es ms complejo que especificar un
polgono sombra coloreado.
No importa cmo se especifique un polgono sombra, la posicin del polgono sombra es justo
arriba, o en frente de, el polgono al que da sombra. Mientras que la adicin de polgonos sombra
no da lugar normalmente a ms polgonos para renderizar (debido a la obstruccin de otros
polgonos) crea ms objetos en el universo virtual lo que puede degradar el funcionamiento de la
renderizacin.
En vez de crear los polgonos sombra, las sombras pueden crearse cambiando la influencia de
luces para excluir polgonos 'en la sombra'. El mbito de luces es til para este propsito. Sin
embargo, puesto que la influencia se determina en base al objeto, puede ser complejo calcular
cmo subdividir los objetos visuales que se sombrean parcialmente.
Sombrear Texturas
Como las sombras anteriores, las sombras naturales son complejas. Una sombra natural
raramente tiene un borde recto y una sombra constante. Se puede usar el texturado para hacer
sombras ms realistas. Hay dos maneras bsicas de usar texturado para crear sombras:
aplicando textura a los polgonos sombra, o la aplicacin de texturas a los objetos visuales.
Como el texturado no se ha cubierto todava (Captulo 7), y el clculo de las texturas de la
sombra (incluso off-line) es difcil (y va ms all del alcance de esta gua) este es un tema
pendiente para otro libro.
Mover Objetos, Mover Sombras
Debemos tener presente que la adicin de sombras a una aplicacin hace la aplicacin mucho
ms compleja. Por ejemplo, cuando un cubo con una sombra gira, la sombra gira y se deforma.
Para esa materia, las luces mviles hacen que las sombras se muevan tambin. En cualquier
caso, el movimiento agrega otro nivel de complejidad a la programacin de sombras.

Programa de Ejemplo de Sombras

El programa ShadowApp.java da un ejemplo de cmo se pueden crear polgonos sombra


sencillos. El programa define una clase para crear los polgonos sombra. La clase sombra crea un
polgono sombra para cada geometra dada como entrada de informacin. El Fragmento de
Cdigo 6-3 muestra la clase SimpleShadow usada para crear polgonos sombra en
ShadowApp.java. La Figura 6-28 muestra la escena renderizada con una sombra.
Fragmento de Cdigo 6-3 Clase Shadow para Crear Polgonos Sombreados.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23. }

public class SimpleShadow extends Shape3D {


SimpleShadow(GeometryArray geom, Vector3f direction,
Color3f col, float height) {
int vCount = geom.getVertexCount();
QuadArray poly = new QuadArray(vCount, GeometryArray.COORDINATES
| GeometryArray.COLOR_3
);
int v;
Point3f vertex = new Point3f();
Point3f shadow = new Point3f();
for (v = 0; v < vCount; v++) {
geom.getCoordinate(v, vertex);
shadow.set( vertex.x + (vertex.y-height) * direction.x,
height + 0.0001f,
vertex.z + (vertex.y-height) * direction.y);
poly.setCoordinate(v, shadow);
poly.setColor(v, col);
}
this.setGeometry(poly);

Varias asunciones hechas en la clase SimpleShadow (para hacerlo fcil) limitan las aplicaciones
de esta clase. SimpleShadow est limitada en que: proyecta solamente a los planos, slo
considera una luz, slo hace algunas orientaciones, no considera las dimensiones del plano sobre
el que se est proyectando. Escribir una clase de fines generales para el clculo de la sombra es
una empresa importante.

Tpico

Avanzado:

El

Papel

del

Objeto

View

en

el

Sombreado
La vista (o las vistas) asociadas a un escenario grfico juegan una gran variedad de papeles en
cmo se renderiza una escena. Esta seccin no explica todos los papeles del objeto View. La
especificacin del API Java 3D proporciona una referencia completa a la clase View. Esta seccin
menciona solamente dos mtodos de la clase View tiles para entender el sombreado de
objetos visuales.
Segn lo mencionado en la seccin "Vectores de ojo local contra ojos infinito", el vector del ojo es
constante como valor por defecto. Esto se conoce como un vector de ojo infinito. Es decir, la
escena se renderiza como si fuera vista desde el infinito. Tener un ojo infinito reduce
perceptiblemente el clculo de renderizacin.
Sin embargo, la imagen que resulta puede parecer incorrecta. La Figura 6-29 muestra las
imgenes renderizadas a partir de una escena usando un ojo infinito y un ojo local usando
diversas fuentes de luz.

Para apreciar completamente las imgenes de la Figura 6-29 necesitamos conocer la geometra
de la escena. La escena son nueve esferas en una organizacin planar. Cada una de las
imgenes se ve con el mismo campo visual desde la misma posicin. Las nicas variables son si

la luz es un DirectionalLight o un PointLight, y si el ojo es infinito o local. El DirectionalLight


tiene direccin (0, 0, -1), el PointLight se coloca en (0, 0, 1).
Las imgenes (a) y (c) de la Figura 6-29 se renderizan con un ojo infinito. En estas imgenes, los
vectores del ojo son constantes, as que las reflexiones especulares estn bsicamente en la
misma posicin para cada esfera. Las imgenes (b) y (d) de la Figura 6-29 se renderizan con un
ojo local. Los vectores del ojo varan en estas imgenes, as que las reflexiones especulares
estn en distinta posicin para cada esfera. Observemos tambin que la reflexin difusa (azul)
en las esferas vara slo con la fuente de luz. El vector del ojo slo desempea un papel en el
clculo de la reflexin especular.
Una vez ms la caracterstica de la visin del ojo infinito se utiliza para reducir el clculo, y por lo
tanto el tiempo de la renderizacin. La imagen (a) de la Figura 6-29 tarda un menor tiempo para
renderizarse y la imagen (d) tarda el mayor tiempo. Las imgenes (b) y (c) tardan una cantidad
casi igual de tiempo, que es menor que el tiempo de la imagen (d), pero mayor que el de la
imagen (a). El tiempo real para renderizar vara con el sistema utilizado. La diferencia es ms
pronunciada en los sistemas que renderizan por software.

Lista Parcial de Mtodos (Relacionados con el Sombreado) de la Clase View


El objeto View contiene todos los parmetros necesarios para rendereizar una escena
tridimensional desde un punto de vista.

void setLocalEyeLightingEnable(boolean flag)


Selecciona una bandera que india si se usa el ojo local para calacular las proyecciones de
perspectivas.

void setWindowEyepointPolicy(int policy)


Selecciona la poltica del modelo de vista de ojo de la ventana a uno de :

RELATIVE_TO_FIELD_OF_VIEW,

RELATIVE_TO_SCREEN, RELATIVE_TO_WINDOW

El objeto View se puede conseguir desde un SimpleUniverse usando los mtodos apropiados.
Entonces el objeto View se puede manipular como en el siguiente ejemplo:

SimpleUniverse su = new SimpleUniverse(canvas);


su.getViewer().getView().setLocalEyeLightingEnable(true);

También podría gustarte