Java 3D

La igual que las interacciones, las animaciones Java 3D se implementan usando ojetos Behavior. Como podr�s imaginar, se puede crear cualquier animaci�n personalizada usando objetos Behavior. Sin embargo, el API Java 3D proporciona varias clases �tiles para crear animaciones sin tener que crear una nueva clase. No deber�a sorprendernos que estas clases est�n basadas en la clase Behavior.

Un conjunto de clases de animaci�n es conocido como interpoladores. Un objeto Interpolator, junto con un objeto Alpha, manipula alg�n par�metro de un objeto del escenario gr�fico para crear animaciones basadas en el tiempo. El objeto Alpha proporciona el temporizado.

Otro conjunto de clases de animaci�n animan objetos visuales en respuestas a cambios en la vista. Este conjunto de clases incluye los comportamientos Billboard y Level of Detail (LOD) que no est�n dirigidos por el paso del tiempo, sino por la posici�n u orientaci�n de la vista. La Figura 5-1 muestra las clases de alto nivel del �rbol de clases para animaci�n.

Figura 5-1, Algunas Clases Usadas en Animaciones Java 3D

.�Los Interpoladores y los Objetos Alpha Proporcionan Animaciones Basadas en el Tiempo

Un objeto Alpha produce un valor entre cero y uno, inclusives, dependiendo de la hora y los par�metros del objeto Alpha. Los Interpolators son objetos behavior personalizados que usan un objeto Alpha para proporcionar animaciones de objetos visuales. Las acciones de Interpolator incluyen el cambio de localizaci�n, orientaci�n, tama�o, color o transpariencia de un objeto visual. Todos los comportamientos interpoladores podr�an implementarse creando una clase behavior personalizada; sin embargo, usar un interpolador hacer m�s sencilla la creacci�n de estas animaciones. Las clases Interpolator existen para otras acciones, incluyendo algunas combinaciones de estas acciones.

.�Alpha

Un objeto Alpha produce un valor, llamado valor alpha, entre 0,0 y 1,0; �mbos inclusives. El valor alpha cambia con el tiempo seg�n los par�metros especificados en el objeto alpha. Para unos par�metros especificos en un momento particular, s�lo hay un valor alpha que el objeto alpha producir�. Dibujando el valor alpha sobre el tiempo veremos la forma de onda que produce el objeto alpha.

La forma de onda del objeto alpha tiene cuatro fases: incremento, alpha a uno, decremento, y alpha a cero. La colecci�n de las cuatro fases es un ciclo de la forma de onda alpha. estas cuatro fases corresponden con cuatro par�metros del objeto Alpha. La duraci�n de las cuatro fases se especifica por un valor entero expresando su duraci�n en milisegundos. La Figura 5-2 muestra las cuatros fases de la forma de onda Alpha.

Todos los tiempos alpha son relativos al momento de inicio del objeto Alpha. El momento de arranque para todos los objetos Alpha se toma de la hora de arranque del sistema. Consecuentemente, los objetos Alpha creados en diferentes momentos tienen el mismo momento de inicio. Como resultado, todos los objetos interpoladores, incluso aquellos basados en diferentes objetos Alpha, est�n sincronizados.

Los objetos Alpha pueden iniciar sus formas de onda en diferentes momentos. El inicio de la primera forma de onda de un objeto alpha puede retrasarse usando alguno de los otros dos par�metros TriggerTime y PhaseDelayDuration. El par�metro TriggerTime especifica un tiempo despu�s de StartTime para empezar la operaci�n del objeto Alpha. Un tiempo especificado por el par�metros PhaseDelayDuration despu�s de TriggerTime, empezar� el primer ciclo de la forma de onda. La Figura 5-2 muestra el StartTime, TriggerTime y PhaseDelayDuration.

Una forma de onda alpha podr�a realizarse s�lo una vez, repetirse un n�mero determinado de veces, o hacer un ciclo cont�nuo. El n�mero de ciclos se especifica en el par�metro loopCount. Cuando loopCount es positivo, especifica un n�mero de ciclos. Si es -1 especifica un bucle cont�nuo. Cuando la forma de onda alpha se repite m�s de una vez, se repiten las cuatro fases del ciclo, pero no se repite el retardo de fase.

Figura 5-2, Fases de la Forma de Onda Alpha.

Una forma de onda alpha no siempre usa las cuatro fases. Podr�a estar formada por una, dos, tres o las cuatro fases de la forma de onda Alpha. La Figura 5-3 muestra seis de las quince formas de ondas posibles.

Figura 5-3, Algunas Formas de Ondas B�sicas Creadas con un Objeto Alpha.

El objeto alpha tiene dos modos que especifican un subconjunto de fases a usar. El modo INCREASING_ENABLE indica que se usan las fases de incremento alpha y alpha a uno . El modo DECREASING_ENABLE indica que se usan las fases decremento alpha y alpha a cero. Un tercer modo es la combianci�n de los dos anteriores, lo que indica que se usar�n las cuatro fases.

La especificaci�n de modo sobreescribe las selecciones de los par�metros de duraci�n. Por ejemplo, con el modo INCREASING_ENABLE, se ignoran los par�metros DecreasingAlphaDuration, DecreasingAlphaRampDuration, y AlphaAtZeroDuration. Tambi�n, se puede especificar cualquier forma de onda especificando las duracciones de las fases no necesarias como cero, la especificaci�n apropiada del modo incrementa la eficiciencia del objeto Alpha.

.�Usar Objetos Interpolator y Alpha

La receta para usar objetos Interpolator y Alpha es muy similar a la usada para cualquier objeto behavior. La diferencia principal es la inclusi�n del objeto Alpha.

  1. crear el objeto fuente con las capacidades apropiadas
  2. crear el objeto Alpha
  3. crear el objeto Interpolator que referencia al objeto Alpha y al objeto fuente
  4. a�adir l�mites al objeto Interpolator
  5. a�adir el objeto Interpolator al escenario gr�fico

.�Ejemplo de uso de Alpha y RotationInterpolator

ClockApp.java es un ejemplo de uso de la clase RotationInterpolator. La escena es la esfera de un reloj. El reloj es rotado por unos objetos RotationInterpolator y Alpha una vez por minuto.

En esta aplicaci�n, el objeto fuente es un TransformGroup, que necesita la capacidad ALLOW_TRANSFORM_WRITE. Algunos otros interpoladores act�an sobre diferentes objetos fuente. Por ejemplo, la fuente para un objeto ColorInterpolator es un objeto Material. Un objeto interpolator selecciona los valores de su objeto fuente bas�ndose en el valor alpha y en los valores que el propio objeto interpolator contiene.

El interpolator define los puntos finales de la animaci�n. En el caso de RotationInterpolator, el objeto especifica los �ngulos inicial y final de la rotaci�n. El alpha controla la animaci�n con respecto al tiempo y c�mo se mover� el interpolador desde un punto definido hasta el otro especificando las fases de la forma de onda apha

Esta aplicaci�n usa las selecciones por defecto de RotationInterpolator con un �ngulo inicial de cero y un �ngulo final de 2P (una rotaci�n completa). El eje por defecto de rotaci�n es el eje y. El objeto alpha se selecciona para rotar cont�nuamente (loopCount = -1) con un periodo de un minuto (60.000 milisegundos). La combinaci�n de estos dos objetos crear� el efecto visual de una rotaci�n completa cada minuto. El ciclo se repite continuamente. El resultado parece que el reloj est� moviendose continuamente, no como si se parara y empezara de nuevo.

El Fragmento de C�digo 5-1 muestra el m�todo createSceneGraph de la aplicaci�n ClockApp.java.

Fragmento de C�digo 5-1, usar un RotationInterpolator y un Alpha en un Reloj (de ClockApp)
1.     public BranchGroup createSceneGraph() {
2.     // Create the root of the branch graph
3.     BranchGroup objRoot = new BranchGroup();
4.
5.     // create target TransformGroup with Capabilities
6.    TransformGroup objSpin = new TransformGroup();
7.    objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
8.
9.     // create Alpha that continuously rotates with a period of 1 minute
10.   Alpha alpha = new Alpha (-1, 60000);
11.
12.   // create interpolator object; by default: full rotation about y-axis
13.   RotationInterpolator rotInt = new RotationInterpolator(alpha, objSpin);
14.   rotInt.setSchedulingBounds(new BoundingSphere());
15.
16.   //assemble scene graph
17.   objRoot.addChild(objSpin);
18.   objSpin.addChild(new Clock());
19.   objRoot.addChild(rotInt);
20.
21.   // Let Java 3D perform optimizations on this scene graph.
22.   objRoot.compile();
23.
24.   return objRoot;
25.   } // end of CreateSceneGraph method of ClockApp

La Figura 5-5 es una escena renderizada por ClockApp a las 4:30. La cara del reloj es oblicua al espectador porque todo el reloj est� rotando.

Figura 5-5, Escena renderizada a las 4:30 por el programa de ejemplo ClockApp.

El programa ClockApp muestra una sencilla aplicaci�n de RotationInterpolator. El objeto Clock, est� definido en el fichero Clock.java, muestra una aplicaci�n m�s avanzada del objeto RotationInterpolator. El objeto clock usa un objeto RotationInterpolator para animar cada manecilla del reloj. Sin embargo, s�lo se usa un objeto alpha. No es necesario utilizar otro objeto alpha para coordinar las manecillas, como se mencion� anteriormente, todos los objetos Alpha se sicronizan con el momento de arranque del programa. Sin embargo, compartir un objeto Alpha ahorra memoria del sistema.

Algunas de las caracter�sticas especiales de la clase Clock son:

  • La selecci�n del �ngulos inicial y final de las manecillas,
  • la selecci�n de los ejes de rotaci�n, y
  • la selecci�n del recorte poligonal de varios componentes del reloj.

Suavizar la Forma de Onda Alpha

