Java 3D

Todo programa Java 3D est�, al menos, parcialmente ensamblado por objetos del �rbol de clases Java 3D. Esta colecci�n de objetos describe un universo virtual, que va a ser renderizado. El API define unas 100 clases presentadas en el paquete javax.media.j3d

Hay cientos de campos y m�todos en las clases del API Java 3D. Sin embargo, un sencillo universo virtual que incluya animaci�n puede construirse con unas pocas clases. Este cap�tulo describe un conjunto m�nimo de objetos y sus interacciones para renderizar un universo virtual.

Esta p�gina incluye el desarrollo de un sencillo pero completo programa Java 3D, llamado HelloJava3Dd.java, que muestra un cubo giratorio. El programa de ejemplo se desarrolla de forma incremental, y se presenta en varias versiones, para demostrar cada parte del proceso de programaci�n Java 3D.

Adem�s del paquete coraz�n de Java 3D, se usan otros paquetes para escribir programas Java 3D. Uno de estos paques es com.sun.j3d.utils el que normalmente se referiere como clases de utilidades de Java 3D. El paquete de las clases coraz�n incluye s�lo las clases de menor nivel necesarias en la programaci�n Java 3D.

Las clases de utilidades son adiciones convenientes y poderosas al coraz�n. Estas clases se dividen en cuatro categor�as: cargadores de contenidos, ayudas a la construcci�n del escenario gr�fico, clases de geometr�a y utilidades de conveniencia.

Al utilizar las clases de utilidades se reduce significativamente el n�mero de l�neas de c�digo en un programa Java 3D. Adem�s de las clases de los paquetes coraz�n y de utilidades de Java 3D, todo programa 3D usa clases de los paquetes java.awt y javax.vecmath. El paquete java.awt define el "Abstract Windowing Toolkit" (AWT). Las clases AWT crean una ventana para mostrar el renderizado. El paquete javax.vecmath define clases de vectores matem�ticos para puntos, vectores, matrices y otros objetos matem�ticos.

En el resto del texto, el t�rmino objeto visual se utilizar� para referirnos a un "objeto del escenario gr�fico" (por ejemplo, un cubo o una esfera). El t�rmino objeto s�lo se usar� para referirse a un ejemplar de una clase. El t�rmino contenido se usar� para referirnos a objetos visuales en un escenario gr�fico como un todo.

.�Construir un Escenario Gr�fico

Un universo virtual Java 3D se crea desde un escenario gr�fico. Un escenario gr�fico se crea usando ejemplares de clases Java 3D. El escenario gr�fico est� ensamblado desde objetos que definen la geometr�a, los sonidos, las luces, la localizaci�n, la orientaci�n y la apariencia de los objetos visuales y sonoros.

Una definici�n com�n de un escenario gr�fico es una estructura de datos compuesta de nodos y arcos. Un nodo es un elemento dato y un arco es una relaci�n entre elementos datos. Los nodos en un escenario gr�fico son los ejemplares de las clases Java 3D. Los arcos representan dos tipos de relaciones entre ejemplares Java 3D.

La relaci�n m�s com�n es padre-hijo. Un nodo Group puede tener cualquier n�mero de hijos, pero s�lo un padre. Un nodo hoja s�lo puede tener un padre y no puede tener hijos. La otra relaci�n es una referencia. Una referencia asocia un objeto NodeComponent con un nodo del escenario gr�fico. Los objetos NodeComponent definen la geometr�a y los atributos de apariencia usados para renderizar los objetos visuales.

Un escenario gr�fico Java 3D est� construido de objetos nodos con relaciones padre-hijo formando una estructura de �rbol. En una estructura de �rbol, un nodo es el ra�z. Se peude acceder a otros nodos siguiendo los arcos desde el ra�z. Los nodos de un �rbol no forman bucles. Un escenario gr�fico est� formado desde los �rboles con ra�ces en los objetos Locale. Los NodeComponents y las referencias a arcos no forman parte del escenario gr�fico.

S�lo existe un camino desde la ra�z de un �rbol a cada una de las hojas; por lo tanto, s�lo hay un camino desde la ra�z hasta el escenario gr�fico de cada nodo hoja. El camino desde la ra�z de un escenario gr�fico hasta una hoja especificada es el camino al escenario gr�fico del nodo hoja. Como un camino de un escenario gr�fico trata exactamente con un sola hoja, hay un camino de escenario gr�fico para cada hoja en el escenario.

Todo camino de escenario gr�fico en un escenario gr�fico Java 3D especifica completamente la informaci�n de estado de su hoja. Esta informaci�n incluye, la localizaci�n, la orientaci�n y el tama�o del objeto visual. Consecuentemente, los atributos visuales de cada objeto visual dependen s�lo de su camino de escenario gr�fico. El renderizador Java 3D se aprovecha de este echo y renderiza las hojas en el orden que �l determina m�s eficiente. El programador Java 3D normalmente no tiene control sobre el orden de renderizado de los objetos.

Las representaciones gr�ficas de un escenario gr�fico pueden servir como herramienta de dise�o y/o documentaci�n para los programas Java 3D. Los escenarios gr�ficos se dibujan usando s�mbolos gr�ficos est�ndards como se ve en la Figura 1-1. Los programas Java 3D podr�an tener m�s objetos que los que hay en su escenerio gr�fico.

Para dise�ar un universo virtual Java 3D se dibuja un escenario gr�fico usando un conjunto de s�mbolos est�ndard. Despu�s de completar el dise�o, este escenerio gr�fico es la especificaci�n para el programa. Despu�s de completar el programa, el mismo escenario gr�fico es una representaci�n concisa del programa (asumiendo que se sigui� la especificaci�n).

Figura 1-1. S�mbolos que Representan Objetos en un Escenario Gr�fico

Cada uno de los s�mbolos mostrados al lado izquierdo de la Figura 1.1 representa un s�lo objeto cuando se usa en un escenario gr�fico. Los dos primeros s�mbolos representan objetos de clases espec�ficas: VirtualUniverse y Locale. Lo siguientes tres s�mbolos de la izquierda representan objetos de las clases Group, Leaf, y NodeComponent. Estos tres s�mbolos normalmente tienen anotaciones para indicar la subclase del objeto espec�fico. El �ltimo s�mbolo se usa para representar otras clases de objetos.

El s�mbolo de la flecha s�lida representa una relaci�n padre-hijo entre dos objetos. La flecha punteada es una referencia a otro objeto. Los objetos referenciados pueden ser compartidos entre diferentes ramas de una escenario gr�fico. En la Figura 1-2, podemos ver un sencillo escenario gr�fico:

Figura 1-2. Primer Ejemplo de Escenario Gr�fico

Es posible crear un escenario gr�fico ilegal. Podemos ver uno en la Figura 1-3. Este escenario es ilegal porque viola las propiedades de un DAG. El problema son los dos objetos TransformGroup que tienen al mismo objeto Shape3D como hijo. Recuerda que una hoja s�lo puede tener un padre. En otras palabras, s�lo puede haber un camino desde el objeto Locale hasta la hoja (o un camino desde la hoja hasta el objeto Loale).

Podr�amos pensar que la estructura mostrada en la figura 1-3 define tres objetos visuales en un universo virtual. Pero el escenario gr�fico define dos objetos visuales que re-usan el objeto visual (Shape3D) del lado derecho de la figura. Conceptualmente, cada objeto TransformGroup que apadrina al ejemplar compartido de Shape3D podr�a situar una imagen en el objeto visual en diferentes localizaciones. Sin embargo, es un escenario gr�fico ilegal porque el arco padre-hijo no forma un �rbol. En este ejemplo, el resultado es que el objeto Shape3D tiene m�s de un padre.

Las explicaciones del �rbol y de las estructuras DAG son correctas. Sin embargo, el sistema de ejecuci�n Java 3D reporta el error en t�rminos de la relaci�n hijo-padre. Un resultado de la limitaci�n de la estructura de �rbol es que cada objeto Shape3D est� limitado a un s�lo padre. Para el ejemplo de la Figura 1-3, se lanzar� una excepci�n 'multiple parent' en el momento de la ejecuci�n. La Figura 1-4, con un padre para cada objeto Shape3D, muestra una posible soluci�n para este escenario gr�fico.

