El API Java 3D
edwink20 de Octubre de 2014
8.930 Palabras (36 Páginas)278 Visitas
El API 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).
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:
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.
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.
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
...