Adem�s de la duraci�n de las cuatro fases, el programador puede especificar una duraci�n de la rampa para las fases de incremento y decremento alpha. Durante la duraci�n de la rampa, el valor de alpha cambia gradualmente. En el caso de interpoladores del movimiento, parecer� como si el objeto visual acelerara y decelerara de un forma m�s natural, como en el mundo real.

El valor de la duraci�n de la rampa se utiliza para las porciones inicial y final de la fase y por lo tanto la duraci�n de la rampa est� limitada a la mitad de la duraci�n de la fase. La Figura 5-6 muestra una forma de onda alpha con IncreasingAlphaRampDuration y DecreasingAlphaRampDuration. Observa que el valor de alpha cambia linearmente entre los dos per�odos de la rampa.

Figura 5-6, Suavizar la forma de onda producida por Alpha 9

El programa del ejemplo, AlphaApp.java, demuestra el efecto de IncreasingAlphaRampDuration en una forma de onda alpha. En este programa hay tres objetos visuales car. Los tres coches comienzan al mismo tiempo en la misma coordenada X y viajan en paralelo. El coche superior no tiene ninguna rampa (duraci�n de la rampa = 0), el coche inferior tiene una duraci�n m�xima de la rampa (mitad de la duraci�n del incremento o decremento alpha), y el coche del medio tiene la mitad de la duraci�n m�xima de la rampa (un cuarto de la duraci�n del incremento o decremento alpha). Cada coche tarda dos segundos en cruzar la vista. La Figura 5-7 muestra cuatro escenas renderizadas de esta aplicaci�n.

Figura 5-7, Cuatro escenas renderizadas por AlphaApp mostrando el efecto de IncreasingAlphaRampDuration.

Unos 0,4 segundos despu�s de que los coches comiencen, la primera imagen (izquierda) de la Figura 5-7 fue capturada mostrando las posiciones de los coches. El coche superior, que proceder� en un ratio constante en ausencia de una rampa, ha viajado la mayor parte de la distancia en el primer marco. Los otros dos coches comienzan m�s lentamente y aceleran. Un segundo despu�s (no mostrado), todos los coches han viajado la misma distancia. Las posiciones relativas se invierten durante la segunda mitad de la fase. Al final de los dos segundos, cada uno de los coches ha viajado la misma distancia.

.�El API Alpha

El API de la clase de la Alpha es correcto. Cuatro constructores cubren las aplicaciones m�s comunes. Una pl�tora de m�todos, enumerada en el bloque de referencia siguiente, hace el trabajo f�cil de modificar un objeto alpha para personalizar un objeto alpha para cualquier aplicaci�n.

Sumario de Constructores de Alpha

Extiende: Object

La clase Alpha convierte un valor de tiempo en un valor alpha (un valor en el rango 0 a 1, inclusivo). El objeto alpha es efectivamente una funci�n de tiempo que genera valores en el rango [ 0.1 ]. Un uso com�n de alpha proporciona valores alpha para los comportamientos del interpolador. Las caracter�sticas del objeto alpha est�n determinadas por par�metros definibles por el usuario.

Alpha()

Construye un objeto Alpha con el mode = INCREASING_ENABLE, loopCount = -1, increasingAlphaDuration = 1000, y todos los dem�s par�metros = 0, excepto StartTime. StartTime se selecciona en el momento de comienzo del programa.

Alpha(int loopCount, long increasingAlphaDuration)

Este constructor s�lo toma loopCount e increasingAlphaDuration como par�metros, selecciona el modo a INCREASING_ENABLE y asigna 0 a todos los dem�s par�metros (excepto a StartTime).

Alpha(int loopCount, long triggerTime, long phaseDelayDuration,
long increasingAlphaDuration, long increasingAlphaRampDuration,
long alphaAtOneDuration)

Construye un nuevo objeto Alpha y selecciona el modo a INCREASING_ENABLE.

Alpha(int loopCount, int mode, long triggerTime, long phaseDelayDuration,
long increasingAlphaDuration, long increasingAlphaRampDuration,
long alphaAtOneDuration, long decreasingAlphaDuration,
long decreasingAlphaRampDuration, long alphaAtZeroDuration)

Este constructor toma todos los par�metros definidos por el usuario.

Lista Parcial de M�todos de Alpha

Cada uno de estos m�todos tiene su correspondiente m�todo get que devuelve un valor del tipo que corresponda al par�metro del m�todo set.

boolean finished()

Comprueba si este objeto alpha ha finalizado totalmente su actividad.

void setAlphaAtOneDuration(long alphaAtOneDuration)

Selecciona el valor de alphaAtOneDuration al valor especificado.

void setAlphaAtZeroDuration(long alphaAtZeroDuration)

Selecciona el valor de alphaAtZeroDuration al valor especificado.

void setDecreasingAlphaDuration(long decreasingAlphaDuration)

Selecciona el valor de decreasingAlphaDuration al valor especificado.

void setDecreasingAlphaRampDuration(long decreasingAlphaRampDuration)

Selecciona el valor de decreasingAlphaRampDuration al valor especificado.

void setIncreasingAlphaDuration(long increasingAlphaDuration)

Selecciona el valor de increasingAlphaDuration al valor especificado.

void setIncreasingAlphaRampDuration(long increasingAlphaRampDuration)

Selecciona el valor de increasingAlphaRampDuration al valor especificado.

void setLoopCount(int loopCount)

Selecciona el valor de loopCount al valor especificado.

void setMode(int mode)

Selecciona el modo al especificado en este argumento. Este puede ser INCREASING_ENABLE, DECREASING_ENABLE, o un valor OR de los dos

  • DECREASING_ENABLE - Especifica que se usan las fases 3 y 4
  • INCREASING_ENABLE - Especifica que se usan las fases 1 y 2.
void setPhaseDelayDuration(long phaseDelayDuration)

Selecciona el valor de phaseDelayDuration al valor especificado.

void setStartTime(long startTime)

Selecciona el startTime al valor especificado; startTime selecciona la base (o cero) para todos los c�lculos relativos al tiempo, el valor por defecto es la hora de arranque del sistema.

void setTriggerTime(long triggerTime)

Selecciona el valor triggerTime al valor especificado.

float value()

Esta funci�n devuelve un valor entre 0,0 y 1,0 inclusives, basandose en la hora actual y todos los par�metros establecidos para este objeto alpha.

float value(long atTime)

Esta funci�n devuelve un valor entre 0,0 y 1,0 inclusives, basandose en la hora actual y todos los par�metros establecidos para este objeto alpha.

.�Clases de Comportamiento Interpolator

La Figura 5-8 muestra las clases del Interpolator en los paquetes base y de utilidad. En esta figura, se puede ver que hay unas 10 clases Interpolator, y eso son todas las subclases de la clase Interpolator. Tambi�n, esta clase es una extensi�n de Behavior. Los dos rect�ngulos sombreados representan clases Interpolator de utilidad, los otros rect�ngulos representan clases Interpolator b�sicas.

Figura 5-8, �rbol de clases de la clase Interpolator

Cada Interpolator es un Behavior personalizado con un disparador para despertar cada marco. En el m�todo processStimulus, de un objeto Interpolator controla su objeto alpha asociado para saber si el valor actual alpha, ajusta la fuente bas�ndose en el valor alpha, entonces reajusta su disparador al marco siguiente (a menos que se haya terminado el alpha). Alguna de estas funcionalidades se proporcionan en la clase Interpolator. La mayor�a de este comportamiento se implementa en cada clase individual Interpolator.

La mayor�a de los objetos del Interpolator almacenan dos valores que se utilizan como los puntos finales para la acci�n interpolada. Por ejemplo, el RotationInterpolator guarda dos �ngulos que son los extremos de la rotaci�n proporcionada por este Interpolator. Por cada marco, el objeto Interpolator controla el valor alpha de su objeto alpha y hace el ajuste rotatorio apropiado a su objeto TransformGroup fuenete. Si el valor alpha es 0, entonces se usa uno de los valores; si el valor alpha es 1, se utiliza el otro valor. Para los valores alpha entre 0 y 1, el Interpolator interpola linearmente entre los dos valores bas�ndose en el valor alpha y utiliza el valor que resulta para el ajuste del objeto fuente

Esta descripci�n general de Interpolator no describe bien las clases SwitchValueInterpolator ni PathInterpolator. El SwitchValueInterpolator elige uno entre los nodos hijos del objeto Switch fuente bas�ndose en el valor alpha; por lo tanto, no se hace ninguna interpolaci�n en esta clase.

Mientras que varias de las clases Interpolator son similares, tambi�n se diferencian en algunos detalles. La siguiente tabla muestra algunas de las diferencias entre clases Interpolator.

Clase Interpolator usada para tipo de objeto fuente
ColorInterpolator
cambia el color difuso de un objeto(s) Material
PathInterpolator
Clase Abstracta TransformGroup
PositionInterpolator
cambia la posici�n de un objeto(s) TransformGroup
RotationInterpolator
cambia la rotaci�n (orientaci�n) de un objeto(s) TransformGroup
ScaleInterpolator
cambia el tama�o de un objeto(s) TransformGroup
SwitchValueInterpolator
elige uno (cambia) entre una colecci�n de objetos Switch
TransparencyInterpolator
cambia la transparencia de un objeto(s) TransparencyAttributes

El programa del ejemplo, InterpolatorApp.java, demuestra seis clases no-abstractas Interpolator de la tabla anterior. En este programa, cada objeto Interpolator est� dirigido por un solo objeto alpha. La Figura 5-9 muestra dos escenas renderizadas de InterpolatorApp. Los cambios en la posici�n, la rotaci�n, la escala, el color, la transparencia, y el objeto visual (de arriba a abajo) son realizados por los objetos PositionInterpolator, RotationInterpolator, ScaleInterpolator, ColorInterpolator, TransparencyInterpolator, y SwitchValueInterpolator, respectivamente.

Figura 5-9, dos escenadas de InterpolatorApp mostrando varios Interpolators.

Riesgos de Programaci�n de la Clase Interpolator