Figura 1-3. Un Escenario Gr�fico Ilegal

Un programa Java 3D que define un escenario gr�fico ilegal podr�a compilarse, pero no se renderiza. Cuando se ejecuta un programa Java 3D que define un escenario gr�fico ilegal, el sistema Java 3D detecta el problema y lanza una excepci�n. El programa podr�a est�r ejecutandose y consecuentemente deber�amos pararlo. Sin embargo, no se renderizar� ninguna imagen.

Figura 1-4. Posible soluci�n al escenario gr�fico ilegal de la Figura 1-3

Cada escenario gr�fico tiene un s�lo VirtualUniverse. Este objeto tiene una lista de objetos Locale. Un objeto Locale proporciona una referencia a un punto en el universo virtual. Podemos pensar en los objetos Locale como marcas de tierra que determinan la localizaci�n de los objetos visuales en el universo virtual.

Es t�cnicamente posible para un programa Java 3D tener m�s de un objeto VirtualUniverse, y as� definir m�s de un universo virtual. Sin embargo, no hay ninguna forma de comunicaci�n entre los universos virtuales. Adem�s, un objeto de un escenario gr�fico no puede existir en m�s de un universo virtual. Es altamente recomendable usar uno y s�lo un ejemplar de VirtualUniverse en cada programa Java 3D.

Mientras que un objeto VirtualUniverse podr�a referenciar muchos objetos Locale, la mayor�a de los programas Java 3D tiene un s�lo objeto Locale. Cada objetoLocale puede servir de ra�z para varios sub-gr�ficos del escenario gr�fico. Por ejemplo, si nos referimos a la Figura 1-2 podremos observar las dos ramas sub-gr�ficas que salen desde el objeto Locale.

Un objeto BranchGroup es la ra�z de un sub-gr�fico, o rama gr�fica. Hay dos categorias de escenarios sub-gr�ficos: la rama de vista gr�fica y la rama de contenido gr�fico. La rama de contenido gr�fico especifica el contenido del universo virtual - geometr�a, apariencia, comportamiento, localizaci�n, sonidos y luces. La rama de vista gr�fica especifica los par�metros de visualizaci�n, como la posici�n de visualizaci�n y la direcci�n. Juntas, las dos ramas especifican la mayor�a del trabajo que el renderizador tiene que hacer.

.��rbol de Clases de Alto Nivel del API Java 3D

En la Figura 1-5 podemos ver los tres primeros niveles del �rbol de clases del API Java 3D. En esta parte del �rbol aparecen las clases VirtualUniverse, Locale, Group, y Leaf.

SceneGraphObject es la superclase de casi todas las clases coraz�n y de utilidad de Java 3D. Tiene dos subclases: Node y NodeComponent. Las subclases de Node proporcionan la mayor�a de los objetos de un escenario gr�fico. Un objeto Node es un objeto nodo Group o un objeto nodo Leaf.

Clase Node
La clase Node es una superclase abstracta de las clases Group y Leaf. Esta clase define algunos de los m�todos importantes de sus subclases. Las subclases de Node componen escenarios gr�ficos.

Clase Group
La clase Group es la superclase usada en especificaci�n de localizaci�n y orientaci�n de objetos visuales en el universo virtual. Dos de las subclases de Group son: BranchGroup y TransformGroup. En la representaci�n gr�fica de un escenario gr�fico, los simbolos de Group (c�rculos) normalmente se anotan con BG para BranchGroups, TG para TransformGroups, etc. La Figura 1-2 muestra algunos ejemplos de esto.

Clase Leaf
La clase Leaf es la superclase usada para especificar la forma, el sonido y comportamiento de los objetos visuales en el universo virtual. Algunas de las subclases de Leaf son: Shape3D, Light, Behavior, y Sound. Estos objetos podr�an no tener hijos pero podr�an referenciar a NodeComponents.

Clase NodeComponent
La clase NodeComponent es la superclase usada para especificar la geometr�a, la apariencia, la textura y las propiedades de material de un nodo Shape3D (Leaf). Los NodeComponents no forman parte del escenario gr�fico, pero son referenciados por �l. un NodeComponent podr�a ser referenciado por m�s de un objeto Shape3D.

Figura 1-5. Introduci�n al �rbol de Clases de API Java 3D

.�Receta para Escribir Programas Java 3D

Las subclases de SceneGraphObject son los ladrillos que se ensamblan en los escenarios gr�ficos. La l�nea b�sica de desarrollo de un programa Java 3D consiste en siete pasos (a los que la especificaci�n del API Java 3D se referiere como un Receta) presentados a continuaci�n. Esta receta puede usarse para ensamblar muchos �tiles programas Java 3D.

  1. Crear un Objeto Canvas3D
  2. Crear un objeto VirtualUniverse
  3. Crear un objeto Locale, adjuntarlo al objeto VirtualUniverse
  4. Construir la rama de vista gr�fica
    • Crear un objeto View
    • Crear un objeto ViewPlatform
    • Crear un objeto PhysicalBody
    • Crear un objeto PhysicalEnvironment
    • Adjuntar los objetos ViewPlatform, PhysicalBody, PhysicalEnvironment, y Canvas3D al objeto View
  5. Construir la(s) rama(s) gr�fica(s) de contenido
  6. Compilar la(s) rama(s) gr�fica(s)
  7. Insertar los subgr�ficos dentro del objeto Locale

Esta receta ignora algunos detalles pero ilustra el concepto fundamental para toda la programaci�n Java 3D: crear la rama gr�fica del escenario gr�fico es la programaci�n principal. En vez de ampliar esta receta, la siguiente secci�n explica una forma sencilla de construir un escenario gr�fico muy similar con menos programaci�n.

.�Una Sencilla Receta para Escribir Programas Java 3D

Los programas Java 3D escritos usando la receta b�sica tienen ramas de vista gr�fica con id�ntica estructura. La regularidad de la estructura de las ramas de vista gr�fica tambien se encuentra en la clase de utilidad SimpleUniverse. Los ejemplares de esta clase realizan los pasos 2, 3 y 4 de la receta b�sica. Usando la clase SimpleUniverse en programaci�n Java 3D se reduce significativamente el tiempo y el esfuerzo necesario para crear las ramas de vista gr�fica. Consecuentemente, el programador tiene m�s tiempo para concentrarse en el contenido. Esto de lo que se trada el escribir programas Java 3D.

La clase SimpleUniverse es un buen punto de inicio en la programaci�n Java 3D, porque permite al programador ignorar las ramas de vista gr�fica. Sin embargo, usar SimpleUniverse no permite tener varias vistas de un universo virtual.

La clase SimpleUniverse se usa en todos los ejemplos de programaci�n de este tutorial.

La clase SimpleUniverse

El constructor de SimpleUniverse crea un escenario gr�fico que incluye un objeto VirtualUniverse y Locale, y una rama de vista gr�fica completa. Esta rama gr�fica creada usa un ejemplar de las clases de conveniencia ViewingPlatform y Viewer en lugar de las clases coraz�n usadas para crear una rama de vista gr�fica. Observa que SimpleUniverse s�lo usa indirectamente los objetos View y ViewPlatform del coraz�n Java 3D. Los objetos SimpleUniverse suministran la funcionalidad de todos los objetos que hay dentro del recuadro azul de la Figura 1-7.

El paquete com.sun.j3d.utils.universe contiene SimpleUniverse, ViewingPlatform, y clases Viewer de conveniencia.

Figura 1-7. La clase SimpleUniverse proporciona un universo virtual m�nimo, indicado por la l�nea punteada azul

Al usar los objetos SimpleUniverse la receta b�sica se simplifica:

  1. Crear un objeto Canvas3D
  2. Crear un objeto SimpleUniverse que referencia al objeto Canvas3D anterior
    • Personalizar el objeto SimpleUniverse
  3. Construir la rama de contenido
  4. Compilar la rama de contenido gr�fico
  5. Insertar la rama de contenido gr�fico dentro del objeto Locale de SimpleUniverse