Los objetos Interpolator se derivan, y se relacionan de cerca, a objetos Behavior. Por lo tanto, usar objetos Interpolator da lugar a los mismos riesgos de programaci�n que usar objeto behavior. Adem�s de �stos, hay riesgos de programaci�n Interpolator en general, y riesgos espec�ficos para algunas clases Interpolator.

Un riesgo potencial de programaci�n de Interpolator es no darse cuenta de que el objeto Interpolator contiene el valor de sus objetos fuente. Podr�amos pensar que el TransformGroup fuente de un RotationInterpolator se puede utilizar para trasladar el objeto visual adem�s de la rotaci�n proporcionada por el Interpolator. Esto no es verdad. El objeto transform seleccionado en el objeto TransformGroup fuente se reescribe en cada marco en que el objeto alpha est� activo. Esto tambi�n significa que dos Interpolator no pueden tener el mismo objeto fuente.

Otro riesgo general del Interpolator es no seleccionar apropiadamente las capacidades del objeto fuente. Fallar al hacer esto resultar� en un error de tiempo de ejecuci�n.

.�API Coraz�n de Interpolator

Como una clase abstracta, Interpolator s�lo se usa para crear una subclase nueva. La clase Interpolator proporciona solamente un m�todo para los usuarios de sus subclases. Los m�todos �tiles para la escritura de subclases no se enumeran aqu�. La mayor�a de la informaci�n necesaria para escribir una subclase del Interpolator puede obtenerse del Cap�tulo anterior

Lista Parcial de M�todos de la Clases Interpolator

Extiende: Behavior

Subclases conocidas: ColorInterpolator, PathInterpolator, PositionInterpolator, RotationInterpolator, ScaleInterpolator, SwitchValueInterpolator, TCBSplinePathInterpolator, TransparencyInterpolator

El comportamiento Interpolator es un clase abstracta que proporciona bloques de construcci�n usados por varios interpoladores especializados.

void setAlpha(Alpha alpha)

Selecciona el objeto alpha de este interpolador al objeto alpha especificado.

ColorInterpolator

Un objeto ColorInterpolator tiene un objeto Material como su fuente. Este Interpolator cambia el color difuso del Material de la fuente. Esto hace del ColorInterpolator tan poderoso como limitado. La potencia viene de la capacidad de tener m�s de un objeto visual del mismo objeto Material. As� pues, un ColorInterpolator con una fuente Material puede afectar a m�s de un objeto visual. La limitaci�n es que los objetos visuales con un Material NodeComponent son solamente visibles cuando se iluminan.

La mayor�a de los riesgos de programaci�n potenciales son el resultado de la complejidad de escenas (iluminadas) sombreadas. La iluminaci�n es tan compleja que es el tema de un cap�tulo entero, el Cap�tulo 6. Por ejemplo, el color de un objeto visual sombreado es la combinaci�n de componentes specular, difuso, y ambiente. El ColorInterpolator cambia solamente uno de los tres componentes, el color difuso, as� que en ciertas situaciones es enteramente posible que parezca que el ColorInterpolator no afecta al objeto visual.

Otro riesgo de programaci�n potencial menos ex�tico es no agregar el objeto Material fuente del objeto Shape3D. La Figura 5-10 muestra un diagrama parcial del escenario gr�fico de un ColorInterpolator y de su Material NodeComponent fuente.

Figura 5-10, Escenario gr�fico parcial de un objeto ColorInterpolator y su objeto fuente Material NodeComponent.

El ColorInterpolator es diferente de otros Interpolator en el formato de sus m�todos get. Los m�todos get de ColorInterpolator tienen par�metros; por lo tanto se listan con los m�todos set

Sumario de Constructores de ColorInterpolator

Extiende: Interpolator

Esta clase define un comportamiento que modifica el color difuso de su objeto Material fuente interpolandolo linearmente entre una pareja de colores especificados (usando el valor generado por el objeto Alpha).

ColorInterpolator(Alpha alpha, Material target)

Construye un colorInterpolator trivial con una fuente especificada, un color inicial negro y un color final blanco.

ColorInterpolator(Alpha alpha, Material target, Color3f startColor,
Color3f endColor)

Construye un colorInterpolator con la fuente especificada, y los colores inicial y final.

Lista Parcial de M�todos de ColorInterpolator

Los m�todos get no siguen las convenciones de los otros interpoladores.

void setEndColor(Color3f color)

Selecciona el color final de este interpolator.

Correspondiente m�todo get: void getEndColor(Color3f color)

void setStartColor(Color3f color)

Selecciona el color inicial de este interpolator.

Correspondiente m�todo get: void getStartColor(Color3f color)

void setTarget(Material target)

Seleccion el componente fuente de este interpolator.

Correspondiente m�todo get: Material getTarget()

PositionInterpolator

El PositionInterpolator var�a la posici�n de un objeto visual a lo largo de un eje. La especificaci�n de los puntos finales de la interpolaci�n se hace con dos valores de coma flotante y un eje de traslaci�n. El valor por defecto del eje de traslaci�n es el eje X

Sumario de Constructores de PositionInterpolator

Extiende: Interpolator

Esta clase define un comportamiento que modifica el componente de translaci�n de su TransformGroup fuente interpolandolo linearmente entre un par de posiciones especificadas (que usan el valor generado por el objeto alpha especificado). La posici�n interpolada se utiliza para generar una traslaci�n a lo largo del eje X local (o del eje especificado en la traslaci�) de este Interpolator.

PositionInterpolator(Alpha alpha, TransformGroup target)

Construye un positionInterpolator trivial con la fuente especificada, con el eje de traslaci�n por defecto (X), una posici�n inicial de 0.0f, y una posici�n final de 1.0f.

PositionInterpolator(Alpha alpha, TransformGroup target,
Transform3D axisOfTranslation, float startPosition, float endPosition)

Construye un nuevo positionInterpolator que var�a el componente translacional del TransformGroup (startPosition y endPosition) a lo largo del eje de traslaci�n especificado.

Lista Parcial de M�todos de PositionInterpolator

Cada uno de estos m�todos tiene un correspondiente m�todo get sin par�metros que devuelve un valor del tipo correspondiente al par�metro del m�todo set.

void setAxisOfTranslation(Transform3D axisOfTranslation)

Selecciona el eje de traslaci�n de este interpolator.

void setEndPosition(float position)

Selecciona la posici�n final de este interpolator.

void setStartPosition(float position)

Selecciona la posici�n inicial de este interpolator.

void setTarget(TransformGroup target)

Selecciona la fuente de este interpolator.

RotationInterpolator

El RotationInterpolator var�a la orientaci�n rotacional de un objeto visual sobre un eje. La especificaci�n de los puntos finales de la interpolaci�n se hace con dos valores de �ngulo en coma flotante y un eje de la rotaci�n. El valor por defecto del eje de rotaci�n es el eje Y positivo.

Sumario de Constructores de RotationInterpolator

Extiende: Interpolator

Esta clase define un comportamiento que modifica el componente rotacional de su TransformGroup fuente interpolandolo linearmente entre un par de �ngulos especificados (que usan el valor generado por el objeto alpha especificado). El �ngulo interpolado se utiliza para generar una rotaci�n sobre el eje Y local de este Interpolator, o el eje especificado de rotaci�n.

RotationInterpolator(Alpha alpha, TransformGroup target)

Construye un rotationInterpolator trivial con una fuente especificada el eje de rotaci�n por defecto es (+Y), un �ngulo m�nimo de 0.0f, y un �ngulo m�ximo de 2*pi radianes.

RotationInterpolator(Alpha alpha, TransformGroup target,
Transform3D axisOfRotation, float minimumAngle, float maximumAngle)

Construye un nuevo rotationInterpolator que var�a el componente rotacional del componente.

Lista Parcial de M�todos de RotationInterpolator

Cada uno de estos m�todos tiene un correspondiente m�todo get sin par�metros que devuelve un valor del tipo correspondiente al par�metro del m�todo set.

void setAxisOfRotation(Transform3D axisOfRotation)

Selecciona el eje de rotaci�n de este interpolator.

void setMaximumAngle(float angle)

Selecciona el �ngulo m�ximo de este interpolator, en radianes.

void setMinimumAngle(float angle)

Selecciona el �ngulo m�nimo de este interpolator, en radianes.

void setTarget(TransformGroup target)

Selecciona el nodo TransformGroup para este interpolator.

ScaleInterpolator

El ScaleInterpolator varia el tama�o de un objeto visual. La especificaci�n de los puntos finales de la interpolaci�n se hace con dos valores en coma flotante.

Sumario de Constructores de ScaleInterpolator

Extiende: Interpolator

Esta clase define un comportamiento que modifica el componente de la escala de su TransformGroup fuente interpolandolo linearmente entre un par de valores de escala especificados (que usan el valor generado por el objeto alpha especificado). El valor de escala interpolado se utiliza para generar una escala en el sistema de coordenadas local de este Interpolator.

ScaleInterpolator(Alpha alpha, TransformGroup target)

Construye un scaleInterpolator que var�a el nodo TransformGroup de su fuente entre los dos valores alpha, una matriz de identidad, una escala m�nima de 0.1f, y una escala m�xima de 1.0f.

ScaleInterpolator(Alpha alpha, TransformGroup target, Transform3D axisOfScale,
float minimumScale, float maximumScale)
Construye un nuevo scaleInterpolator que var�a el componente de escala de su nodo TransformGroup entre dos valores de escala (minimumScale y maximumScale).

Sumario de M�todos de ScaleInterpolator

Cada uno de estos m�todos tiene un correspondiente m�todo get sin par�metros que devuelve un valor del tipo correspondiente al par�metro del m�todo set.

void setAxisOfScale(Transform3D axisOfScale)

Selecciona el eje de escala para este interpolator.

void setMaximumScale(float scale)

Selecciona la escala m�xima para este interpolator.

void setMinimumScale(float scale)

Selecciona la escala m�nima para este interpolator.

void setTarget(TransformGroup target)

Selecciona el TransformGroup fuente para este interpolator.

SwitchValueInterpolator