Constructores de SimpleUniverse

Paquete: com.sun.j3d.utils.universe

Esta clase configura un entorno de usuario m�nimo para obtener r�pida y f�cilmente un programa Java 3D y ejecutarlo.

Esta clase de utilidad crea todos los objetos necesarios para la rama de vista gr�fica. Especificamente crea los objetos Locale, VirtualUniverse, ViewingPlatform, y Viewer (todos con sus valores por defecto). Los objetos tiene las relaciones apropiadas para formar la rama de vista gr�fica.

SimpleUniverse proporciona toda la funcionalidad necesaria para muchas aplicaciones Java 3D b�sicas. Viewer y ViewingPlatform son clases de conveniencia. estas clases usan las clases View y ViewPlatform del coraz�n Java.

SimpleUniverse()

Construye un sencillo universo virtual.

SimpleUniverse(Canvas3D canvas3D)

Construye un sencillo universo virtual con una referencia al objeto Canvas3D nombrado.

El objeto SimpleUniverse crea una rama de vista gr�fica completa para un universo virtual. Esta rama incluye un plato de imagen. Un plato de imagen es el rect�ngulo conceptual donde se proyecta el contenido para formar la imagen renderizada. El objeto Canvas3D, que proporciona una imagen en una ventana de nuestra pantalla, puede ser el plato de imagen.

La Figura 1-9 muestra la relaci�n entre el plato de imagen, la posici�n del ojo, y el universo virtual. La posici�n del ojo est� detr�s del plato de imagen. Los objetos visuales delante del plato de imagen son renderizados en el plato de imagen. El renderizado puede ser como una proyecci�n de los objetos visuales sobre el plato de imagen. Esta idea se ilustra con los cuatro proyectores de la imagen (l�neas punteadas).

Figura 1-9. Dibujo Conceptual de un Plato de Imagen y la Posici�n del Ojo en un Universo Virtual

Por defecto, el plato de imagen est� centrado en el origen de SimpleUniverse. La orientaci�n por defecto es mirando hacia abajo el eje Z. Desde esta posici�n, el eje X es una l�nea horizontal que atraviesa el plato de imagen con los valores positivos hacia la derecha. El eje Y es una l�nea vertical que atraviesa el centro del plato de imagen, con los valores positivos arriba. Consecuentemente, el punto (0,0,0) es el centro del plato de imagen.

Los t�picos programas Java 3D mueven la vista hac�a atr�s (z positivo) para hacer que los objetos se acerquen, al origen dentro de la vista. La clase SimpleUniverse tiene un miembro que es un objeto de la clase ViewingPlatform. Esta clase tiene un m�todo setNominalViewingTransform que selecciona la posici�n del ojo para que est� centrado en (0, 0, 2.41) buscando en direcci�n z negativa hacia el origen.

El M�todo ViewingPlatform setNominalViewingTransform()

Paquete: com.sun.j3d.utils.universe

La clase ViewingPlatform se usa para configurar la rama de vista gr�fica de un escenario gr�fico Java 3D en un objeto SimpleUniverse. Este m�todo normalmente se usa en conjunci�n con el m�todo getViewingPlatform de la clase SimpleUniverse.

void setNominalViewingTransform()

Selecciona la distancia nominal de la vista a una distancia de aproximadamente 2,42 metros en la vista de transformaci�n de un SimpleUniverse. Desde esta distancia y con el campo de vista por defecto, los objetos con 2 metros de altura o de anchura generalmente entran en el plato de imagen.

Despu�s de crear los objetos Canvas3D y SimpleUniverse, el siguiente paso es la creacci�n de la rama de contenido gr�fico. La regularidad de estructura encontrada en la rama de vista gr�fica no existe para la rama de contenido gr�fico. La rama de contenido varia de un programa a otro haciendo imposible obtener los detalles de su construcci�n en una receta. Esto tambi�n significa que no hay una clase de "contenido sencillo" para ning�n universo que podamos querer ensamblar.

Despu�s de crear la rama de contenido gr�fico, se inserta dentro del universeo usando el m�todo addBranchGraph de SimpleUniverse. Este m�todo toma un ejemplar de BranchGroup como �nico argumento. Este BranchGroup se a�ade como hijo del objeto Locale creado por SimpleUniverse.

Lista Parcial de M�todos de SimpleUniverse

Paquete: com.sun.j3d.utils.universe void addBranchGraph(BranchGroup bg)

Se usa para a�adir Nodos al objeto Locale del escenario gr�fico creado por el SimpleUniverse. Se usa para a�adir una rama de contenido gr�fico al universo virtual.

ViewingPlatform getViewingPlatform()

Se usa para recuperar el objeto ViewingPlatform del SimpleUniverse ejemplarizado. Este m�todo se usa con el m�todo setNominalViewingTransform() de ViewingPlatform para ajustar la localizaci�n de la posici�n de vista.

.�Alguna Terminolog�a Java 3D

Insertar una rama gr�fica dentro de un Locale la hace viva, y consecuentemente, cada uno de los objetos de esa rama gr�fica tambi�n est�n vivos. Hay algunas consecuencias cuando un objeto se convierte en vivo. Los objetos vivos estan sujetos s renderizaci�n. Los par�metros de los objetos vivos no pueden ser modificados a menos que la capacidad correspondiente haya sido seleccionada especificamente antes de que el objeto est� vivo.

Los objetos BranchGroup pueden ser compilados. Compilar un BranchGroup lo convierte a �l y a todos sus ancestros en una forma m�s eficiente para el renderizado. Compilar los objetos BranchGroup est� recomendado como el �ltimo paso antes de hacerlo vivir. Es mejor compilar solo los objetos BranchGroup insertados dentro de objetos Locale

M�todo BranchGroup compile()

void compile()

compila la fuente BranchGroup asociada con este objeto creado y cacheando un escenario gr�fico compilado.

Los conceptos de compilado y vivo se implementan en la clase SceneGraphObject. Abajo podemos ver los dos m�todos de la clase SceneGraphObject que se relacionan con estos conceptos.

Lista Parcial de M�todos de SceneGraphObject

SceneGraphObject es la superclase usada para crear un escenario gr�fico incluyendo Group, Leaf, y NodeComponent. SceneGraphObject proporciona varios m�todos y campos comunes para sus subclases:

boolean isCompiled()
Devuelve una bandera indicando si el nodo forma parte de un escenario gr�fico que ha sido compilado.
boolean isLive()

Devuelve una bandera que indica si el nodo forma parte de un escenario gr�fico vivo.

Observa que no hay un paso "Empezar a renderizar" en ninguna de las recetas anteriores. El renderizador Java 3D empieza a funcionar en un bucle infinito cuando una rama gr�fica que contiene un ejemplar de View se vuelve vivo en un universo virtual. Una vez arrancado, el renderizador Java 3D realiza las operaciones mostradas en el siguiente listado:

while(true) {
	Procesos de entrada
	If (petici�n de salida) break
		Realiza comportamientos
		Atraviesa el escenario gr�fico
		y renderiza los objetos visuales
}
Limpieza y salida

Las secciones anteriores explicaban la construcci�n de un sencillo universo virtual sin una rama de contenido gr�fico. La creacci�n de esta rama es el objetivo de las siguientes secciones.

.�Ejemplo de la Receta Sencilla: HelloJava3Da

El programa Java 3D t�pico empieza definiendo una nueva clase que extiende la clase Applet. El ejemplo HelloJava3Da.java es una clase definida para extender la clase Applet. Los programas Java 3D podr�an escribirse como aplicaciones, pero usar Applets nos ofrece una forma m�s sencilla de producir una aplicaci�n con ventanas.