SwitchValueInterpolator no interpola entre dos valores como otros Interpolator. Selecciona uno de los hijos de un objeto Switch para renderizarlo. Los valores de umbral para cambiar a un hijo diferente se determinan uniformemente dividiendo el rango 0,0 a 1,0 por el n�mero de hijos que teine el objeto Switch.

Un riesgo potencial espec�fico de programaci�n de SwitchValueInterpolator miente en el hecho de que el Interpolator no es actualizado cuando cambia el n�mero hijos del objeto Switch. M�s importante, se determinan los valores de umbral de la conmutaci�n cuando se crea el objeto de SwitchValueInterpolator. As� pues, si el Switch no tiene ning�n hijo antes de que se cree el Interpolator, o si el n�mero de hijos cambia despu�s de que se cree el objeto Interpolator, entonces el n�mero de hijos en el objeto Interpolator debe ser actualizado. La ventaja es que podemos especificar un subconjunto de �ndices que el Interpolator utilizar�. El subconjunto se limita a un conjunto secuencial de �ndices.

Sumario de Constructores de SwitchValueInterpolator

Extiende: Interpolator

Esta clase define un comportamiento que modifica el hijo seleccionado del nodo switch interpolandolo linearmente entre un par hijos especificados (usando el valor generado por el objeto alpha).

SwitchValueInterpolator(Alpha alpha, Switch target)

Construye un SwitchValueInterpolator que var�a su �ndice de nodo Switch fuente entre 0 y n-1, donde n es es el n�mero de hijos del nodo Switch fuente.

SwitchValueInterpolator(Alpha alpha, Switch target, int firstChildIndex,
int lastChildIndex)

Construye un SwitchValueInterpolator que var�a el �ndice de nodo entre los dos valores proporcionados.

Lista Parcial de M�todos de SwitchValueInterpolator

Cada uno de estos m�todos tiene un correspondiente m�todo get sin par�metros que devuelve un valor del tipo correspondiente al par�metro del m�todo set.

void setFirstChildIndex(int firstIndex)

Selecciona el primer �ndice de hijo para este interpolator.

void setLastChildIndex(int lastIndex)

Selecciona el �ltimo �ndice de hijo para este interpolator.

void setTarget(Switch target)

Selecciona la fuente de este interpolator.

Switch

La clase Switch se muestra aqu� porque se utiliza en SwitchValueInterpolator (y m�s adelante en DistanceLOD). Switch se deriva de Group y es el padre de cero o m�s ramas del escenario gr�fico. Un objeto Switch puede seleccionar cero, uno, o m�s, incluyendo todos, sus hijos que se renderizar�n. Por supuesto un objeto Switch se puede utilizar sin un Interpolator u objeto LOD. El m�todo m�s com�nmente usado es addChild() derivado de la clase Group.

Sumario de Constructores de Switch

Extiende: Group

El nodo Switch controla cu�l de sus hijos ser� renderizado. Define un valor de selecci�n de hijo (un valor switch) que puede seleccionar un s�lo hijo, o puede seleccionar cero o m�s hijos usando una m�scara para indicar que hijos son seleccionados para renderizaci�n.

Switch()

Construye un nodo Switch con los par�metros por defecto.

Switch(int whichChild)

Construye e inicializa un nodo Switch usando los �ndices de hijos especificados.

  • CHILD_ALL todos los hijos son renderizados
  • CHILD_MASK se usa la m�scada childMask para seleccionar los hijos a renderizar
  • CHILD_NONE no se renderiza ning�n hijo.
Switch(int whichChild, java.util.BitSet childMask)

Construye e inicializa un nodo Switch usando la m�scara y el �ndice de hijos especificados.

Lista Parcial de M�todos de Switch

Cada uno de estos m�todos tiene un correspondiente m�todo get sin par�metros que devuelve un valor del tipo correspondiente al par�metro del m�todo set.

void setChildMask(java.util.BitSet childMask)

Selecciona la m�scara de selecci�n de hijos.

void setWhichChild(int child)

Selecciona el �ndice de selecci�n de hijos que especifica qu� hijo ser� renderizado.

Sumaro de Capacidades de Switch

ALLOW_SWITCH_READ | WRITE

Especifica que este nodo permite leer sus valores de selecci�n de hijos de m�scara y de hijo actual

TransparencyInterpolator

Un objeto TransparencyInterpolator tiene un NodeComponent TransparencyAttributes como su fuente. Este Interpolator cambia el valor de la transparencia del objeto fuente. M�s de un objeto visual pueden compartir un objeto TransparencyAttributes. As� pues, un TransparencyInterpolator puede afectar a m�s de un objeto visual. Tambi�n, debemos tener cuiddo con distintos modos de transparencia que pueden afectar el funcionamiento y el aspecto de representaci�n del objeto visual. Puedes refierte a la especificaci�n de Java 3d API para m�s informaci�n sobre la clase TransparencyAttributes.

Un riesgo potencial de programaci�n de TransparencyInterpolator es no agregar al objeto fuente TransparencyAttributes el manojo de aspecto del objeto visual. Esto es similar a un problema potencial de ColorInterpolator.

Sumario de Constructores de TransparencyInterpolator

Extiende: Interpolator

Esta clase define un comportamiento que modifica la transpariencia de su objeto TransparencyAttributes fuente interpolandolo linearmente entre un par de valores de transpariencia especificados (usando el valor generado por el objeto alpha).

TransparencyInterpolator(Alpha alpha, TransparencyAttributes target)

Construye un transparencyInterpolator con una fuente especificada, una transpariencia m�nima de 0.0f y una transpariencia m�xima de 1.0f.

TransparencyInterpolator(Alpha alpha, TransparencyAttributes target,
float minimumTransparency, float maximumTransparency)

Construye un nuevo objeto transparencyInterpolator que var�a al transparencia del Material fuente entre dos valores de transpariencia.

Sumario de M�todos de TransparencyInterpolator

Cada uno de estos m�todos tiene un correspondiente m�todo get sin par�metros que devuelve un valor del tipo correspondiente al par�metro del m�todo set.

void setMaximumTransparency(float transparency)

Selecciona el valor m�ximo de transpariencia para este interpolator.

void setMinimumTransparency(float transparency)

Selecciona el valor m�nimo de transpariencia para este interpolator.

void setTarget(TransparencyAttributes target)

Selecciona el objeto TransparencyAttributes fuente para este interpolator.

.�Clases PathInterpolator

Las clases PathInterpolator se diferencian de los otros Interpolator en que pueden guardar dos o m�s valores para la interpolaci�n. El coraz�n de Java 3D proporciona las clases PathInterpolator para la interpolaci�n de la posici�n, de la rotaci�n, de la traslaci�n y de la escala. La fuente de un objeto PathInterpolator es un objeto TransformGroup que cambia la posici�n, la orientaci�n, y la escala, seg�n sea apropiado, para sus objetos hijos.

Los objetos PathInterpolator almacenan un conjunto de valores, o de los nudos, que son utilizados por parejas para la interpolaci�n. El valor alpha determina que dos valores son utilizados. Los valores de nudo est�n en el rango de 0,0 a 1,0 inclusivos, que corresponde al rango de los valores del objeto alpha. El primer nudo debe tener un valor de 0,0 y el �ltimo nudo debe tener un valor de 1,0. Los nudos restantes se deben grabar en orden creciente en el objeto PathInterpolator.

Los valores del nudo corresponden con los valores para las variables de los par�metros (por ejemplo, posici�n o rotaci�n) usado en la interpolaci�n. Hay un valor de par�metro especificado para cada valor del nudo. El nudo con el mayor valor igual o menor que el valor alpha, y el nudo siguiente, ser�n utilizados. Los nudos se especifican en orden, para que en los cambios del valor alpha, se utilicen parejas adyacentes.

El panel izquierdo de la Figura 5-11 muestra los valores del nudo para un PathInterpolator de posici�n. Para prop�sitos ilustrativos, solamente se utilizan las posiciones 2D. El panel central de la figura asocia la posici�n del objeto visual sobre los valores alpha, 0,0 a 1,0. El panel derecho de la figura muestra los valores del nudo usados para los distintos valores alpha de este ejemplo. La combinaci�n de los valores del nudo y de los par�metros del alpha determinan la animaci�n.

Figura 5-11, la relaci�n entre Nudos y Valores Alpha para un ejemplo de posici�n 2D.

Aplicaci�n de Ejemplo de PathInterpolator

Usar un objeto PathInterpolator sigue la misma receta que otros objetos Interpolator. La �nica diferencia es el n�mero de valores usados para inicializar el objeto PathInterpolator

  1. crear el objeto fuente con las capacidades apropiadas
  2. crear el objeto Alpha
  3. crear arrays de nudos y otros valores
  4. crear el objeto pathInterpolator que referencia al objeto Alpha, al objeto fuente, y al array de selecciones
  5. a�adir l�mites al objeto Interpolator
  6. a�adir el objeto pathInterpolator al escenario gr�fico

El programa del ejemplo RotPosPathApp.java utiliza un objeto RotPosPathInterpolator para animar un objeto ColorCube con un n�mero de valores de posici�n y de rotaci�n. El RotPosPathInterpolator graba conjuntos de rotaciones (como un array de Quat4f), de posiciones (como un array de Point3f), y de valores de nudo (como un array de float). El fragmento de c�digo 5-2 muestra un extracto del ejemplo.