La clase principal de un programa Java 3D normalmente define un m�todo para construir la rama de contenido gr�fico. En el ejemplo HelloJava3Da dicho m�todo est� definido como createSceneGraph(). Los pasos de la receta sencilla se implementan en el constructor de la clase HelloJava3Da. El paso 1, crear un objeto Canvas3D, se completa en la l�nea 4. El paso 2, crear un objeto SimpleUniverse, se hace en la l�nea 11. El paso 2a, personalizar el objeto SimpleUniverse, se realiza en la l�nea 15. El paso 3, construir la rama de contenido, se realiza en la llamada al m�todo createSceneGraph(). El paso 4, compilar la rama de contenido gr�fico, se hace en la l�nea 8. Finalmente el paso 5, insertar la rama de contenido gr�fico en el objeto Locale del SimpleUniverse, se completa en la l�nea 16:

Fragmento de c�digo 1-1. La clase HelloJava3D
1. public class HelloJava3Da extends Applet {
2.     public HelloJava3Da() {
3.        setLayout(new BorderLayout());
4.        Canvas3D canvas3D = new Canvas3D(null);
5.        add("Center", canvas3D);
6.
7.        BranchGroup scene = createSceneGraph();
8.        scene.compile();
9.
10.      // SimpleUniverse is a Convenience Utility class
11.      SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
12.
13.      // This moves the ViewPlatform back a bit so the
14.      // objects in the scene can be viewed.
15.      simpleU.getViewingPlatform().setNominalViewingTransform();
16.
17.      simpleU.addBranchGraph(scene);
18.    } // end of HelloJava3Da (constructor)

El paso 3 de esta sencilla receta es crear la rama de contenido gr�fico. Esta rama se crea en el Fragmento de c�digo 1-2. Probablemente sea la rama de contenido gr�fico m�s sencilla posible. Contiene un objeto gr�fico est�tico, un ColorCube. �ste est� localizado en el origen del sistema de coordenadas del universo virtual. Con la localizaci�n y orientaci�n dadas de la direcci�n de la vista del cubo, el cubo aparece como un rect�ngulo cuando es renderizado. La imagen que mostrar� este programa la podemos ver en la Figura 1-12:

Fragmento de c�digo 1-2. M�todo createSceneGraph de la clase HelloJava3D
1.     public BranchGroup createSceneGraph() {
2.        // Create the root of the branch graph
3.       BranchGroup objRoot = new BranchGroup();
4.
5.       // Create a simple shape leaf node, add it to the scene graph.
6.       // ColorCube is a Convenience Utility class
7.       objRoot.addChild(new ColorCube(0.4));
8.
9.       return objRoot;
10.     } // end of createSceneGraph method of HelloJava3Da
11. } // end of class HelloJava3Da

La clase HelloJava3Da est� derivada de Applet pero el programa puede ejecutarse como una aplicaci�n con el uso de la clase MainFrame. La clase Applet se usa como clase base para hacer m�s f�cil la escritura de un programa Java 3D que se ejecuta en una ventana. MainFrame proporciona un marco AWT (ventana) para un applet permitiendo que el applet se ejecute como una aplicaci�n. El tama�o de la ventana de la aplicaci�n resultante se especifica en la construcci�n de la clase MainFrame. El Fragmento de C�digo 1-3 muestra el uso de la clase MainFrame en HelloJava3Da.java.

Lista Parcial de Constructores de MainFrame

paquete: com.sun.j3d.utils.applet

MainFrame crea un applet en una aplicaci�n. Una clase derivada de Applet podr�a tener un m�todo main() que llame al constructor MainFrame. MainFrame extiende java.awt.Frame e implementa java.lang.Runnable, java.applet.AppletStub, y java.applet.AppletContext. La clase MainFrame es Copyright � 1996-1998 de Jef Poskanzer email: [email protected] en http://www.acme.com/java/.

MainFrame(java.applet.Applet applet, int width, int height)

Crea un objeto MainFrame que ejecuta un applet como una aplicaci�n.

Par�metros:

  • applet - el constructor de una clase derivada de Applet. MainFrame proporciona un marco AWT para este applet.
  • width - la anchura de la ventana en pixels
  • height - la altura de la ventana en pixels
Fragmento de c�digo 1-3. M�todo Main() de HelloJava3Da Invoca a MainFrame
1.     // The following allows this to be run as an application
2.     // as well as an applet
3.
4.     public static void main(String[] args) {
5.     Frame frame = new MainFrame(new HelloJava3Da(), 256, 256);
6.     } // end of main (method of HelloJava3Da)

Los tres fragmentos de c�digo anteriores (1-1, 1-2, y 1-3) forman un programa Java 3D completo cuando se usan las sentencias import adecuadas. Aqu� podemos ver las sentencias import necesarias para compilar la clase HelloJava3Da. Las clases m�s comunmente usadas en Java 3D se encuentran en los paquetes javax.media.j3d, o javax.vecmath. En este ejemplo, s�lo la clase de utilidad ColorCube se encuentra en el paquete com.sun.j3d.utils.geometry. Consecuentemente, la mayor�a de los programas Java 3D tienen las sentencias import mostradas en el Fragmento de C�digo 1-4 con la excepci�n de ColorCube.

Fragmento de c�digo 1-4. Sentencias Import para HelloJava3Da
1. import java.applet.Applet;
2. import java.awt.BorderLayout;
3. import java.awt.Frame;
4. import java.awt.event.*;
5. import com.sun.j3d.utils.applet.MainFrame;
6. import com.sun.j3d.utils.universe.*;
7. import com.sun.j3d.utils.geometry.ColorCube;
8. import javax.media.j3d.*;
9. import javax.vecmath.*;

En el programa de ejemplo HelloJava3Da.java, s�lo se sit�o un objeto gr�fico en una �nica localizaci�n. En la figura 1-11 podemos ver el escenario gr�fico resultante:

Figura 1-11 Escenario Gr�fico del ejemplo HelloJava3Da

Compilamos el programa con el comando javac HelloJava3Da.java. Y lo ejecutamos con el comando: java HelloJava3Da. La imagen producida por el programa HelloJava3Da se puede ver en la Figura 1-12.

Figura 1-12 Imagen Producida por HelloJava3Da

Como no se explica cada l�nea de c�digo del ejemplo HelloJava3Da, las ideas b�sicas de ensamblar un programa Java 3D deber�an estar claras habiendo le�do el ejemplo. La siguiente secci�n presenta cada una de las clases usadas en el programa.

.�Clases Java 3D Usadas en HelloJava3Da

Para a�adir un poco de entendimiento del API Java 3D y el ejemplo HelloJava3Da aqu� presentamos una sinopsis de las clases del API Java 3D usadas en HelloJava3Da.

Clase BranchGroup

Los objetos de este tipo se usan para formar escenarios gr�ficos. Los ejemplares de BranchGroup son la ra�z de los sub-gr�ficos. Los objetos BranchGroup son los �nicos que pueden ser hijos de los objetos Locale. Los objetos BranchGroup pueden tener varios hijos. Los hijos de un objeto BranchGroup pueden ser otros objetos Group o Leaf.

Constructor por defecto de BranchGroup

BranchGroup()

Los ejemplares de BranchGroup sirven como ra�z para las ramas del escenario gr�fico; los objetos BranchGroup son los �nicos objetos que pueden insertarse en un conjunto de objetos Locale.

Clase Canvas3D

La clase Canvas3D deriva de la clase Canvas del AWT. Al menos un objeto Canvas3D debe ser referenciado en la rama de vista gr�fica del escenario gr�fico.

Constructor de Canvas3D

Canvas3D(GraphicsConfiguration graphicsconfiguration)

Construye e inicializa un nuevo objeto Canvas3D que el Java 3D puede renderizar dando un objeto GraphicsConfiguration v�lido. Es una extensi�n de la clase Canvas del AWT.

Clase Transform3D

Los objetos Transform3D representan transformaciones de geometr�as 3D como una traslaci�n o una rotaci�n. Estos objetos normalmente s�lo se usan en la creacci�n de un objeto TransformGroup. Primero, se construye el objeto Transform3D, posiblemente desde una combinaci�n de objetos Transform3D. Luego se construye el objeto TransformGroup usando el objeto Transform3D.