Fragmento de C�digo 5-2, un Fragmento del m�todo CreateSceneGraph de RotPosPathApp.java
1.     public BranchGroup createSceneGraph() {
2.     BranchGroup objRoot = new BranchGroup();
3.
4.     TransformGroup target = new TransformGroup(); 
5.     Alpha alpha = new Alpha(-1, 10000); 
6.     Transform3D axisOfRotPos = new Transform3D();
7.     float[] knots = {0.0f, 0.3f, 0.6f ,1.0f};
8.     Quat4f[] quats = new Quat4f[4];
9.     Point3f[] positions = new Point3f[4];
10.
11.   target.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); 
12.
13.   AxisAngle4f axis = new AxisAngle4f(1.0f,0.0f,0.0f,0.0f);
14.   axisOfRotPos.set(axis);
15.
16.   quats[0] = new Quat4f(0.0f, 1.0f, 1.0f, 0.0f);
17.   quats[1] = new Quat4f(1.0f, 0.0f, 0.0f, 0.0f);
18.   quats[2] = new Quat4f(0.0f, 1.0f, 0.0f, 0.0f);
19.
20.   positions[0]= new Point3f( 0.0f, 0.0f, -1.0f);
21.   positions[1]= new Point3f( 1.0f, -1.0f, -2.0f);
22.   positions[2]= new Point3f( -1.0f, 1.0f, -3.0f);
23.
24.   RotPosPathInterpolator rotPosPath = new RotPosPathInterpolator( 
25.               alpha, target, axisOfRotPos, knots, quats, positions);
26.   rotPosPath.setSchedulingBounds(new BoundingSphere()); 
27.
28.   objRoot.addChild(target);
29.   objRoot.addChild(rotPosPath); 
30.   target.addChild(new ColorCube(0.4));
31.
32.   return objRoot;
33. } // end of createSceneGraph method of RotPosPathApp

El fragmento de c�digo 5-2 se basa en el m�todo createSceneGraph de RotPosPathApp.java. La diferencia est� en el n�mero de nudos mostrados en el fragmento del c�digo y los usados en el programa del ejemplo. RotPosPathApp.java define nueve nudos mientras que el fragmento de c�digo 5-2 muestra solamente tres. La Figura 5-13 muestra una imagen de RotPosPathApp. En la imagen, un punto rojo se visualiza por cada uno de las nueve posiciones de nudo. Se reutiliza una de las posiciones, por eso en la figura se ven solo ocho puntos.

Figura 5-13, una escena renderizada por RotPosPathApp mostrando la interpolaci�n de la Rotaci�n y Posici�n de un ColorCube. Los puntos rojos muestras los nudos de la aplicaci�n de ejemplo.

Cuando se ejecuta el programa del ejemplo RotPosPathApp, el ColorCube se mueve desde la posici�n de nudo a otra posici�n de nudo mientras que rota para alcanzar las distintas rotaciones de nudo. Como con todos los Interpolator, la animaci�n que resulta depende de la combinaci�n de los valores del Interpolator y de los par�metros alpha usados.

Seg�n lo mencionado antes, hay una variedad de subclases de la clase de PathInterpolator. Adem�s de estas subclases en el coraz�n Java 3D, hay pares de clases relacionadas en el paquete de utilidades. La clase TCBPathSplineInterpolator es una clase similar a PathInterpolator. Tiene una subclase en el paquete de utilidades.

En el ejemplo RotPosPathApp, la animaci�n no parece natural debido a la combinaci�n de las posiciones de nudo elegidas. El ColorCube se mueve a cada posici�n de nudo especificada y tan pronto como se alcanza esa posici�n, el movimiento cambia repentinamente para alcanzar la posici�n siguiente. Esto no parece natural puesto que este tipo de acci�n no sucede en el mundo real donde todos los objetos tienen cierta inercia.

TCBPathSplineInterpolator es una clase de utilidad que proporciona comportamiento y funciones similares a las de la clase PathInterpolator, pero suaviza el camino del objeto visual bas�ndose en un tira en la posici�n del nudo. El camino de la tira imita el movimiento de objetos del mundo real. En el camino del movimiento de la tira, el objeto visual puede no pasar por todas las (o cualesquiera) posiciones especificadas de nudo. En el subdirectorio jdk1.2/demo/java3d/SplineAnim de la distribuci�n de Java 3D puedes encontrar un ejemplo de utilizaci�n de la clase Splineanim.java.

PathInterpolator

PathInterpolator es una clase abstracta que proporciona el interfaz y las funciones b�sicas a sus subclases. Los objetos PathInterpolator graban los valores de nudo y calculan el �ndice de los valores de nudo que se utilizar�n bas�ndose en el valor alpha actual.

PathInterpolator

Extiende: Interpolator

Subclases Directas Conocidas: PositionPathInterpolator, RotationPathInterpolator, RotPosPathInterpolator, RotPosScalePathInterpolator

Esta clase abstracta define la clase base para todos los PathInterpolator. Las subclases tienen acceso al m�todo para calcular currentInterpolationValue dando el tiempo actual y el valor alpha. El m�todo tambi�n calcula el currentKnotIndex, que se basa en el currentInterpolationValue. El currentInterpolationValue se calcula interpolandolo linearmente entre una serie de nudos predefinidos (que usan el valor generado por el objeto alpha especificado).

El primer nudo debe tener un valor de 0,0 y el �ltimo nudo debe tener un valor de 1,0. Un nudo intermedio con el �ndice k debe tener un valor terminantemente mayor que cualquier nudo con �ndice menor que k.

Lista Parcial de M�todos de PathInterpolator

int getArrayLengths()

Este m�todo recupera la longitud del array de nudos.

void setKnot(int index, float knot)

Este m�todos selecciona el nudo en el �ndice especificado para este interpolator.

RotPosPathInterpolator

Un objeto RotPosPathInterpolator var�a la rotaci�n y la posici�n de un objeto visual bas�ndose en un conjunto de valores de nudo. El constructor es el m�s importante de las caracter�sticas del API de esta clase. En el constructor todos los valores y objetos relacionados se especifican. Debemos tener cuidado de que cada uno de los arrays debe ser de la misma longitud en este y en todos los objetos PathInterpolator.

Sumario de Constructores de RotPosPathInterpolator

Extiende: PathInterpolator

Esta clase define un comportamiento que modifica los componentes rotacionales y de translaci�n de su TransformGroup fuente interpolandolo linearmente entre una serie de pares predefinidos de nudo/position y de nudo/orientation (que usan el valor generado por el objeto alpha especificado). La posici�n y la orientaci�n interpoladas se utilizan para generar una transformaci�n en el sistema de coordenadas local de este Interpolator.

RotPosPathInterpolator(Alpha alpha, TransformGroup target,
Transform3D axisOfRotPos, float[] knots, Quat4f[] quats,
Point3f[] positions)

Construye un nuevo interpolador que var�a la rotaci�n y la traslaci�n del TransformGroup fuente.

Sumario de M�todos de RotPosPathInterpolator

void setAxisOfRotPos(Transform3D axisOfRotPos)

Selecciona el valor del eje de rotaci�n para este interpolator.

void setPosition(int index, Point3f position)

Selecciona la posici�n del �ndice especificado para este interpolator.

void setQuat(int index, Quat4f quat)

Selecciona el "quaternion" en el �ndice especificaco para este interpolator.

void setTarget(TransformGroup target)

Selecciona el TransformGroup fuente para este interpolator.

.�La Clase Billboard

El t�rmino "cartelera" (Billboard) usado en el contexto de los gr�ficos de ordenador se refiere a la t�cnica de rotar autom�ticamente un objeto visual plano para que est� siempre de frente hacia el espectador. La motivaci�n original para el comportamiento de cartelera era permitir el uso de un plano texturado como reemplazo de bajo costo para la geometr�a compleja. El comportamiento de cartelera todav�a se utiliza com�nmente para esta aplicaci�n, pero tambi�n se utiliza para otros prop�sitos, tales como mantener la informaci�n textual visible desde cualquier �ngulo el ambiente virtual. En Java 3D, la t�cnica de cartelera se implementa en una subclase de la clase Behavior, de ah� la frase "comportamiento de cartelera" usado en la literatura de Java 3D.

La aplicaci�n cl�sica de ejemplo del comportamiento de cartelera es representar �rboles como texturas 2D. Por supuesto, si las texturas se orientan est�ticamente, cuando el espectador se mueve, la naturaleza 2D de las texturas se revela. Sin embargo, si los �rboles se reorientan de tal forma que siempre est�n paralelos a su superficie normal, aparecen como objetos 3D. Esto es especialmente cierto si los �rboles est�n en el fondo de una escena o vistos en la distancia.

.�Usar un Objeto Billboard

El comportamiento Billboard funciona con los �rboles porque los �rboles parecen b�sicamente iguales cuando se ven de frente, de la parte posterior, o de cualquier �ngulo. Puesto que el comportamiento Billboard hace que un objeto visual parezca exactamente igual cuando se ve desde cualquier �ngulo, es apropiado utilizar Billboards y las im�genes 2D para representar los objetos 3D geom�tricos que son sim�tricos sobre el eje Y tal como edificios cil�ndricos, silos de grano, torres de agua, o cualquier objeto cil�ndrico. El comportamiento Billboard tambi�n se puede utilizar para objetos no sim�tricos cuando se ven desde suficiente distancia como para ocultar los detalles 2D.

Usar un objeto Billboard es similar a usar un Interpolator excepto en que no hay un objeto alpha para conducir la animaci�n. La animaci�n del objeto Billboard la dirige su posici�n relativa al espectador en el mundo virtual. Abajo podemos ver una receta para el uso Billboard.

  1. crear un objeto TransformGroup con la capacidad ALLOW_TRANSFORM_WRITE
  2. crear un objeto Billboard que referencie al objeto fuente TransformGroup
  3. suministrar l�mites para el objeto Billboard
  4. ensamblar el escenario gr�fico

Riesgos de Programaci�n de Billboard

Aunque el uso de un objeto Billboard es directo, hay un par de potenciales errores de programaci�n. La primera cosa a observar es que el TransformGroup fuente se limpia cada vez que se actualiza. Por lo tanto, este TransformGroup no se puede utilizar para posicionar el objeto visual. Si intentamos utilizar la fuente para el posicionamiento, el Billboard funcionara, pero en la primera actualizaci�n de la rotaci�n, se perder� la informaci�n de la posici�n en la fuente y el objeto visual aparecer� en el origen.

Sin la capacidad de ALLOW_TRANSFORM_WRITE seleccionada para la fuente, obtendremos un error de tiempo de ejecuci�n. Tambi�n, si no se fijan los l�mites, o no se hace correctamente, el objeto de Billboard no animar� el objeto visual. Los l�mites se especifican t�picamente por un BoundingSphere con un radio lo bastante grande para incluir el objeto visual. Justo igual otros objetos behavior, dejar el objeto Billboard fuera del escenario g�fico lo eliminar� del mundo virtual sin ning�n error o la alerta.

Hay un problema con la clase Billboard que no puede ser superado. En aplicaciones con m�s de una vista, cada objeto Billboard animar� correctamente solamente una de las vistas. Esto es una limitaci�n en el dise�o de Java 3D y ser� tratada en una versi�n posterior.

.�Programa de Ejemplo de Billboard

El programa del ejemplo BillboardApp.java crea un mundo virtual con �rboles de un comportamiento Billboard. Aunque los �rboles se crean a lo bruto (desde las aspas de un ventilador) no parecen como objetos 2D en el fondo.

Hay objetos TransformGroup para cada �rbol en este ejemplo. Un TransformGroup, TGT, traslada simplemente el �rbol a la posici�n para la aplicaci�n. Los Transform TGT no se modifican en tiempo de ejecuci�n. El segundo TransformGroup, TGR, proporciona la rotaci�n para el �rbol. El TGR es la fuente de Billboard.

Fragmento de C�digo 5-3, Extracto del m�todo createSceneGraph de BillboardApp.java.
1.     public BranchGroup createSceneGraph(SimpleUniverse su) {
2.     BranchGroup objRoot = new BranchGroup();
3.
4.     Vector3f translate = new Vector3f();
5.     Transform3D T3D = new Transform3D();
6.     TransformGroup TGT = new TransformGroup();
7.     TransformGroup TGR = new TransformGroup();
8.     Billboard billboard = null;
9.     BoundingSphere bSphere = new BoundingSphere();
10.
11.   translate.set(new Point3f(1.0f, 1.0f, 0.0f));
12.   T3D.setTranslation(translate);
13.   TGT.set(T3D);
14.
15.   // set up for billboard behavior
16.   TGR.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
17.   billboard = new Billboard(TGR);
18.   billboard.setSchedulingBounds(bSphere);
19.
20.   // assemble scene graph
21.   objRoot.addChild(TGT);
22.   objRoot.addChild(billboard); 
23.   TGT.addChild(TGR);
24.   TGR.addChild(createTree());
25.
26.   // add KeyNavigatorBehavior(vpTrans) code removed;
27.
28.   return objRoot;
29.   } // end of CreateSceneGraph method of BillboardApp

La Figura 5-15 muestra el diagrama del escenario gr�fico de los objetos ensamblados en el Fragmento de C�digo 5-3.

Figura 5-15, Diagrama del Escenario Gr�fico que Usa un Objeto Billboard Creado en el Fragmento de Codigo 5-3.

La Figura 5-16 muestra una imagen renderizada del programa del ejemplo BillboardApp.java. El Fragmento de C�digo 5-3 muestra el c�digo para colocar un �rbol animado Billboard en un mundo virtual. El programa de BillboardApp coloca varios �rboles en el paisaje virtual que es por lo que se ven cuatro �rboles en la Figura 5-16.

Figura 5-16, Imagen de BillboardApp con '�rboles' 2D de cara al Espectador.

El programa de ejemplo BillboardApp proporciona un KeyNavigatorBehavior de modo que el espectador pueda moverse alrededor y observar los �rboles desde varias posiciones y orientaciones.

.�El API Billboard

El ejemplo muestra el uso del valor por defecto del objeto Billboard, que es rotar sobre un eje. En este modo de valor por defecto, el objeto visual se rotar� solamente sobre el eje Y. As� pues, si los �rboles en el programa BillboardApp se ven desde arriba o desde abajo, su geometr�a 2D ser�a revelada.

El modo alternativo es rotar alrededor de un punto. En este modo, la rotaci�n ser�a alrededor de un punto tal que el objeto visual se vea siempre orthogonalmente desde cualquier posici�n de la vista. Es decir nunca ser� obvio que el objeto visual es de dos dimensiones. Una aplicaci�n posible es representar la luna, u otros objetos esf�ricos distantes como c�rculos. Los objetos esf�ricos aparecen como c�rculos cuando se ven desde cualquier �ngulo.

Sumario de Constructores de Billboard

Extiende: Behavior

El nodo de comportamiento Billboard funciona sobre el nodo TransformGroup para hacer que el eje local +z del TransformGroup apunte a la posici�n del ojo del espectador. Esto se hace sin importar las transformaciones sobre el nodo TransformGroup especificado en el escenario gr�fico. Los nodos Billboard proporcionan a la mayor�a de las ventajas para los objetos complejos, �speros-sim�tricos. Un uso t�pico puede consistir en un cuadril�tero texturado con la imagen de un �rbol.

Billboard()

Construye un nodo Billboard con los par�metros por defecto: mode = ROTATE_ABOUT_AXIS, axis =(0,1,0).

Billboard(TransformGroup tg)

Construye un nodo Billboard con los par�metros por defecto que opera sobre el nodo TransformGroup especificado.

Billboard(TransformGroup tg, int mode, Vector3f axis)

Construye un nodo Billboard con el eje y el modo especificados que opera sobre el nodo TransformGroup especificado.
Puedes ver el m�todo setMode() para una explicaci�n del par�metro mode.

Billboard(TransformGroup tg, int mode, Point3f point)

Construye un nodo Billboard con el punto de rotaci�n especificado y el modo que opera sobre el nodo TransformGroup especificado.
Puedes ver el m�todo setMode() para una explicaci�n del par�metro mode.

Lista Parcial de M�todos de Billboard

void setAlignmentAxis(Vector3f axis)

Selecciona el eje de alineamiento.

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

Selecciona el eje de alineamiento.

void setAlignmentMode(int mode)

Selecciona el modo de alineamiento, donde mode es uno de:

  • ROTATE_ABOUT_AXIS - Especifica qu� rotaci�n deber�a sobre el eje especificado.
  • ROTATE_ABOUT_POINT - Especifica qu� rotaci�n dener�a ser sobre el punto especificado y cual de los ejes Y del hijo deber�a corresponder con el eje Y de la vista del objeto.
void setRotationPoint(Point3f point)

Selecciona el punto de rotaci�n.

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

Selecciona el punto de rotaci�n.

void setTarget(TransformGroup tg)

Selecciona el objeto TransformGroup fuente para este objeto Billboard.

.�Animaciones de Nivel de Detalle (LOD)

El nivel del detalle (LOD) es un t�rmino general para una t�cnica que var�a la cantidad de detalle en un objeto visual bas�ndose en un cierto valor del mundo virtual. La aplicaci�n t�pica es variar el nivel del detalle bas�ndose en la distancia al espectador. Cuanto mayor sea la distancia a un objeto visual, menos detalles aparecer�n en la representaci�n. As� pues, la reducci�n de la complejidad del objeto visual puede no afectar el resultado visual. Sin embargo, disminuir la cantidad de detalle en el objeto visual cuando est� lejos del espectador reduce la cantidad de c�lculo de renderizado. Si se hace bien, el ahorro de c�lculos es significativo y se pueden hacer sin la p�rdida de contenido visual.

La clase DistanceLOD proporciona comportamiento LOD basado en la distancia al espectador. Otras aplicaciones posibles de LOD incluyen variar el nivel del detalle bas�ndose en la velocidad de representaci�n (marcos por segundo) con la esperanza de mantener un ratio m�nimo de marcos, la velocidad del objeto visual, o el nivel del detalle se podr�a controlar por las configuraciones del usuario.

Todo objeto LOD tiene uno o m�s objetos Switch como fuente. Seg�n lo mencionado antes, un objeto Switch es un group especial que incluye cero, uno, o m�s, de sus hijos en el escenario gr�fico para renderizar. Con un objeto DistanceLOD, la selecci�n del hijo del objeto Switch fuente se controla por la distancia del objeto DistanceLOD a la vista basada en un conjunto de distancias de umbral.

Las distancias de umbral se especifican en un arrray que comienza con la distancia m�xima que utilizar� el primer hijo del Switch fuente. El primer hijo t�picamente es el objeto visual m�s detallado. Cuando la distancia del objeto DistanceLOD a la vista es mayor que este primer umbral, se utiliza el segundo hijo de Switch. Cada umbral siguiente de la distancia debe ser mayor que el anterior y especifica la distancia en la cual se utiliza el hijo siguiente del Switch fuente.

Si se agrega m�s de un Switch como fuente del objeto LOD, cada Switch fuente se utiliza en paralelo. Es decir, seleccionan al hijo del mismo �ndice simult�neamente para cada uno de los Switch fuente. De esta manera, un objeto visual complejo puede ser representado por objetos geom�tricos m�ltiples que son hijos de diversos nodos Switch.

.�Usar un Objeto DistanceLOD

Usar un objeto DistanceLOD es similar a usar un Interpolator excepto en que no hay un objeto alpha para conducir la animaci�n. La animaci�n del objeto LOD la dirige su distancia relativa a la vista en el mundo virtual; de esta manera usar un objeto DistanceLOD es muy similar a usar un objeto Billboard. Usar un objeto de DistanceLOD tambi�n requiere fijar las distancias del umbral. Abajo tenemos uns receta que nos muestra los pasos para usar un LOD.

  1. crear un objeto Switch fuente con la capacidad ALLOW_SWITCH_WRITE
  2. crear un array de distancias de umbral para el objeto DistanceLOD
  3. crear el objeto DistanceLOD usando el array de distancias de umbral
  4. seleccionar el objeto Switch fuente para el objeto DistanceLOD
  5. suministrar l�mites para el objeto DistanceLOD
  6. ensamblar el escenario gr�fico, incluyendo la adici�n de hijos al objeto Switch fuente

Riesgos de Programaci�n de LOD