Constructor por Defecto de Transform3D

Un objeto de transformaci�n generalizado se representa internamente como una matriz de 4x4 doubles de punto flotante. La representaci�n matem�tica es la mejor forma. Un objeto Transform3D no se usa en un escenario gr�fico. Se usa para especificar la transformaci�n de un objeto TransformGroup.

Transform3D()

Construye un objeto Transform3D que representa la matriz de identidad (no la transformaci�n).

Un objeto Transform3D puede representar una traslaci�n, una rotaci�n, un escalado, o una combinaci�n de �stas. Cuando se especifica una rotaci�n, el �ngulo se expresa en radianes. Una rotaci�n completa es 2 PI radianes. Una forma de especificar �ngulos es usar la constante Math.PI. Otra forma es especificar los valores directamente. Algunas aproximaciones son: 45� es 0.785, 90� es 1.57, y 180� es 3.14.

Lista Parcial de M�todos de Transform3D

Los objetos Transform3D representan transformaciones geom�tricas como una rotaci�n, traslaci�n y escalado. Transform3D es una de las pocas clases que no se usan directamente en un escenario gr�fico. Las transformaciones representadas por objetos Transform3D se usan para crear objetos TransformGroup que si se usan en escenarios gr�ficos.

void rotX(double angle)

Selecciona el valor de esta transformaci�n a una rotaci�n en contra del sentido del reloj sobre el eje-x. El �ngulo se especifica en radianes.

void rotY(double angle)

Selecciona el valor de esta transformaci�n a una rotaci�n en contra del sentido del reloj sobre el eje-y. El �ngulo se especifica en radianes.

void rotZ(double angle)

Selecciona el valor de esta transformaci�n a una rotaci�n en contra del sentido del reloj sobre el eje-z. El �ngulo se especifica en radianes.

void set(Vector3f translate)

Selecciona el valor transacional de esta matriz al valor del par�metro Vector3f, y selecciona los otros componentes de la matriz como si �sta transformaci�n fuera una matriz id�ntica.

Clase TransformGroup

Como una subclase de la clase Group, los ejemplares de TransformGroup se usan en la creacci�n de escenarios gr�ficos y tienen una colecci�n de objetos nodos como hijos. Los objetos TransformGroup contienen transformaciones geom�tricas como traslaciones y rotaciones. La transformaci�n normalmente se crea en un objeto Transform3D, que no es un objeto del escenario gr�fico.

Constructores de TransformGroup

Los objetos TransformGroup son contenedores de transformaciones en el escenario gr�fico.

TransformGroup()

Construye e inicializa un TransformGroup usando una identidad de transformaci�n.

TransformGroup(Transform3D t1)

Construye e inicializa un TransformGroup desde un objeto Transform3D pasado:

Par�metros:

  • t1 - el objeto transform3D

La transformaci�n contenida en un objeto Transform3D se copia a un objeto TransformGroup o cuando se crea el TransformGroup, o usando el m�todo setTransform().

M�todo setTransform() de TransformGroup

void setTransform(Transform3D t1)

Selecciona el componente de transformaci�n de este TransformGroup al valor de la transformaci�n pasada.

Par�metros:

  • t1 - la transformaci�n a copiar.

Clase Vector3f

Vector3f es una clase matem�tica que se encuentra en el paquete javax.vecmath para especificar un vector usando tres valores de punto flotante. Los objetos Vector se usan frecuentemente para especificar traslaciones de geometr�as. Los objetos Vector3f no se usan directamente en la construcci�n de un escenario gr�fico. Se usan para especificar la traslaciones, superficies normales, u otras cosas.

Constructores de Vector3f

Un vector de 3 elementos que es representado por puntos flotantes de precisi�n sencilla para las coordenadas x, y, y z.

Vector3f()

Construye e inicializa un Vector3f a (0,0,0).

Vector3f(float x, float y, float z)

Construye e inicializa un Vector3f desde las coordenadas x, y, z especificadas.

Clase ColorCube

ColorCube es una clase de utilidad que se encuentra en el paquete com.sun.j3d.utils.geometry que define la geometr�a y colores de un cubo centrado en el origen y con diferentes colores en cada cara. El objeto ColorCube es un cubo que tiene 2 m�tros de arista. Si un cubo sin rotar se sit�a en el origen (como en HelloJava3Da), se ver� la cara roja desde la localizaci�n de visi�n nominal. Los otros colores son azul, magenta, amarillo, verde y cian.

Constructores de ColorCube

Paquete: com.sun.j3d.utils.geometry

Un ColorCube es un objeto visual, un cubo con un color diferente en cada cara. ColorCube extiende la clase Shape3D; por lo tanto, es un nodo hoja. ColorCube es f�cil de usar cuando se pone junto a un universo virtual.

ColorCube()

Construye un cubo de color del tama�o por defecto. Por defecto, una esquina est� situada a 1 metro de cada uno de los ejes desde el origen, resultando un cubo que est� centrado en el origen y tiene 2 metros de alto, de ancho y de profundo.

ColorCube(double scale)

Construye un cubo de color escalado por el valor especificado. El tama�o por defecto es 2 metros de lado. El ColorCube resultante tiene esquinas en (scale, scale, scale) y (-scale, -scale, -scale).

.�Rotar el Cubo

Una simple rotaci�n del cubo puede hacer que se vea m�s de una de sus caras. El primer paso es crear la transformaci�n deseada usando un objeto Transform3D.

El Fragmento de C�digo 1-5 incorpora un objeto TransformGroup en el escenario gr�fico para rotar el cubo sobre el eje x. Primero se crea la transformaci�n de rotaci�n usando el objeto rotate de Transform3D. Este objeto se crea en la l�nea 6. La rotaci�n se especifica usando el m�todo rotX() de la l�nea 8. Entonces se crea el objeto TransformGroup en la l�nea 10 para contener la transformaci�n de rotaci�n.

Dos par�metros especifican la rotaci�n: el eje de revoluci�n, y el �ngulo de rotaci�n. El eje se elige seleccionando el m�todo apropiado. El �ngulo de rotaci�n es el valor que se le pasa como argumento. Como el �ngulo de rotaci�n se especifica en radianes, el valor PI/4 es 1/8 de una rotaci�n completa, o 45 grados.

Despu�s de crear el objeto Transform3D, rotate, se usa en la creacci�n del objeto TransformGroup objRotate (l�nea 10). El objeto Transform3D se usa en el escenario gr�fico. Entonces el objeto objRotate hace que ColorCube sea su hijo (l�nea 11). A su vez, el objeto objRoot hace a objRotate como su hijo (l�nea 12).

Fragmento de c�digo 1-5. Una Rotaci�n en la Rama de Contenido Gr�fico
1. public BranchGroup createSceneGraph() {
2.     // Create the root of the branch graph
3.     BranchGroup objRoot = new BranchGroup();
4.
5.     // rotate object has composite transformation matrix
6.     Transform3D rotate = new Transform3D();
7.
8.     rotate.rotX(Math.PI/4.0d);
9.
10.   TransformGroup objRotate = new TransformGroup(rotate);
11.   objRotate.addChild(new ColorCube(0.4));
12.   objRoot.addChild(objRotate);
13.   return objRoot;
14. } // end of createSceneGraph method

La rama de contenido gr�fico ahora incluye un objeto TransformGroup en el camino del escenario gr�fico hacia el objeto ColorCube.Cada uno de los caminos del escenario gr�fico es necesario. El objeto BranchGroup es el �nico que puede ser hijo de un Locale. El objeto TransformGroup es el �nico que puede cambiar la localizaci�n, la orientaci�n, o el tama�o de un objeto visual. En este caso el objeto TransformGroup cambia la orientaci�n. Por supuesto, el objeto ColorCube es necesario para suministrar el objeto visual.

Aqu� podemos ver la imagen producida por el Fragmento de C�digo 1-5.

Figura 1-13 Imagen creada con el Fragmento de C�digo 1-5