Incluso aunque que el uso de un objeto LOD es directo, hay un par de potenciales errores de programaci�n. El error m�s com�n es no incluir el objeto Switch fuente en el escenario gr�fico. Fijar el objeto Switch como la fuente del objeto DistanceLOD no lo incluye autom�ticamente en el escenario gr�fico.

Sin la capacidad ALLOW_SWITCH_WRITE fijada para el objeto Switch fuente, se generar� un error en tiempo de ejecuci�n. Tambi�n, si no se fijan los l�mites, o no se hace correctamente, el objeto LOD no animar� el objeto visual. Los l�mites se especifican t�picamente con un BoundingSphere con un radio lo bastante grande como para incluir el objeto visual. Igual que con otros objetos behavior, dejar el objeto LOD fuera del escenario gr�fico lo eliminar� del mundo virtual sin ning�n error o alerta.

Hay un problema con las clases de LOD que no puede ser superada. Igual que con aplicaciones de Billboard, en las aplicaciones que tienen m�s de una vista, el objeto LOD animar� correctamente s�lo una de ellas.

.�Ejemplo de uso de DistanceLOD

El Fragmento de C�digo 5-4 muestra un extracto del m�todo createSceneGraph de DistanceLODApp.java.

Fragmento de C�digo 5-4, Extracto del m�todo createSceneGraph en DistanceLODApp.
1.     public BranchGroup createSceneGraph() {
2.     BranchGroup objRoot = new BranchGroup();
3.     BoundingSphere bounds = new BoundingSphere();
4.
5.     // create target TransformGroup with Capabilities
6.     TransformGroup objMove = new TransformGroup();
7.
8.     // create DistanceLOD target object
9.     Switch targetSwitch = new Switch();
10.   targetSwitch.setCapability(Switch.ALLOW_SWITCH_WRITE);
11.
12.   // add visual objects to the target switch 
13.   targetSwitch.addChild(new Sphere(.40f, 0, 25));
14.   targetSwitch.addChild(new Sphere(.40f, 0, 15));
15.   targetSwitch.addChild(new Sphere(.40f, 0, 10));
16.   targetSwitch.addChild(new Sphere(.40f, 0, 4));
17.
18.   // create DistanceLOD object
19.   float[] distances = { 5.0f, 10.0f, 20.0f};
20.   DistanceLOD dLOD = new DistanceLOD(distances, new Point3f());
21.   dLOD.addSwitch(targetSwitch); 
22.   dLOD.setSchedulingBounds(bounds);
23.
24.   // assemble scene graph 
25.   objRoot.addChild(objMove);
26.   objMove.addChild(dLOD); // make the bounds move with object
27.   objMove.addChild(targetSwitch); // must add switch to scene graph
28.
29.   return objRoot;
30. } // end of CreateSceneGraph method of DistanceLODApp

La Figura 5-18 muestra el diagrama del escenario gr�fico creado en el fragmento de c�digo 5-4. Observa que el objeto Switch fuente es hijo de un objeto TransformGroup y es referido por el objeto DistanceLOD. Ambos lazos son necesarios.

Figura 5-18, Diagrama Parcial del Escenario Gr�fico del Programa DistanceLODApp.

La Figura 5-19 muestra dos escenas renderizadas por DistanceLODApp. Cada escena tiene dos esferas est�ticas y una esfera que se mueve. (en la escena derecha, se oculta la esfera de la izquierda.) La esfera m�vil se representa por un objeto DistanceLOD con cuatro esferas de distinta complejidad geom�trica. La esfera peque�a verde es la esfera m�s detallada usada por el objeto DistanceLOD en la distancia m�xima. La esfera grande roja es la menos detallada del objeto DistanceLOD en la distancia m�nima. Las dos esferas est�ticas se incluyen para prop�sitos de comparaci�n.

En esta aplicaci�n el objeto DistanceLOD se representa por diversas esferas de color para ilustrar la conmutaci�n. Cada objeto visual usado por un objeto LOD deber�a parecer tan normal como sea apropiado.

Se utiliza un PositionInterpolator para mover el objeto DistanceLOD hacia adelante y hacia atr�s en la escena. Cuanto m�s lejos de la vista se mueva el objeto DistanceLOD, m�s cambiaran los objetos visuales. Sin el cambio del color en esta aplicaci�n, no ser�a f�cil decir cu�ndo ocurre la conmutaci�n.

Figura 5-19, Dos escenas Renderizadas desde DistanceLODApp.

En la pr�ctica, normalmente necesitaremos experimentar con las distancias de umbral y las distintas representaciones para conseguir los efectos visuales deseados.

.�El API DistanceLOD

En Java 3D, la clase LOD proporciona las funciones b�sicas para todas las aplicaciones LOD. La clase DistanceLOD extiende la clase LOD para agregar c�lculos 'Switch seg�n la distancia al espectador '. Varios m�todos de la clase LOD son necesarios para el uso de un objeto DistanceLOD.

Sumario de Constructores de DistanceLOD

Esta clase define un nodo de comportamiento basado en la distancia que funciona sobre un nodo Switch para seleccionar uno de los hijos de ese nodo Switch bas�ndose en la distancia de este nodo LOD hasta el espectador. Un array de n elementos que aumenta monot�nicamente seg�n la distancia especificada, tal que distances[0 ] est� asociada al nivel m�s alto de detalle y distances[n-1 ] est� asociado al nivel m�s bajo de detalle. De acuerdo con la distancia real desde el espectador a este nodo DistanceLOD, estos valores de la distancia de n [ 0, n-1 ] seleccionan entre de los niveles n+1 de detalle [ 0, n ]. Si d es la distancia del espectador al nodo de LOD, entonces la ecuaci�n para determinar el nivel del detalle (hijo del nodo Switch) seleccionado es:

0, if d <= distances[0]
i, if distances[i-1] < d <= distances[i]
n, if d > distances[n-1]

Observa que tanto la posici�n como el array de distancias est�n especificados en el sistema de coordenadas local de este nodo.

DistanceLOD()

Construye e inicializa un nodo DistanceLOD con los valores por defecto.

DistanceLOD(float[] distances)

Construye e inicializa un nodo DistanceLOD con el array de distancias especificado y la posici�n por defecto de (0,0,0).

DistanceLOD(float[] distances, Point3f position)

Construye e inicializa un nodo DistanceLOD con el array de distancias y la posici�n especificados.

Sumario de M�todos de DistanceLOD

int numDistances()

Devuelve un contador del n�mero de par�metros de distancia del LOD.

void setDistance(int whichDistance, double distance)

Selecciona una distancia de umbral particular.

void setPosition(Point3f position)

Selecciona la posici�n de este nodo LOD.

.�API de LOD (Level of Detail)

Como clase abstracta, la clase LOD no se utiliza directamente en los programas de Java 3D. Los m�todos de la clase LOD se utilizan para manejar el objeto Switch fuente de un objeto DistanceLOD. Tambi�n, otras aplicaciones de LOD pod�an crearse extendiendo esta clase seg�n sea apropiado.

Sumario de Constructores de LOD

Un nodo hoja LOD es una clase de comportamiento abstracto que opera sobre una lista de nodos Switch para seleccionar uno de los hijos de los nodos Switch. La clase LOD se extiende para implentar distintos crierios de selecci�n.

LOD()

Construye e inicializa un nodo LOD.

Sumario de M�todos de LOD

void addSwitch(Switch switchNode)

A�ade el switch especificado a la lista de switches de este nodo LOD.

java.util.Enumeration getAllSwitches()

Devuelve el objeto enumeration de todos los switches.

void insertSwitch(Switch switchNode, int index)

Inserta el nodo switch especificado en el �ndice especificado.

int numSwitches()

Devuelve un contador de switches de este LOD.

void removeSwitch(int index)

Elimina el nodo switch del �ndice especificado.

void setSwitch(Switch switchNode, int index)

Reemplaza el nodo switch especificado con el nodo switch proporcionado.

.�Morph

Las clases Interpolator modifican varios atributos visuales del mundo virtual. Sin embargo, no hay un Interpolator para cambiar la geometr�a de un objeto visual. Esto es exactamente lo que hace la clase Morph. Un objeto Morph crea la geometr�a para un objeto visual con la interpolaci�n de un conjunto de objetos GeometryArray. De esta forma la clase Morph es como las clases Interpolator. Pero, Morph no es un Interpolator; no es ni siquiera una extensi�n de la clase Behavior. La clase Morph extiende la clase Node.

El Cap�tulo 4 explica que todos los cambios en una escena viva o los objetos en un gr�fico vivo de la escena se hacen normalmente con el m�todo processStimulus de los objetos Behavior. Puesto que no hay una clase espec�fica de comportamiento para el uso con un objeto Morph, se debe escribir un clase personalizada para aplicarla con Morph. Si la clase Morph se considera una clase de animaci�n o de interacci�n depende del est�mulo para el comportamiento que diriga el objeto Morph.

Los objetos Morph se pueden utilizar para convertir las pir�mides en cubos, gatos en perros, o cambiar cualquier geometr�a en cualquier otra geometr�a. La �nica limitaci�n es que los objetos de la geometr�a usados para la interpolaci�n sean de la misma clase, una subclase de GeometryArray, y con el mismo n�mero de v�rtices. La restricci�n en el n�mero de v�rtices no es un l�mite como parece a primera vista. En el Java 3D se distibuye un programa de ejemplo que convierte una pir�mide en un cubo, Pyramid2Cube.java.

Los objetos Morph tambi�n se pueden utilizar para animar un objeto visual (por ejemplo., hacer que una persona corra). En el API Java 3D tambi�n puedes encontrar un programa que anima una mano, Morphing.java. Un tercer ejemplo de Morph que hace caminar a una figura de alambre es el tema de la secci�n siguiente.

.�Usar un Objeto Morph

Entender el uso del objeto de Morph requiere saber c�mo funcionan los objetos Morph. Afortunadamente, un objeto Morph no es muy complejo. Un objeto Morph graba un array de objetos GeometryArray. Podemos recordar del Cap�tulo 2 que GeometryArray es la superclase de TriangleArray, de QuadStripArray, de IndexedLineStripArray, y de TriangleFanArray (entre otros muchos).