.�Ejemplo de Combinaci�n de Transformaciones: HelloJava3Db

Frecuentemente un objeto visual se traslada y se rota, o se rota sobre dos ejes. En cualquier caso, se especifican dos transformaciones diferentes para un s�lo objeto visual. Las dos transformaciones pueden combinarse en una matriz de transformaciones y contenerse en un s�lo objeto TransformGroup. Podemos ver un ejemplo en el Fragmento de C�digo 1-6.

En el programa HelloJava3Db.java se combinan dos rotaciones. Crear estas dos rotaciones simult�neas requiere combinar dos objetos Transform3D de rotaci�n. El ejemplo rota el cubo sobre los ejes x e y. Se crean dos objetos Transform3D, uno por cada rotaci�n (l�neas 6 y 7). Las rotaciones individuales se especifican para los dos objetos TransformGroup (l�neas 9 y 10). Luego las rotaciones se combinan mediante la multiplicaci�n de los objetos Transform3D (l�nea 11). La combinaci�n de las dos transformaciones se carga en el objeto TransformGroup (l�nea 12).

Fragmento de c�digo 1-6. Dos Transformaciones de Rotaci�n en HelloJava3Db
1. public BranchGroup createSceneGraph() {
2.     // Create the root of the branch graph
3.     BranchGroup objRoot = new BranchGroup();
4.
5.     // rotate object has composite transformation matrix
6.     Transform3D rotate = new Transform3D();
7.     Transform3D tempRotate = new Transform3D();
8.
9.     rotate.rotX(Math.PI/4.0d);
10.   tempRotate.rotY(Math.PI/5.0d);
11.   rotate.mul(tempRotate);
12.   TransformGroup objRotate = new TransformGroup(rotate);
13.
14.   objRotate.addChild(new ColorCube(0.4));
15.   objRoot.addChild(objRotate);
16.   return objRoot;

Tanto el Fragmento de C�digo 1-5 como el Fragmento de c�digo 1-6 podr�an reemplazar al Fragmento de C�digo 1-2. El Fragmento de c�digo 1-6 se usa en HelloJava3Db.java. Aqu� puedes encontrar el ejemplo completo: HelloJava3Db.java

En la Figura 1.-14 podemos ver el escenario gr�fico creado en HelloJava3Db.java. La rama de vista gr�fica es la misma producida en HelloJava3Da, que est� construida por un SimpleUniverse y representada por una gran estrella. La rama de contenido gr�fico ahora incluye un TransformGroup en el camino del escenario gr�fico hacia el objeto ColorCube.

Figura 1-14 Escenario Gr�fico del Ejemplo HelloJava3Db

La imagen de la figura 1-15 muestra el ColorCube girado del HelloJava3Db.

Figura 1-15 Imagen del ColorCube rotada por el programa HelloJava3D

.�Capacidades y Rendimiento

El escenario gr�fico construido por un programa Java 3D podr�a usarse directamente para renderizar. Sin embargo, la representaci�n no es muy eficiente. La flexibilidad construida dentro de cada objeto escenario gr�fico (que no se van a discutir en este tutorial) crean un representaci�n sub-optima del universo virtual. Para mejorar el rendimiento de la renderizaci�n se usa una representaci�n m�s eficiente del universo virtual.

Java 3D tiene una representaci�n interna para una universo virtual y los m�todos para hacer la conversi�n. Hay dos formas para hacer que el sistema Java 3D haga la conversi�n de la representaci�n interna. Una forma es compilar todas las ramas gr�ficas. La otra forma es insertar una rama gr�fica en un universo virtual para darle vida.

.�Compilar Contenidos

El objeto BranchGroup tiene un m�todo compilador. Llamando a este m�todo se convierte la rama gr�fica completa que hay debajo del BranchGroup a la representaci�n interna de Java 3D de la rama gr�fica. Adem�s de la conversi�n, la representaci�n interna podr�a optimizarse de una o varias maneras.

Las posibles optimizaciones no se especifican en el API Java 3D. Sin embargo, se puede ganar en eficiencia de varias formas. Una de las posibles optimizaciones es combinar TransformGroups con caminos de escenario gr�fico. Por ejemplo, si un escenario gr�fico tiene dos objetos TransformGroup en una relacion padre-hijo pueden ser representados por un objeto TransformGroup. Otra posibilidad es combinar objetos Shape3D que tienen una relaci�n est�tica f�sica. Estos tipos de optimizaciones se hacen posibles cuando las capacidades no se configuran.

La Figura 1-16 presenta una representaci�n conceptual de la conversi�n a una representaci�n m�s eficiente. El escenario gr�fico del lado izquierdo es compilado y transformado en la representaci�n interna mostrada en el lado derecho. La figura s�lo representa el concepto de representaci�n interna, no como Java 3D realmente lo hace.

Figura 1-16 Ejemplo Conceptual del Resultado de Compilar una Escenario Gr�fico

.�Capacidades

Una vez que una rama gr�fica empieza a vivir o es compilada el sistema de renderizado Java 3D la convierte a una representaci�n interna m�s eficiente. El efecto m�s importante de esta conversi�n es la mejora del rendimiento de renderizado.

Pero tambi�n tiene otros efectos, uno de ellos es fijar el valor de transformaciones y otros objetos en el escenario gr�fico. A menos que especificamente lo proporcionemos en el programa, este no tendr� la capacidad de cambiar los valores de los objetos del escenario gr�fico una vez que est�n vivos.

Hay casos en que un programa necesita la capacidad de cambiar estos valores despu�s de que est�n vivos. Por ejemplo, cambiar el valor de un objeto TransformGroup crea animaciones. Para que esto suceda, la transforamci�n debe poder cambiar despu�s de estar viva. La lista de par�metros a los que se puede acceder, y de que forma, se llama capacidades del objeto.

Cada SceneGraphObject tiene un conjunto de bits de capacidad. Los valores de estos bits determinan que capacidades existen para el objeto despu�s de compilarlo o de darle vida. El conjunto de capacidades var�a con la clase.

Lista Parcial de M�todos de SceneGraphObject

SceneGraphObject es la superclase de casi cualquier clase usada para crear un escenario gr�fico, incluyendo Group, Leaf, y NodeComponent.

void clearCapability(int bit)

Borra el bit de capacidad especificado.

boolean getCapability(int bit)

Recupera el bit de capcidad especificado.

void setCapability(int bit)

Configura el bit de capacidad especificado.

Como ejemplo, para poder leer el valor de la transformaci�n representada por un objeto TransformGroup, esta capacidad debe activarse antes de compilarlo o darle vida. De forma similar, para poder cambiar el valor de la transformaci�n en un objeto TransformGroup, su capacidad de escribir transformaci�n debe configurarse antes de compilarlo o darle vida. Intentar hacer un cambio en un objeto vivo o compilado para el que la propiedad adecuada no se ha configurado resultar� en una excepci�n.

En la siguiente secci�n, las animaciones se crean usando una transformaci�n de rotaci�n que var�a con el tiempo. Para que esto sea posible, el objeto TransformGroup debe tener su capacidad ALLOW_TRANSFORM_WRITE activada antes de que sea compilado o se le de vida.

Lista Parial de Capcidades de TransformGroup

Las dos capacidades listadas aqu� son las �nicas definidas por TransformGroup. �ste hereda varias capacidades de sus clases ancestros: Group y Node. La configuraci�n de capacidades se puede seleccionar, eliminar o recuperar usando los m�todos definidos en SceneGraphObject.

ALLOW_TRANSFORM_READ

Especifa que el nodo TransformGroup permite acceder a la informaci�n de transformaci�n de su objeto.

ALLOW_TRANSFORM_WRITE

Especifica que el nodo TransformGroup permite escribir la informaci�n de transformaci�n de su objeto.

Las capacidades tambi�n controlan el acceso a otros aspectos de un objeto TransformGroup. Los objetos TransformGroup heredan configuraci�n de capacidades de sus clases ancestros: Group y Node. En el siguiente bloque de referencia podemos ver algunas de esas capacidades.

Lista Parcial de Capacidades de Group

TransformGroup hereda varios bits de capacidades de sus clases ancestros.

ALLOW_CHILDREN_EXTEND

Permite que se puedan a�adir hijos al nodo Group despu�s de que est� compilado o vivo.

ALLOW_CHILDREN_READ

Permite que se puedan leer las referencias a los hijos del nodo Group despu�s de que est� compilado o vivo.

ALLOW_CHILDREN_WRITE

Permite que se puedan escribir las referencias a los hijos del nodo Group despu�s de que est� compilado o vivo.

.�A�adir Comportamiento de Animaci�n

En Java 3D, Behavior es una clase para especificar animaciones o interacciones con objetos visuales. El comportamiento puede cambiar virtualmente cualquier atributo de un objeto visual. Un programador puede usar varios comportamientos predefinidos o especificar un comportamiento personalizado. Una vez que se ha especificado un comportamiento para un objeto visual, el sistema Java 3D actualiza autom�ticamente la posici�n, la orientaci�n, el color, u otros atributos del objeto visual.

La distinci�n entre animaci�n e interacci�n es si el comportamiento es activado en respuesta al paso del tiempo o en respuesta a actividades del usuario, respectivamente.

Cada objeto visual del universo virtual puede tener sus propio comportamiento predefinido. De echo, un objeto visual puede tener varios comportamientos. Para especificar un comportamiento para un objeto visual, el programador crea objetos que especifiquen el comportamiento, a�ade el objeto visual al escenario gr�fico y hace las referencias apropiadas entre los objetos del escenario gr�fico y los objetos Behavior.

En un universo virtual con muchos comportamientos, se necesita una significante potencia de c�lculo para calcular los comportamientos. Como tanto el renderizador como el comportamiento usan el mismo procesador, es posible que la potencia de c�lculo que necesita el comportamiento degrade el rendimiento del renderizado.

Java 3D permite al programador manejar este problema especificando un l�mite espacial para que el comportamiento tenga lugar. Este l�mite se llama regi�n programada. Un comportamiento no est� activo a menos que el volumen de activaci�n de ViewPlatform intereseccione con una regi�n progamada del Behavior. En otras palabras, si nadie en el bosque ve el �rbol caer, �ste no cae. La caracter�stica de regi�n programada hace m�s eficiente a Java 3D en el manejo de universos virtuales con muchos comportamientos.

Un Interpolator es uno de las muchas clases de comportamientos predefinidos en el paquete coraz�n de Java 3D. Basado en una funci�n de tiempo, el objeto Interpolator manipula los par�metros de un objeto del escenario gr�fico. Por ejemplo, para el RotationInterpolator, manipula la rotaci�n especificada por un TransformGroup para afectar la rotaci�n de los objetos visuales que son ancestros de TransformGroup.

La siguiente lista enumera los pasos envueltos para especificar una animaci�n con un objeto interpolator. Los cinco pasos forman una receta para crear un comportamiento de animaci�n con interpolaci�n:

  1. Crear un TransformGroup fuente.
    Selecciona la capacidad ALLOW_TRANSFORM_WRITE.
  2. Crear un objeto Alpha (funci�n de tiempo en Java 3D)
    Especifica los par�metros de tiempo para el alpha
  3. Crear el objeto interpolator.
    Tiene referencias con los objetos Alpha y TransformGroup.
    Personalizar los par�metros del comportamiento.
  4. Especificar la regi�n programada.
    Configura la regi�n programada para el comportamiento.
  5. Hacer el comportamiento como hijo del TransformGroup

.�Especificar un Comportamiento de Animaci�n

Una acci�n de comportamiento puede ser cambiar la localizaci�n (PositionInterpolator), la orientaci�n (RotationInterpolator), el tama�o (ScaleInterpolator), el color (ColorInterpolator), o la transpariencia (TransparencyInterpolator) de un objeto visual. Como se mencion� antes, los Interpolators son clases de comportamiento predefinidas. Todos los comportamientos mencionados son posibles sin usar un interpolator; sin embargo, los interpolators hacen mucho m�s sencilla la cracci�n de comportamientos. Las clases Interpolators existen para proporcionar otras acciones, incluyendo combinaciones de estas acciones.

Clase RotationInterpolator

Esta clase se usa para especificar un comportamiento de rotaci�n de un objeto visual o de un grupo de objetos visuales. Un objeto RotationIterpolator cambia un objeto TransformGroup a una rotaci�n especififca en repuesta a un valor de un objeto Alpha. Como el valor de este objeto cambia cada vez, la rotaci�n tambi�n cambia. Un objeto RotationInterpolator es flexible en la especificaci�n del eje de rotaci�n, el �ngulo de inicio y el �ngulo final.

Para rotaciones constantes sencillas, el objeto RotationInterpolator tiene el siguiente constructor que puede usarse para eso:

Lista Parcial de Constructores de RotationInterpolator

Esta clase define un comportamiento que modifica el componente rotacional de su TransformGroup fuente linearizando la interpoalizaci�n entre un par de �ngulos especificados (usando el valor generado por el objeto Alpha especificado). El �ngulo interpolado se usa para generar una transformaci�n de rotaci�n.

RotationInterpolator(Alpha alpha, TransformGroup target)

Este constructor usa valores por defecto de algunos par�metros del interpolador para construir una rotaci�n completa sobre el eje y, usando el TransformGroup especificado.

Par�metros:

  • alpha - la funci�n de variaci�n de tiempo para referencia.
  • target - el objeto TransformGroup a modificar.

El objeto TransformGroup de un interpolador debe tener la capacidad de escritura activada.

.�Funciones de Variaci�n de Tiempo: Mapear un Comportamiento en el Tiempo

Mapear una acci�n en el tiempo se hace usando un objeto Alpha. La especificaci�n de este objeto puede ser compleja.

Clase Alpha

Los objetos de la clase Alpha se usan para crear una funci�n que var�a en el tiempo. La clase Alpha produce un valor entre cero y uno, inclusives. El valor que produce depende de la hora y de los par�metros del objeto Alpha. Los objetos Alpha se usan comunmente con un comportamiento Interpolator para proporcionar animaciones de objetos visuales.

Alpha tiene diez par�metos, haciendo la programaci�n tremendamente flexible. Sin entrar en detalles de cada par�metros, saber que un ejemplar de Alpha puede combinarse f�cilmente con un comportamiento para proporcionar rotaciones sencillas, movimientos de p�ndulo, y eventos de una vez, como la apertura de puertas o el lanzamiento de cohetes.

Constructor de Alpha

La clase Alpha proporciona objetos para convertir la hora en un valor alpha (un valor entre 0 y 1). El objeto Alpha es efectivamente una funci�n de tiempo que genera valores alpha entre cero y uno. La funci�n "f(t)" y las caracter�sticas del objeto Alpha est�n determinadas por par�metros definidos por el usuario:

Alpha()

Bucle continuo con un periodo de un segundo.

Alpha(int loopCount, long increasingAlphaDuration)

Este constructor toma s�lo loopCount e increasingAlphaDuration como par�metros y asigna los valores por derecto a todos los dem�s par�metros, resultando un objeto Alpha que produce valores desde cero a uno crecientes. Esto se repite el n�mero de veces especificado por loopCount. Si loopCount es -1, el objeto alpha se repite indefinidamente. El tiempo que tarde en ir desde cero hasta uno est� especificando en el segundo par�metro usando una escala de milisegundos.

Par�metros:

  • loopCount - n�mero de veces que se ejecuta este objeto alpha; un valor de -1 especifica un bucle indefinido..
  • increasingAlphaDuration - tiempo en milisegundos que tarda el objeto alpha en ir de cero a uno.

.�Regi�n Progamada

Como se mencion� anteriormente, cada comportamiento tiene unos l�mites programados. Estos l�mites se configuran usando el m�todo setSchedulingBounds de la clase Behavior.

Hay varias formas de especificar una regi�n programada, la m�s sencilla es crear un objeto BoundingSphere. Otras opciones incluyen BoundingBox y BoundingPolytope.

M�todo setSchedulingBounds de Behavior

void setSchedulingBounds(Bounds region)

Selecciona la regi�n programada del Behavior a unos l�mites especificados.

Par�metros:

  • region - Los l�mites que contienen la regi�n programada del Behavior.

Clase BoundingSphere

Especificar un l�mite esf�rico se consigue especificando un punto central y un r�dio para la esfera. El uso normal de este tipo de l�mites es usar el centro a (0, 0, 0). Entonces el radio se selecciona lo suficientemente grande como para contener el objeto visual, incluyendo todas las posibles localizaciones del objeto.

Lista Parcial de Constructores de BoundingSphere

Esta clase define una regi�n de l�mites esf�rica que est� definida por un punto central y un r�dio.

BoundingSphere()

Este constructor crea una l�mite esf�rico centrado en el origen (0, 0, 0) con un radio de 1.

BoundingSphere(Point3d center, double radius)

Construye e inicializa un BoundingSphere usando el punto central y el r�dio especificados.

.�Ejemplo de Comportamiento: HelloJava3Dc

El Fragmento de C�digo 1-7 muestra un ejemplo completo del uso de las clases interpoladoras para crear una animaci�n. La animaci�n creada con este c�digo es una rotaci�n contin�a con un tiempo de rotaci�n total de 4 segundos.

El paso 1 de la receta es crear el objeto TransformGroup para modificarlo durante la ejecuci�n. El objeto TransformGroup fuente de un interpolador debe tener activada la capacidad de escritura. El objeto TransformGroup llamado objSpin se crea en la l�nea 7. La capacidad de escritiura de objSpin se selecciona en la l�nea 8.

El paso 2 es crear un objeto alpha para dirigir la interpolaci�n. Los dos par�metros especificados en la l�nea 16 del fragmento de c�digo son el n�mero de interacciones del bucle y el tiempo de un ciclo. El valor de "-1" especifica un bucle cont�nuo. El tiempo se especifica en milisegundos por lo que el valor de 4000 significa 4 segundos. Por lo tanto, el comportamiento es rotar cada cuatro segundos.

El paso 3 de la receta es crear el objeto interpolator. El objeto RotationInterpolator se crea en las l�neas 21 y 22. El interpolador debe tener referencias a la transformaci�n fuente y al objeto alpha. Esto se consigue en el constructor. En este ejemplo se usa el comportamiento por defecto del RotationInterpolator para hacer una rotaci�n completa sobre el eje y.

El paso 4 es especificar una regi�n programada. Se usa un objeto BoundingSphere con sus valores por defecto. El objeto BoundingSphere se crea en la l�ena 25. La esfera se configura como los l�mites del comportamiento en la l�nea 26.

El paso final, el 5, hace del comportamiento un hijo del TransformGroup. Esto se consigue en la l�nea 27.

Fragmento de c�digo 1-7. M�todo createSceneGraph con Comportamiento RotationInterpolator
1. public BranchGroup createSceneGraph() {
2.     // Create the root of the branch graph
3.     BranchGroup objRoot = new BranchGroup();
4.
5.     // Create the transform group node and initialize it to the
6.     // identity. Add it to the root of the subgraph.
7.     TransformGroup objSpin = new TransformGroup();
8.     objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
9.     objRoot.addChild(objSpin);
10.
11.   // Create a simple shape leaf node, add it to the scene graph.
12.   // ColorCube is a Convenience Utility class
13.   objSpin.addChild(new ColorCube(0.4));
14.
15.   // create time varying function to drive the animation
16.   Alpha rotationAlpha = new Alpha(-1, 4000);
17.
18.   // Create a new Behavior object that performs the desired
19.   // operation on the specified transform object and add it into
20.   // the scene graph.
21.   RotationInterpolator rotator =
22.      new RotationInterpolator(rotationAlpha, objSpin);
23.
24.   // a bounding sphere specifies a region a behavior is active
25.   BoundingSphere bounds = new BoundingSphere();
26.   rotator.setSchedulingBounds(bounds);
27.   objSpin.addChild(rotator);
28.
29.   return objRoot;
30. } // end of createSceneGraph method

Este fragmento de c�digo se usa con otros fragmentos anteriores para crear el programa de ejemplo HelloJava3Dc.java. Al ejecutar la aplicaci�n veremos como se renderiza el ColorCube con un comportamiento de rotaci�n cada cuatro segundos.

El programa HelloJava3Dc crea el escenario gr�fico de la Figura 1-18. El objeto rotation es tanto hijo del TransformGroup como una referencia a �l. Aunque esta relaci�n parece violar la restricciones de bucles dentro del escenaio gr�fico, no lo hace. Recuerda que los arcos de referencia (flecha punteada) no son parte del escenario gr�fico. La l�nea punteada desde el Behavior hacia el TransformGroup es esta referencia.

Figura 1-18 Escenario Gr�fico del Ejemplo HelloJava3Dc

La imagen de la Figura 1-19 muestra un marco de la ejecuci�n del programa HelloJava3Dc.

Figura 1-19 Una imagen del ColorCube en Movimiento.

.�Ejemplo de Combinaci�n de Transformation y Behavior: HelloJava3Dd

Por supuesto, podemos combinar comportamientos con las transformaciones de rotaci�n de los ejemplos anteriores. HelloJava3Dd.java hace esto. En la rama de contenido gr�fico, hay objetos llamados objRotate y objSpin, que distinguen entre la rotaci�n est�tica y el comportamiento de rotaci�n (bucle continuo) del objeto cube respectivamente. El escenario resultante de este fragmento de c�digo podemos verlo en la figura 1.20.

Fragmento de c�digo 1-8. Rama de Contenido Gr�fico para un ColorCube giratorio
1. public BranchGroup createSceneGraph() {
2.     // Create the root of the branch graph
3.     BranchGroup objRoot = new BranchGroup();
4.
5.     // rotate object has composite transformation matrix
6.     Transform3D rotate = new Transform3D();
7.     Transform3D tempRotate = new Transform3D();
8.
9.     rotate.rotX(Math.PI/4.0d);
10.   tempRotate.rotY(Math.PI/5.0d);
11.   rotate.mul(tempRotate);
12.
13.   TransformGroup objRotate = new TransformGroup(rotate);
14.
15.   // Create the transform group node and initialize it to the
16.   // identity. Enable the TRANSFORM_WRITE capability so that
17.   // our behavior code can modify it at runtime. Add it to the
18.   // root of the subgraph.
19.   TransformGroup objSpin = new TransformGroup();
20.   objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
21.
22.   objRoot.addChild(objRotate);
23.   objRotate.addChild(objSpin);
24.
25.   // Create a simple shape leaf node, add it to the scene graph.
26.   // ColorCube is a Convenience Utility class
27.   objSpin.addChild(new ColorCube(0.4));
28.
29.   // Create a new Behavior object that performs the desired
30.   // operation on the specified transform object and add it into
31.   // the scene graph.
32.   Transform3D yAxis = new Transform3D();
33.   Alpha rotationAlpha = new Alpha(-1, 4000);
34.
35.   RotationInterpolator rotator =
36.       new RotationInterpolator(rotationAlpha, objSpin, yAxis,
37.       0.0f, (float) Math.PI*2.0f);
38.
39.   // a bounding sphere specifies a region a behavior is active
40.   // create a sphere centered at the origin with radius of 1
41.   BoundingSphere bounds = new BoundingSphere();
42.   rotator.setSchedulingBounds(bounds);
43.   objSpin.addChild(rotator);
44.
45.   return objRoot;
46. } // end of createSceneGraph method of HelloJava3Dd
Figura 1-20 Escenario Gr�fico del Ejemplo HelloJava3Dd

La imagen de la Figura 1-21 muestra un marco del ColorCube en movimiento del programa HelloJava3Dd.

Figura 1-21 Imagen del ColorCube en movimiento

COMPARTE ESTE ARTÍCULO

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

SIGUIENTE ARTÍCULO