El GeometryArray individual define completamente una especificaci�n geom�trica completa para el objeto visual incluyendo color, superficies normales, y coordenadas de la textura. Los objetos GeometryArray se pueden imaginar como marcos de una animaci�n, o m�s correctamente, como las constantes en una ecuaci�n para crear un nuevo objeto GeometryArray.

Adem�s del array de objetos GeometryArray, un objeto Morph tiene un array de valores del peso- �stas son las variables en la ecuaci�n. Usando el GeometryArray y los pesos, un objeto Morph construye un nuevo objeto geometr�a usando el promedio de las coordenadas, el color, las superficies normales, y la informaci�n de coordenadas de la textura de los objetos de GeometryArray. Modificar los pesos cambia la geometr�a resultante.

Todo lo que se requiere para utilizar un objeto Morph es crear el array de objetos GeometryArray y fijar los valores de carga. Abajo podemos ver una receta para usar un objeto Morph.

  1. crear un array de objetos GeometryArray
  2. crear un objeto Morph con ALLOW_WEIGHTS_WRITE
  3. ensamblar el escenario gr�fico, incluyendo la adici�n de los hijos de los objetos Switch fuentes

Como se puede ver, usar un objeto Morph no es duro; sin embargo, estos pasos de la receta no proporcionan ni animaci�n ni interacci�n. La animaci�n o la interacci�n se proporciona a trav�s de un objeto Behavior. Por lo tanto, usar un objeto Morph significa generalmente escribir una clase Behavior.

Un objeto Morph se puede referir a un paquete de aspecto. El manojo de aspecto se utiliza con el objeto GeometryArray creado por el objeto Morph. Debemos tener cuidado ya que el objeto Morph crea siempre un objeto GeometryArray con colores-por-vertice. Por consiguiente, se ignorar�n las especificaciones de ColoringAttributes y de color difuso de Material. Puedes ver el Cap�tulo 6 para m�s informaci�n sobre colorear y sombrear objetos visuales.

Riesgos de Programaci�n de Morph

Incluso tan simple como es el uso de Morph, hay un riesgo potencial de programaci�n asociado (no mencionado todav�a). Pesos que no suman 1,0 resultan en un error en tiempo de ejecuci�n. Ya hemos mencionado la limitaci�n del aspecto.

.�Ejemplo de Aplicaci�n Morph: Walking

Esta aplicaci�n de Morph utiliza un objeto Behavior personalizado para proporcionar la animaci�n. El primer paso de la receta es escribir el comportamiento personalizado.

En un comportamiento usado para animar un objeto Morph, el m�todo processStimulus cambia los pesos del objeto Morph. Este proceso es solo tan complejo como necesario para alcanzar el efecto deseado de la animaci�n o de la interacci�n. En este programa, el m�todo processStimulus fija los valores de los pesos bas�ndose en el valor de un objeto alpha. Esto sucede en cada marco de renderizado donde la condici�n del disparador se ha cumplido. El Fragmento de C�digo 5-5 demuestra el c�digo para el comportamiento de personalizado del programa MorphApp.java. En este c�digo, solamente el m�todo processStimulus es interesante.

Fragmento de C�digo 5-5, Clase MorphBehavior de MorphApp.
1.     public class MorphBehavior extends Behavior{
2.
3.     private Morph targetMorph;
4.     private Alpha alpha;
5.     // the following two members are here for efficiency
6.     private double[] weights = {0, 0, 0, 0};
7.     private WakeupCondition trigger = new WakeupOnElapsedFrames(0);
8.
9.     // create MorphBehavior
10.   MorphBehavior(Morph targetMorph, Alpha alpha){
11.   this.targetMorph = targetMorph;
12.   this.alpha = alpha;
13.   }
14.
15.   public void initialize(){
16.   // set initial wakeup condition
17.   this.wakeupOn(trigger);
18.   }
19.
20.   public void processStimulus(Enumeration criteria){
21.   // don't need to decode event since there is only one trigger
22.   weights[0] = 0; weights[1] = 0; weights[2] = 0; weights[3] = 0;
23.
24.   float alphaValue = 4f * alpha.value(); // get alpha
25.   int alphaIndex = (int) alphaValue; // which Geom obj
26.   weights[alphaIndex] = (double) alphaValue - (double)alphaIndex;
27.   if(alphaIndex < 3) // which other obj
28.   weights[alphaIndex + 1] = 1.0 - weights[alphaIndex];
29.   else
30.   weights[0] = 1.0 - weights[alphaIndex];
31.
32.   targetMorph.setWeights(weights);
33.
34.   this.wakeupOn(trigger); // set next wakeup condition
35.   }
36. } // end of class MorphBehavior

La clase MorphBehavior crea una animaci�n de marcos usando dos objetos GeometryArray al mismo tiempo en un modelo c�clico. Esta clase es conveniente para cualquier animaci�n de morph de cuatro marcos y se puede modificar f�cilmente para acomodar otro n�mero de marcos.

Con el comportamiento personalizado escrito, todo que lo resta es desarrollar los marcos para la animaci�n. La Figura 5-21 muestra los dibujos a mano usados como los marcos para esta aplicaci�n de ejemplo. Se podr�an haber creado mejores marcos usando alg�n paquete 3D.

Figura 5-21, Im�genes para la aplicaci�n MorphApp con el Trazo de un v�rtice.

Las figuras negras pueden parecer dos marcos, cada uno repetido una vez, pero en realidad, son cuatro marcos �nicos. La diferencia est� en el orden que se especifican los v�rtcies.

El Fragmento de C�digo 5-6 presenta un extracto del m�todo createSceneGraph. En este m�todo se crean un objeto MorphBehavior, el objeto alpha, y un objeto Morph y se ensamblan en el escenario gr�fico. Se crean los objetos del marco GeometryArray usando algunos otros m�todos (no mostrados aqu�). El c�digo completo lo tienes en MorphApp.java.

Fragmento de C�digo 5-6, un extracto del m�todo createSceneGraph de MorphApp.
1.     public BranchGroup createSceneGraph() {
2.     // Create the root of the branch graph
3.     BranchGroup objRoot = new BranchGroup();
4.
5.     Transform3D t3d = new Transform3D();
6.     t3d.set(new Vector3f(0f, -0.5f, 0f));
7.     TransformGroup translate = new TransformGroup(t3d);
8.
9.     // create GeometryArray[] (array of GeometryArray objects)
10.   GeometryArray[] geomArray = new GeometryArray[4];
11.   geomArray[0] = createGeomArray0();
12.   geomArray[1] = createGeomArray1();
13.   geomArray[2] = createGeomArray2();
14.   geomArray[3] = createGeomArray3();
15.
16.   // create morph object
17.   Morph morphObj = new Morph(geomArray);
18.   morphObj.setCapability(Morph.ALLOW_WEIGHTS_WRITE);
19.
20.   // create alpha object
21.   Alpha alpha = new Alpha(-1, 2000); // continuous 2 sec. period
22.   alpha.setIncreasingAlphaRampDuration(100);
23.
24.   // create morph driving behavior
25.   MorphBehavior morphBehav = new MorphBehavior(morphObj, alpha);
26.   morphBehav.setSchedulingBounds(new BoundingSphere());
27.
28.   //assemble scene graph
29.   objRoot.addChild(translate);
30.   translate.addChild(morphObj);
31.   objRoot.addChild(morphBehav);
32.
33.   return objRoot;
34. } // end of CreateSceneGraph method of MorphApp

Es interesante observar que son posibles varias animaciones con los marcos creados para esta aplicaci�n del ejemplo con diversas clases de comportamiento. La Figura 5-22 muestra una escena renderizada por Morph3App.

En este programa, otras tres clases de comportamiento crean animaciones basadas en alguno, o todos los objetos GeometryArray de MorphApp. Se llaman (de izquierda a derecha en la figura) "In Place", "Tango", y "Broken". No todas las animaciones son buenas. Por supuesto, para apreciar de verdad las animaciones, tenemos que ejecutar el programa.

Figura 5-22, una escena renderizada desde Morph3App mostrando las animaciones de tres clases de comportamientos alternativas (no todas buenas).

.�El API Morph

Con la simplicidad de uso de la receta anterior, podr�amos esperar un API sencillo -- y as� es.

Sumario de Constructores de Morph

Extiende: Node

Los objetos Morph crean un nuevo objeto GeometryArray usando el promedio de peso de los objetos GeometryArray. Si se proporciona un objeto de apariencia, se utiliza con la geometr�a resultante. Los pesos se especifican con el m�todo setWeights. Un objeto Morph se utiliza generalmente con un objeto Behavior personalizado para ajustar los pesos en el tiempo de ejecuci�n para proporcionar la animaci�n (o la interacci�n).

Morph(GeometryArray[] geometryArrays)

Construye e inicializa un objeto Morph con el array de objetos GeometryArray especificado y un objeto Appearance null.

Morph(GeometryArray[] geometryArrays, Appearance appearance)

Construye e inicializa un objeto Morph con el array de objetos GeometryArray especificado y el objeto de apariencia especificado.

Lista Parcial de M�todos de Morph

void setAppearance(Appearance appearance)

Selecciona el componente de apariencia de este nodo Morph.

void setGeometryArrays(GeometryArray[] geometryArrays)

Selecciona el componente geometryArrays de este nodo Morph.

void setWeights(double[] weights)

Selecciona el vector de pesos de ese nodo Morph.

Sumario de Capacidades de Morph

ALLOW_APPEARANCE_READ | WRITE

Especfica que el nodo permite el acceso de lectura/escritura a su informaci�n de apariencia.

ALLOW_GEOMETRY_ARRAY_READ | WRITE

Especfica que el nodo permite el acceso de lectura/escritura a su informaci�n de geometr�a.

ALLOW_WEIGHTS_READ | WRITE

Especfica que el nodo permite el acceso de lectura/escritura a su vector de pesos.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO