Java 3D

Una clase Loader lee ficheros de escenas 3D (no ficheros Java 3D) y crea representaciones Java 3D de sus contenidos que pueden ser aadidos selectivamente a un mundo Java 3D y argumentados por otro cdigo Java 3D. El paquete com.sun.j3d.loaders proporciona el contenido principal para convertir los ficheros creados en otras aplicaciones en aplicaciones Java 3D. Las clases cargadoras implementan el interface Loader definido en el paquete com.sun.j3d.loaders.

Como hay una gran variedad de formatos de ficheros para porpsitos de representacin de escenas 3D (por ejemplo, .obj, .vrml, etc.) y siempre habr ms formatos de ficheros, el cdigo real para cargar un fichero no forma parte de Java 3D o del paquete loaders; slo se incluye el interface para el mecanismo de carga. Con la definicin del interface, el usuario de Java 3D puede desarrollar clases cargadoras de ficheros con el mismo interface que las otras clases cargadoras.

.Ejemplo de Usos de un Loader

Sin una clase que realmente lea el fichero, no es posible cargar su contenido. Con una clase Loader es sencillo. La siguiente lista presenta la receta para usar un cargador.

  1. encontrar un cargador (si no hay ninguno disponible, los escribimos)
  2. importar la clase cargador para nuestro formato de fichero
  3. importar otras clases necesarias
  4. declarar una variable Scene (no usar el constructor)
  5. crear un objeto loader
  6. cargar el fichero en un bloque try, asignar el resultado a la variable Scene
  7. insertar el Scene dentro del escenariog grfico

Con el JDK 1.2 se distribuye una clase basada en este ejemplo, se encuentra en jdk1.2/demo/java3d/ObjLoad. El Fragmento de Cdigo 3-1 presenta un extracto del cdigo de esta demo.

La clase ObjectFile se distribuye con el paquete com.sun.j3d.loaders como ejemplo. La Tabla 3-1 muestra algunos otros ejemplos de cargadores disponibles.

Clase ObjectFile

Paquete: com.sun.j3d.loaders

Implementa: Loader

La clase ObjectFile implementa el interface Loader para el formato de fichero de Wavefront ".obj", un formato de ficheros de objetos 3D estndard creado por el uso de Wavefront's Advanced Visualizer _. Los ficheros Object estn basados en texto soportanto tanto geometra poligonal como de forma libre (curvas y superficies). El cargador de ficheros .obj de Java 3D soporta un subconjunto de formatos de ficheros, pero es completamente suficiente para cargar casi todos los ficheros Object disponibles. La geometra de forma libre no est soportada.

Fragmento de Cdigo 3-1, un extracto de jdk1.2/demo/java3d/ObjLoad/ObjLoad.java
1.     import com.sun.j3d.loaders.objectfile.ObjectFile;
2.     import com.sun.j3d.loaders.ParsingErrorException;
3.     import com.sun.j3d.loaders.IncorrectFormatException;
4.     import com.sun.j3d.loaders.Scene;
5.     import java.applet.Applet;
6.     import javax.media.j3d.*;
7.     import javax.vecmath.*;
8.     import java.io.*;
9.
10.   public class ObjLoad extends Applet {
11.
12.   private String filename = null;
13.
14.   public BranchGroup createSceneGraph() {
15.   // Create the root of the branch graph
16.   BranchGroup objRoot = new BranchGroup();
17.
18.   ObjectFile f = new ObjectFile();
19.   Scene s = null;
20.   try {
21.       s = f.load(filename);
22.   }
23.   catch (FileNotFoundException e) {
24.       System.err.println(e);
25.       System.exit(1);
26.   }
27.   catch (ParsingErrorException e) {
28.       System.err.println(e);
29.       System.exit(1);
30.   }
31.   catch (IncorrectFormatException e) {
32.       System.err.println(e);
33.       System.exit(1);
34.   }
35.
36.    objRoot.addChild(s.getSceneGroup());
37.   }

Este programa trata sobre aadir comportamientos (el efecto por defecto, o la interaccin con el ratn - cubierto en el Captulo 4) y luces (Captulo 6) para proporcionar una renderizacin sombreada del modelo del objeto. Por supuesto, podemos hacer muchas otras cosas con el modelo en un programa Java 3D como aadir animaciones, aadir otras geomtrias, cambiar el color del modelo, etc.

Dentro de la distribucin del JDK 1.2 tenemos un ejemplo de loader en jdk1.2/demos/java3d/lightwave/Viewer.java. Este cargador carga las luces y animaciones espacificadas en un fichero .lws de Lightwave.

.Cargadores Disponibles Pblicamente

En Java 3D existen varias clases cargadoras. La siguiente tabla lista los formatos de ficheros cuyos cargadores estn disponibles pblicamente. En el momento de escribir esto, al menos hay disponible una clase cargador por cada uno de estos formatos de fichero:

Formato de Fichero Descripcin
3DS 3D-Studio
COB Caligari trueSpace
DEM Digital Elevation Map
DXF AutoCAD Drawing Interchange File
IOB Imagine
LWS Lightwave Scene Format
NFF WorldToolKit NFF format
OBJ Wavefront
PDB Protein Data Bank
PLAY PLAY
SLD Solid Works (prt and asm files)
VRT Superscape VRT
VTK Visual Toolkit
WRL Virtual Reality Modeling Language

Tabla 3-1, Cargadores Java 3D disponibles Pblicamente

Puedes localizar estos cargadores desde la pgina principal de Java 3D: http://java.sun.con/products/java-media/3d.

.Interfaces y Clases Base del Paquete Loader

Esta gran varidad de cargadores existe para hacer ms sencilla la escritura de cargadores para los diseadores Java 3D. Las clases Loader son implementaciones del interface Loader que baja el nivel de dificultad para escribir un cargador. Como en el ejemplo, un programa que carga un fichero 3D realmente usa un cargador y un objeto escena. El cargador lee, analiza y crea la representacin Java 3D de los contenidos del fichero. El objeto escena almacena el escenario grafico creado por el cargador. Es posible cargar escenas desde ms de un fichero (del mismo formato) usando el mismo objeto cargador y crear mltiples objetos escena. Los ficheros de diferentes formatos pueden combinarse en un programa Java 3D usando las clases cargadoras apropiadas.

El siguiente bloque de referencia lista los interface del paquete com.sun.j3d.loaders. Un loader implementa el interface loader y usa una clase que implementa el interface scene.

Sumario de Interfaces de com.sun.j3d.loaders

  • Loader. El interface Loader se usa para especificar la localizacin y los elementos de un formato de fichero a cargar.
  • Scene. El interface Scene es un conjunto de mtodos usado para extraer informacin de escenario grfico Java 3D de una utilidad cargador de ficheros.

Adems de estos interfaces, el paquete com.sun.j3d.loaders proporciona implementaciones bsicas de los interfaces.

Sumario de Clases de com.sun.j3d.loaders

  • LoaderBase. Esta clase implementa el interface Loader y aade constructores. Esta clase es extendida por los autores para especificar clases cargadoras.
  • SceneBase. Esta clase implementa el interface Scene y aade mtodos usados por los cargadores. Esta clase tambin es usada por los programas que usan clases cargadoras.

Sumario de Mtodos del Interface Loader

Paquete: com.sun.j3d.loaders

El interface Loader se usa para especificar la localizacin y los elementos de un formato de fichero a cargar. Este interface se utiliza para darle a los cargadores de varios formatos de ficheros un interface pblico comn. Idealmente el interface Scene ser implementado para darle al usuario un interface consistente para extraer los datos.

Scene load(java.io.Reader reader)

Este mtodo carga el Reader y devuelve el objeto Scene que contiene la escena.

Scene load(java.lang.String fileName)

Este mtodo carga el fichero nombrado y devuelve el objeto Scene que contiene la escena.

Scene load(java.net.URL url)

Este mtodo carga el fichero nombrado y devuelve el objeto Scene que contiene la escena.

void setBasePath(java.lang.String pathName)

Este mtodo selecciona el nombre del path base para los ficheros de datos asociados con el fichero pasado en el mtodo load(String).

void setBaseUrl(java.net.URL url)

Este mtodo selecciona el nombre de la URL base para los ficheros de datos asociados con el fichero pasado en el mtodo load(String).

void setFlags(int flags)

Este mtodo selecciona las banderas de carga para el fichero.

  • LOAD_ALL. Esta bandera activa la carga de todos los objetos en la escena.
  • LOAD_BACKGROUND_NODES. Esta bandera activa la carga de los objetos del fondo en la escena.
  • LOAD_BEHAVIOR_NODES. Esta bandera activa la carga de comportamientos en la escena.
  • LOAD_FOG_NODES. Esta bandera activa la carga de objetos niebla en la escena.
  • LOAD_LIGHT_NODES. Esta bandera activa la carga de objetos luces en la escena.
  • LOAD_SOUND_NODES. Esta bandera activa la carga de objetos de sonido en la escena.
  • LOAD_VIEW_GROUPS. Esta bandera activa la carga de objetos vista (cmara) en la escena.

La clase LoaderBase proporciona una implementacin para cada uno de los tres mtodos load() del interface Loader. LoaderBase tambin implementa dos constructores. Observa que los tres mtodos cargadores devuelven un objeto Scene.

Sumario de Constructores de la Clase LoaderBase

Paquete: com.sun.j3d.loaders

Implementa: Loader

Esta clase implementa el interface Loader. El autor de un cargador de ficheros debera extender esta clase. El usuario de un cargador de ficheros debera usar estos mtodos.

LoaderBase()

Construye un Loader con los valores por defecto para todas las variables.

LoaderBase(int flags)

Construye un loader con las banderas especificadas.

Lista Parcial (mtodos usados por usuarios) de la Clase SceneBase

Background[] getBackgroundNodes()
Behavior[] getBehaviorNodes()
java.lang.String getDescription()
Fog[] getFogNodes()
float[] getHorizontalFOVs()
Light[] getLightNodes()
java.util.Hashtable getNamedObjects()
BranchGroup getSceneGroup()
Sound[] getSoundNodes()
TransformGroup[] getViewGroups()

.Escribir un Loader

Como se mencion arriba, la caracterstica ms importante de los cargadores es que podemos escribir el nuestro propio, lo que significa que todos los usuarios de Java 3D tambin pueden hacerlo!

Para escribir un cargador, debemos extender la clase LoaderBase definida en el paquete com.sun.j3d.loaders. El nuevo cargador usar la clase Scene del mismo paquete.

Los futuros cargadores deberan tener poca necesitad de subclasificar SceneBase, o de implementar directamente Scene, ya que la funcionalidad de SceneBase es bastante correcta. Esta clase es responsable del almacenamiento y recuperacin de datos creados por un cargador mientras lee un fichero. Los mtodos de almacenamiento (usados slo por los autores del Loader) son todas las rutinas add*. Los mtodos recuperadores (usados principalmente por los usuarios de Loader) son todas las rutinas get*.

Escribir un cargador de ficheros puede ser bastante complejo dependiendo de la complejidad del formato del fichero. La parte ms dura es analizar el fichero. Por supuesto, tenemos que empezar con la documentacin del formato de fichero para el que queremos escribir la clase Loader. Una vez que se entiende el formato, empezamos leyendo las clase bases de loader y scene. La nueva clase loader extender la clase base loader y usar la clase base scene.

En la extensin del clase loader base, la mayora del trabajo ser escribir mtodos que reconozcan los distintos tipos de contenidos que se pueden representar en el formato del fichero. Cada uno de esos mtodos crea el correspondiente componente Java 3D del escenario grfico y lo almacena en un objeto scene.

Sumario de Constructores de la Clase SceneBase

Paquete: com.sun.j3d.loaders

Implementa: Scene

Esta clase implementa el interface Scene y lo ampla para incorporar utilidades que podran usars los cargadores. Esta clase es responsable del almacenamiento y recuperacin de los datos de la escena.

SceneBase()

Crea un objeto SceneBase - no debera haber ninguna razn para usar este constructor excepto en la implementacin de una nueva clase de loader.

.GeometryInfo

Si no tenemos acceso a los ficheros de modelos geomtricos o a software de modelado geomtrico, tenemos que crear nuestra geometra a mano. Como se mencion en captulos anteriores, esta codificacin de geometra a mano requiere mucho tiempo y es una actividad muy propensa a errores. Como sabemos, cuando especifamos geometras a travs de las clases corazn, estamos limitados a tringulos y cuadrados. Usando las clase de utilidad GeometryInfo se puede mejorar el tiempo empleado y el trabajo tedioso de la creaccin de geometras. En lugar de especificar cada tringulo, podemos especificar polgonos arbitrarios, que pueden ser cncavos, polgonos no planos, e incluso con agujeros. El objeto GeometryInfo, y otras clases de utilidad, convierten esta geometra en geometra tirangular que Java 3D puede renderizar.

Por ejemplo, si queremos crear un coche en Java 3D, en vez de especificar tringulos, podemos espcificar el perfil del coche como un polgono en un objeto GeometryInfo. Luego, usando un objeto Triangulator, el polgono puede subdividirse en tringulos. La imagen de la izquierda de la figura 3-2 muestra el perfil de un coche como un polgono. El imagen de la derecha es el polgonos subdividido en tringulos.

Figura 3-2, un Polgono GeometryInfo y una posible Triangulacin

Si estamos interesados en el rendimiento, y quin no?, usamos un objeto Stripifier para convertir los tringulos en franjas de tringulos. Si queremos sombrear el objeto visual, usamos el NormalGenerator para calcular las superficies y la geometra.

El programa GeomInfoApp.java, usa las clases GeometryInfo, Triangulator, Stripifier, y NormalGeneration para crear un coche. La Figura 3-3 muestra dos renderizaciones podrucidas por GeomInfoApp.java. En ambas, las lneas azules muestran los contornos especificados en el objeto GeometryInfo. Los tringulos rojos (rellenos y sombreados a la ziquierda y enmarcados a la derecha) fueron calculados automticamente por el objeto GeometryInfo con Triangulation, NormalGeneration, y Stripification.

Figura 3-3, dos Renderizaciones de un Coche (en direcciones opuestas) Creadas usando GeometryInfo

Un sencillo polgono plano, similar al de la figura 3-2, especifica el perfil de un coche (cada lado) en el ejemplo GeomInfoApp.

.Sencillo Ejemplo de GeometryInfo

Usar un objeto GeometryInfo es tan sencillo como usar las clases corazn GeomertryArray si no ms sencillo. En la creaccin de un objeto GeomertyInfo, simplemente especificamos el tipo de geometra que vamos a necesitar. Las opciones son POLYGON_ARRAY, QUAD_ARRAY, TRIANGLE_ARRAY, TRIANGLE_FAN_ARRAY, y TRIANGLE_STRIP_ARRAY. Entonces seleccionamos las coordenadas y el contador de franjas. No tenemos que decirle al objeto GeometryInfo cuntas coordenadas hay en los datos; se calcularn automticamente.

El Fragmento de Cdigo 3-2 muestra un ejemplo de aplicacin GeometryInfo. Las lneas 1-3 muestran la creaccin de un objeto GeometryInfo y la especificacin de la geometra inicial.

Despus de haber creado el objeto GeometryInfo, podran usarse las otras clases. Si queremos usar el NormalGenerator, por ejemplo, primero creamos un objeto NormalGenerator, luego le pasamos el objeto GeometryInfo. Las lneas 8 y 9 hacen exactamente esto.

Fragmento de Cdigo 3-2, Usar un GeometryInfo, y las utilidades Triangulator, NormalGenerator, y Stripifier
1.     GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
2.     gi.setCoordinates(coordinateData);
3.     gi.setStripCounts(stripCounts);
4.
5.     Triangulator tr = new Triangulator();
6.     tr.triangulate(gi);
7.
8.     NormalGenerator ng = new NormalGenerator();
9.     ng.generateNormals(gi);
10.
11.   Stripifier st = new Stripifier();
12.   st.stripify(gi);
13.
14.   Shape3D part = new Shape3D();
15.   part.setAppearance(appearance);
16.   part.setGeometry(gi.getGeometryArray());

.Clases para GeometryInfo

La clase GeometryInfo y sus clases relacionadas son miembros del paquete com.sun.j3d.util.geometry y son subclases de Object. La Figura 3-4 muestra el rbol de estas clases.

Figura 3-4, rbol de clases de GeometryInfo y clases relacionadas

La clase GeometryInfo slo tiene un constructor y en l especificamos el tipo de geometra a especificar por las coordenadas.

Sumario de Constrcutores de la Clase GeometryInfo

Paquete: com.sun.j3d.utils.geometry

Extiende: java.lang.Object

El objeto GeometryInfo es donde ponemos nuestra geometra si queremos usar las libreras de utilidades de Java 3D. Una vez que tenemos los datos en el objeto GeometryInfo, podemos enviarlo a cualquiera (o a todas) las clases de utilidades para realizar operaciones sobre ellas, como generar superficies o convertirlo en franjas largas para una renderizacin ms eficiente. La geometra se carga tal como es en el objeto GeometryArray de Java 3D, pero hay unas pocas opciones para obtener datos del objeto. La propia GeometryInfo contiene algunas sencillas utilidades, como el clculo de ndices para datos no indexados y obtener datos no usados en nuestra informacin de geometra indexada ("compactacin").

GeometryInfo(int primitive)

Construye y un objeto GeometryInfo, donde "primitive" es uno de

  • POLYGON_ARRAY posiblemente multi-contorno, posiblemente polgonos no planos
  • QUAD_ARRAY cada conjunto de cuatro vrtices forma un cuadrado independiente
  • TRIANGLE_ARRAY cada conjunto de tres vrtices forma un tringulo independiente
  • TRIANGLE_FAN_ARRAY el array stripCounts indica cuntos vrtices usar para cada pala de tringulo
  • TRIANGLE_STRIP_ARRAY el array stripCounts cuantos vrtices se usarn por cada franja de tringulo

La clase GeometryInfo tiene muchos mtodos. Muchos de ellos son para seleccionar (u obtener) datos de coordenadas, colores, ndices, superficies o de coordenadas de textura. La mayora de las aplicaciones slo usarn unos pocos de estos mtodos. Sin embargo, es conveniente poder especificar la geometra a cualquier nivel de detalle y deja el resto calculado.

Lista Parcial de Mtodos de la Clase GeometryInfo

void recomputeIndices()

Reconstruye los ndices para garantizar la informacin de conexin.

void reverse()

Invierte el orden de todas las listas.

void setColorIndices(int[] colorIndices)

Selecciona el array de ndices en un array Color.

void setColors(Color3f[] colors)

Selecciona el array de colores.

void setColors(Color4f[] colors)

Selecciona el array de colores, Hay otros mtodos setColors.

void setContourCounts(int[] contourCounts)

Selecciona la lista del contador de contornos.

void setCoordinateIndices(int[] coordinateIndices)

Selecciona el array de ndices en el array de coordenadas.

void setCoordinates(Point3f[] coordinates)

Selecciona el array de coordenadas.

void setCoordinates(Point3d[] coordinates)

Selecciona el array de coordenadas. Hay otros mtodos setCoordinates.

void setNormalIndices(int[] normalIndices)

Selecciona el array de ndices en el array de superficies normales.

void setNormals(Vector3f[] normals)

Selecciona el array de superficies normales.

void setNormals(float[] normals)

Selecciona el array de superficies normales.

void setStripCounts(int[] stripCounts)

Selecciona el array del contador de franjas.

void setTextureCoordinateIndices(int[] texCoordIndices)

Selecciona el array de ndices en el array de coordenadas de textura.

void setTextureCoordinates(Point2f[] texCoords)

Selecciona el array de coordenadas de textura. Hay otros mtodos setTextureCoordinates.

Todas las clases de 'ayuda' de GeometryInfo se usan de forma similar. Los siguientes bloques de referencia muestran los constructoes y mtodos para Triangulator, Stripifier, y NormalGenerator, en este orden, que es el orden en que se usaran para un POLYGON_ARRAY.

La utilidad Triangulator slo se usa con geometra POLYGON_ARRAY. Otros objetos GeometryInfo con otras geometras primitivas slo usaran Stripifier y NormalGenerator.

El constructor por defecto para la clase Triangulator simplemente crea un objeto Triangulation.

Sumario de Constructores de la Clase Triangulator

Paquete: com.sun.j3d.utils.geometry

Extiende: java.lang.Object

Triangulator es una utilidad para convertir polgonos arbitraros en tringulos para que puedan ser renderizados por Java 3D. Los polgonos pueden ser cncavos, no planos, y pueden contener agujeros.

Triangulator()

Creata un uevo ejemplar de Triangulator.

El nico mtodo de la clase Triangulator es para triangular un objeto GeometryInfo.

Sumario de Mtodos de la Clase Triangulator

void triangulate(GeometryInfo gi)

Esta rutina convierte el objeto GeometryInfo desde el tipo primitivo POLYGON_ARRAY al tipo primitivo TRIANGLE_ARRAY usando tcnicas de descomposicin de polgonos.

El nico constructor de la clase Stripifier crea un objeto stripification.

Sumario de Constructores de la Clase Stripifier

Paquete: com.sun.j3d.utils.geometry

Extiende: java.lang.Object

La utilidad Stripifier cambia el tipo primitivo del objeto GeometryInfo a una franja de tringulos. Las franjas se hacen analizando los tringulos en los datos originales y conectndolos juntos.

Para obtener un mejor resultado se debe realizar antes un NormalGeneration sobre el objeto GeometryInfo.

Stripifier()

Crea el objeto Stripifier.

El nico mtodo de la clase Stripifier es para convertir la geometra de un objeto GeometryInfo.

Sumario de Mtodos de la Clase Stripifier

void stripify(GeometryInfo gi)

Cambia la geometra contenida en el objeto GeometryInfo en un array de franjas de tringulos.

La clase NormalGenerator tiene dos constructores. El primero construye un NormalGenerator con un valor por defecto para el ngulo de pliegue. El segundo constructor permite la especificacin del ngulo de pliegue.

Sumario de Constructores de la Clase NormalGenerator

Paquete: com.sun.j3d.utils.geometry

Extiende: java.lang.Object

La utilidad NormalGenerator calcula y rellena en las superficies de un objeto GeometryInfo. Las superficies normales se estiman basndose en el anlisis de la informacin de coordenadas indexadas. Si nuestros datos no estn indexados, se creara una lista de ndices.

Si dos (o ms) tringulos del modelo comparten el mismo ndice de coordenadas el normalgenerator intentar generar una superficie para el vrtice, resultando en una superficie pulida. Si dos coordenadas no tienen el mismo ndice entonces tendrn dos superficies separadas, incluso si tienen la misma posicin. Esto resultar en un "pliegue" en nuestro objeto. Si sospechamos que nuestros datos no estn indexados apropiadamente, debemos llamar a GeometryInfo.recomputeIndexes().

Por supuesto, algunas veces, nuestro modelo tiene un pliegue. Si dos superficies triangulares difieren por ms de creaseAngle, entonces el vrtice obtendr dos superficies separadas, creando un pliegue discontino en el modelo. Esto es perfecto para el borde de un tabla o la esquina de un cubo, por ejemplo.

NormalGenerator()

Construye un NormalGenerator con el ngulo de pliegue por defecto (0.76794 radianes, o 44).

NormalGenerator(double radians)

Construye un NormalGenerator con el ngulo de pliegue especificado en radianes.

Entre los mtodos de la clase NormalGenerator se incluyen algunos para seleccionar u obtener el ngulo de pliegue, y clculo de superficies para la geometra de un objeto GeometryInfo.

Sumario de Mtodos de la Clase NormalGenerator

void generateNormals(GeometryInfo geom)

Genera superficies para el objeto GeometryInfo.

double getCreaseAngle()

Devuelve el valor actual para el ngulo de pliegue, en radianes.

void setCreaseAngle(double radians)

Selecciona el ngulo de pliegue en radianes.

.Texto 2D

Hay dos formas de aadir texto a una escena Java 3D. Una forma es usar la clase Text2D y otra es usar la clase Text3D. Obviamente, la diferencia es que los objetos Text2D tienen dos dimensiones y los objetos Text3D tienen tres dimensiones. Otra diferencia significante es la forma en que se crean estos objetos.

Los objetos Text2D son polgonos rectangulares con el texto aplicado como una textura. Los objetos Text3D son objetos 3D geomtricos creados como un extrusin del texto.

Como una subclase de Shape3D, los ejemplares de Text2D pueden ser hijos de objetos group. Para situar un objeto Text2D en una escena Java 3D, simplemente creamos el objeto Text2D y lo aadimos al escenario grfico. Aqu tenemos una sencilla receta.

  1. Crer un objeto Text2D
  2. Aadirlo al escenario grfico

Los objetos Text2D se implementan usando un polgono y una textura. El polgono es transparente para que slo sea visible la textura. La textura es la cadena de texto seleccionada con los parmetros de fuente y tipo especifiados. Los tipos de letras disponibles dependen de nuestro sistema. Normalmente, estn disponibles Courier, Helvetica, TimesRoman, entre otros. Cualquier fuente disponible en el AWT tambin est disponible para aplicaciones Text2D (y Text3D).

.Ejemplo de Text2D

El Fragmento de Cdigo 3-3 muestra un ejemplo de adicin de texto 2D a una escena. El objeto Text2D se crea en las lneas 21 a 23. En este constructor, se especifican la cadena de texto, el color, el tipo, el tamao y el estilo de la fuente. El objeto Text2D se aade a la escena en la lnea 24. Observa la sentencia import para Font (lnea 5) usada para las constantes de estilos de fuente.

Fragmento de Cdigo 3-3, un objeto Text2D
1.     import java.applet.Applet;
2.     import java.awt.BorderLayout;
3.     import java.awt.Frame;
4.     import java.awt.event.*;
5.     import java.awt.Font;
6.     import com.sun.j3d.utils.applet.MainFrame;
7.     import com.sun.j3d.utils.geometry.Text2D;
8.     import com.sun.j3d.utils.universe.*;
9.     import javax.media.j3d.*;
10.   import javax.vecmath.*;
11.
12.   // Text2DApp renders a single Text2D object.
13.
14.   public class Text2DApp extends Applet {
15.
16.   public BranchGroup createSceneGraph() {
17.   // Create the root of the branch graph
18.   BranchGroup objRoot = new BranchGroup();
19.
20.   // Create a Text2D leaf node, add it to the scene graph.
21.   Text2D text2D = new Text2D("2D text is a textured polygon",
22.   new Color3f(0.9f, 1.0f, 1.0f),
23.   "Helvetica", 18, Font.ITALIC));
24.   objRoot.addChild(text2D);

Text2DApp.java es un programa completo que incluye el fragmento de cdigo anterior. En este ejemplo, el objeto Text2D rota sobre el origen de la escena. Cuando se ejecuta la aplicacin podemos ver, por defecto, que el polgono texturado no es visible cuando se ve desde atrs.

Figura 3-6, Imagen de Text2DApp.java

Algunos atributos de un objeto Text2D se pueden modificar variando le paquete de apariencia referenciado y/o el NodeComponent. El Fragmento de Cdigo 3-4 muestra el cdigo que modifica el objeto text2d, creado en el Fragmento de Cdigo 3-3.

Fragmento de Cdigo 3-4, Haciendo visibles los dos lados de un objeto Text2D
25.   Appearance textAppear = text2d.getAppearance();
26.
27.   // The following 4 lines of code make the Text2D object 2-sided.
28.   PolygonAttributes polyAttrib = new PolygonAttributes();
29.   polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
30.   polyAttrib.setBackFaceNormalFlip(true);
31.   textAppear.setPolygonAttributes(polyAttrib);

La textura creada por un objeto Text2D tambin puede aplicarse a otros objetos visuales. Ya que la aplicacin de texturas a objetos visuales es el objetivo del Captulo 7 lo dejaremos aqu.

.Clases Usadas para Crear Objetos Text2D

La nica clase necesaria es la clase Text2D. Como podemos ver de la Figura 3-7, Text2D es una clase de utilidad que desciende de Shape3D.

Figura 3-7, El rbol de Clases de Text2D

Sumario de Constructores de la Clase Text2D

Paquete: com.sun.j3d.utils.geometry

Esta clase crea un rectngulo de textura mapeado que muestra la cadena de texto enviada por el usuario, dndole la apariencia suministrada en los parmetros de usuario. El tamao del rectngulo (y su mapa de textura) est determinado por los parmetros de la fuente pasados al constructor. El objeto Shape3D resultante es un rectngulo transparente (excepto el texto) localizado en (0, 0, 0).

Text2D(java.lang.String text, Color3f color, java.lang.String fontName, 
		int fontSize, int fontStyle)

Constructor.

Con el constructor Text2D, hay un mtodo. Este mtodo selecciona el factor de escala para crear objetos Text2D mayores o menores que el tamao de punto especificado. Este mtodo no es til en la versin 1.1.x del API, ya que slo se utiliza cuando se especifica el texto. En la versin 1.2 se ha introducido un mtodo setText() haciendo til el setRectangleScaleFactor().

Sumario de Mtodos de la Clase Text2D

void setRectangleScaleFactor(float newScaleFactor)

Selecciona el factor de escala usado para convertir la anchura/altura de la imagen.

.Texto 3D

Otra forma de aadir texto a un mundo virtual Java 3D es crear un objeto Text3D para texto. Mientras que Text2D crea el texto con un textura, Text3D crea texto usando geometra. La geometra textual de un objeto Text3D es una extrusin de la fuente.

Crear un objeto Text3D es un poco ms complicado que crear un objeto Text2D. El primer paso es crear un objeto Font3D con el tipo de fuente, el tamao y el estilo seleccionado. Luego se crea un objeto Text3D para una cadena particular usando el objeto Font3D. Como la clase Text3D es una subclase de Geometry, el objeto Text3D es un NodeComponent que es referenciado por uno o ms objetos Shape3D:

  1. Crear un objeto Font3D desde una fuente AWT
  2. Crear un objeto Text3D para un string usando el objeto Font3D, opcionalmente especificando un punto de referencia
  3. Referenciar el objeto desde un objeto Shape3D aadido al escenario grfico

.Ejemplo de Text3D

El Fragmento de Cdigo 3-5 muestra la construccin bsica de un objeto Text3D. El objeto Font3D se crea en las lneas 19 y 20. El tipo usado es "Helvetica". Igual que en Text2D, cualquier tipo disponible en el AWT puede ser usado para Font3D y por lo tanto en el objeto Text3D. Este constructor de Font3D (lneas 19 y 20) tambin selecciona el tamao de la fuente a 10 puntos y usa la extrusin por defecto.

La sentencia de las lneas 21 y 22 crea un objeto Text3D usando el objeto Font3D recientemente creado para la cadena "3DText" mientras especifica un punto de referencia para el objeto. Las ltimas dos sentencias crean un objeto Shape3D para el objeto Text3D y lo aaden al escenario grfico. Observa que la sentencia import de la lnea 5 es necesaria porque se usa un objeto Font para la creaccin de Font3D.

Fragmento de Cdigo 3-5, Crear un objeto Visual Text3D
1.     import java.applet.Applet;
2.     import java.awt.BorderLayout;
3.     import java.awt.Frame;
4.     import java.awt.event.*;
5.     import java.awt.Font;
6.     import com.sun.j3d.utils.applet.MainFrame;
7.     import com.sun.j3d.utils.universe.*;
8.     import javax.media.j3d.*;
9.     import javax.vecmath.*;
10.
11.   // Text3DApp renders a single Text3D object.
12.
13.   public class Text3DApp extends Applet {
14.
15.   public BranchGroup createSceneGraph() {
16.   // Create the root of the branch graph
17.   BranchGroup objRoot = new BranchGroup();
18.
19.   Font3D font3d = new Font3D(new Font("Helvetica", Font.PLAIN, 10),
20.   new FontExtrusion());
21.   Text3D textGeom = new Text3D(font3d, new String("3DText"),
22.   new Point3f(-2.0f, 0.0f, 0.0f));
23.   Shape3D textShape = new Shape3D(textGeom);
24.   objRoot.addChild(textShape);

La Figura 3-9 muestra un objeto Text3D que ilustra la extrusin del tipo. En la figura, la extrusin se muestra en gris mientras que el tipo se muestra en negro. Para recrear esta figura en Java 3D, son necesarios un objeto Material y otro DirectionalLight. No podemos seleccionar el color de los vrtices individuales en el objeto Text3D porque no tenemos acceso a la geometra del objeto Text3D.

Figura 3-9, Punto de Referencia por Defecto y Extrusin de un Objeto 3DText

El texto de un objeto Text3D puede orientarse de una gran cantidad de formas. La orientacin se especifica como el camino de direccin. Las direcciones son right, left, up, y down.

Cada objeto Text3D tiene un punto de referencia. El punto de referencia para un objeto Text3D es el origen del objeto. El punto de referencia de cada objeto se define por la combinacin del camino y la alineacin del texto. La Tabla 3-2 muestra los efectos de las especificaciones del camino y la alineacin sobre la orientacin del texto y la situacin del punto de referencia.

La situacin del punto de referencia puede definirse explcitamente sobreescribiendo el camino y la alineacin.

Tabla 3-2

Los objetos Text3D tienen superficies. La adiccin de un paquete de apariencia que incluye un objeto Material a un objeto Shape3D referenciando la geometra Text3D permitir la iluminacin del objeto Text3D.

.Clases Usadas en la Creacin de Objetos Text3D

Esta seccin presenta el material de referencia para tres clases usadas en la creaccin de objetos Text3D: Text3D, Font3D, y FontExtrusion, en este orden. La Figura 3-10 muestra el rbol de clases de Text3D.

Figura 3-10, rbol de Clases de Text3D

La clase Text3D define varios constructores. Cada uno permite especificar ninguno, uno o todos los atributos de un objeto Text3D.

Sumario de Constructores de la Clase Text3D

Un objeto Text3D es una cadena de texto que se ha convertido en una geometra 3D. El objeto Font3D determina la apariencia del objeto NodeComponent. Cada objeto Text3D tiene una posicin - un punto de referencia que sita el objeto Text3D. El texto 3D puede situarse alrededor de su posicin usando diferentes alineamientos y caminos.

Text3D()

Crea un objeto Text3D vaco. Los valores por defecto usados para este y otros constructores son:

  • font 3D null
  • string null
  • position (0,0,0)
  • alignment ALIGN_FIRST
  • path PATH_RIGHT
  • character spacing 0.0
Text3D(Font3D font3D)

Crea un objeto Text3D con el objeto Font3D dado.

Text3D(Font3D font3D, String string)

Crea un objeto Text3D dando un objeto Font3D y una cadena de texto.

Text3D(Font3D font3D, String string, Point3f position)

Crea un objeto Text3D dando un objeto Font3D y una cadena de texto. El punto de posicin define un punto de referencia para el objeto Text3D. Su posicin se define en relacin a la esquina inferior iquierda frontal de la geometra.

Text3D(Font3D font3D, String string, Point3f position,
int alignment, int path)

Crea un objeto Text3D dando un objeto Font3D y una cadena de texto.

  • ALIGN_CENTER alineamiento: el centro de la cadena se sita en el punto de posicin.
  • ALIGN_FIRST alineamiento: el primer caracter de la cadena se sita en el punto de posicin.
  • ALIGN_LAST alineamiento: el ltimo caracter de la cadena se sita en el punto de posicin.
  • PATH_DOWN camino: las letras sucesivas se situarn debajo de la letra actual.
  • PATH_LEFT camino: las letras sucesivas se situarn a la izquierda de la letra actual.
  • PATH_RIGHT camino: las letras sucesivas se situarn a la derecha de la letra actual.
  • PATH_UP camino: las letras sucesivas se situarn sobre la letra actual.

La clase Text3D tambin define varios mtodos. Cada uno de ellos nos permite modificar (seleccionar) los atributos del objeto Text3D. Esta clase tambin define los correspondientes mtodos get*.

Sumario de Mtodos de la Clase Text3D

void setAlignment(int alignment)

Selecciona la poltica de alineamiento para este objeto Text3D NodeComponent.

void setCharacterSpacing(float characterSpacing)

Selecciona el espaciado entre caracteres cuando se construye la cadena Text3D.

void setFont3D(Font3D font3d)

Selecciona el objeto Font3D usado para este objeto Text3D NodeComponent.

void setPath(int path)

Selecciona la direccin del camino del nodo.

void setPosition(Point3f position)

Selecciona el punto de referencia del nodo.

void setString(java.lang.String string)

Copia la cadena de caracteres desde el parmetro suministrado dentro del nodo Text3D.

Sumario de Capacidades de la Clase Text3D

  • ALLOW_ALIGNMENT_READ | WRITE permite leer (escribir) el valor de alineamiento del texto.
  • ALLOW_BOUNDING_BOX_READ permite leer el valor de la caja que rodea la cadena de texto.
  • ALLOW_CHARACTER_SPACING_READ | WRITE permite leer (escribir) el valor del espaciado entre caracteres.
  • ALLOW_FONT3D_READ | WRITE permite leer (escribir) la informacin del componente Font3D.
  • ALLOW_PATH_READ | WRITE permite leer (escribir) el valor del camino del texto.
  • ALLOW_POSITION_READ | WRITE permite leer (escribir) el valor de la posicin del texto.
  • ALLOW_STRING_READ | WRITE permite leer (escribir) el objeto String.

Cada objeto Text3D se crea desde un objeto Font3D. Un slo objeto Font3D puede usarse para crear un nmero ilimitado de objetos Text3D. Un objeto Font3D contiene la extrusin geomtrica de cada caracter en el tipo de letra. Un objeto Text3D copia las geometras para formar la cadena especificada. Los objetos Font3D pueden ser recolectados por el recolector de basura sin afectar a los objetos Text3D creados a partir de l.

Sumario de Constructores de la Clase Font3D

Extiende: java.lang.Object

Una fuente 3D consiste en una fuente Java 2D y un camino de extrusin. Este camino de extrusin describe cmo vara el flanco de una letra en el eje Z. El objeto Font3D se usa para almacenar letras 2D extrusionadas. Estas letras 3D pueden usarse para construir objetos Text3D NodeComponent. Las fuentes 3D personalizadas as como el almacenamiento de fuentes 3D en disco se cubriran en una futura versin de Java 3D.

Tambin puedes ver : java.awt.Font, FontExtrusion, Text3D

Font3D(java.awt.Font font, FontExtrusion extrudePath)

Crea un objeto Font3D desde el objeto Font especificado.

Sumario de Mtodos de Font3D

void getBoundingBox(int glyphCode, BoundingBox bounds)

Devuelve la caja 3D que rodea el cdigo de letra especficado.

java.awt.Font getFont()

Devuelve la fuente Java 2D usada para crear este objeto Font3D.

void getFontExtrusion(FontExtrusion extrudePath)

Copia el objeto FontExtrusion usado para crear este objeto Font3D dentro del parmetro especificado.

La clase Font se usa en la creaccin de un objeto Font3D.

Lista Parcial de Mtodos de la Clase Font

Paquete: java.awt

Una clase AWT que crea una representacin interna de las fuentas. Font desciende de java.lang.Object.

public Font(String name, int style, int size)

Crea un nuevo Font desde el nombre, estilo y tamao de punto especificados.

Parmetros:

  • name - el nombre del tipo de letra. Este puede ser un nombre lgico o un nombre de tipo de fuente. Un nombre lgico puede ser uno de: Dialog, DialogInput, Monospaced, Serif, SansSerif, o Symbol.
  • style - el estilo para la fuente. El argumento estilo es una mscara de bits de enteros que puede ser PLAIN, o una unin de BOLD y/o ITALIC (por ejemplo, Font.ITALIC o Font.BOLD|Font.ITALIC). Cualquier otro bit del parmetro de estilo es ingorado. Si el argumento de estilo no conforma ninguna de las mscaras esperadas, el estilo se selecciona a PLAIN.
  • size - el tamao de punto de la fuente.

Sumario de Constructores de la Clase FontExtrusion

Extiende: java.lang.Object

El objeto FontExtrusion se usa para describir el camino de extrusin de un objeto Font3D. Este camino de extrusin se usa en conjuncin con un objeto Font2D. El camino de extrusin define el fondo del contorno del texto 3D. Este contorno es perpendicular a la cara del texto. La extrusin tiene su origen en el lateral de la letra siendo 1.0 la altura de la letra ms alta. El contorno debe ser monotnico en el eje X. El usuario es responsable de la sanidad de los datos y debe asegurarse de que esta extrusionShape no causa intersecciones en letras adyacentes o dentro de una sola letra. No est definida la salida para extrusiones que causan intersecciones.

FontExtrusion()

Construye un objeto FontExtrusion con los parmetros por defecto.

FontExtrusion(java.awt.Shape extrusionShape)

Construye un objeto FontExtrusion con la forma especificada.

Sumario de Mtodos de la Clase FontExtrusion

java.awt.Shape getExtrusionShape()

Obtiene el parmetro shape de FontExtrusion.

void setExtrusionShape(java.awt.Shape extrusionShape)

Selecciona el parmetro shape de FontExtrusion.

.Fondo

Por defecto, el fondo de un universo virtual Java 3D es negro slido. Sin embargo, podemos especificar otros fondos para nuestros mundos virtuales. El API Java 3D proporciona una forma fcil de especificar un color slido, una imagen, una geometra o una combinacin de stos como fondo.

Cuando especificamos una imagen para el fondo, se sobreescribie la especificacin del color de fondo, si existe. Cuando se especifica una geometra, se dibuja sobre el color de fondo o la imagen.

La nica parte espinosa es la especificacin de un fondo geomtrico. Toda la geometra de fondo se especifica como puntos en una esfera. Si nuestra geometra es un PointArray, que podra representar estrellas a aos luz, o un TriangleArray, que podra representar montaas en la distancia. La geometria de fondo se proyecta sobre el infinito cuando se renderiza.

Los objetos Background tienen lmites de aplicacin, lo que nos permite que se puedan especificar diferentes fondos para diferentes regiones del mundo virtual. Un nodo Background est activo cuando su regin de aplicacin intersecciona con el volumen de activacin del ViewPlatform.

Si estn activos varios nodos Background,el nodo que est ms "cercano" al ojo ser el utilizado. Si no hay ningn nodo Background activo, la ventana se mostrar en negro. Sin embargo, la definicin de "ms cercano" no est especificada. Por cercano, se elige el fondo con los lmites de aplicacin ms internos que encierra la ViewPlatform.

Es improbable que nuestra aplicacin necesite iluminar la geometra del fondo -- en realidad el sistema visual humano no puede percibir los detalles visuales a grandes distancias. Sin embargo, una geometra de fondo si puede ser sombreada. La geometra del fondo podra no contener luces, pero las luces definidas en el escenario grfico pueden influenciar en la geometra del fondo.

Para crear un fondo seguimos esta sencilla receta:

  1. Crear un objeto Background especificando un color o una imagen.
  2. Aadir geometra (opcional).
  3. Proporcionar un lmite de Aplicacin o BoundingLeaf.
  4. Aadir el objeto Background al escenario grfico.

.Ejemplos de fondos

Como se explic en la seccin anterior, un fondo puede tener un color o una imagen. La Geometra puede aparecer en el fondo con el color o la imagen. Esta seccin proporciona un ejemplo de un fondo blanco slido. Un segundo ejemplo muestra la adiccin de geomtria al fondo.

Ejemplo de Fondo Coloreado

Las lneas de cdigo del Fragmento de Cdigo 3-6 corresponden con los pasos de la receta anterior. Junto a la personalizacin del color, el nico posible ajuste es para definir unos lmites de aplicacin ms apropiados para el fondo (o usar un BoundingLeaf).

Fragmento de Cdigo 3-6, Aadir un fondo coloreado
1.     Background backg = new Background(1.0f, 1.0f, 1.0f);
2.     //
3.     backg.setApplicationBounds(BoundingSphere());
4.     contentRoot.addChild(backg);

Ejemplo de Geometra de Fondo

De nuevo, las lneas de cdigo en el Fragmento de Cdigo 3-7 corresponden con lo pasos de la receta de creaccin de un fondo. En este fragmento, se llama al mtodo createBackGraph() para crear la geometra del fondo. Este mtodo devuelve un objeto BranchGroup. Para un ejemplo ms completo puedes ver el fichero BackgroundApp.java.

Fragmento de Cdigo 3-7, aadir un fondo geomtrico
1.     Background backg = new Background(); //black background
2.     backg.setGeometry(createBackGraph()); // add BranchGroup of background
3.     backg.setApplicationBounds(new BoundingSphere(new Point3d(), 100.0));
4.     objRoot.addChild(backg);

BackgroundApp.java

Para apreciar un fondo, necesitamos experimentarlo. BackgroundApp.java es una aplicacin completa con un fondo geomtrico. Esta aplicacin nos permite movernos por un mundo virtual Java 3D. Mientras nos movemos, podemos ver el movimiento relativo entre la geometra local y la del fondo.

BackgroundApp.java usa la clase KeyNavigatorBehavior proprocionada por la librera de utilidades para visores de movimiento.

KeyNavigatorBehavior responde a las teclas de flechas, PgUp, y PgDn para el movimiento. La tecla Alt tambin juega un papel (para ms detalles puedes ver el Captulo 4. Cuando ejecutes BackgroundApp, no te olvides de rotar para ver la _constellation_, as como viajar lejos en la distancia.

Figura 3-12, Viendo la Constellation en el fondo de BackgroundApp.java

La clase Background

La Figura 3-13 muestra el rbol de clase de la clase Background. Como una extensin de la clase Leaf, un ejemplar de la clase Background puede ser un hijo de un objeto Group.

Figura 3-13, rbol de Clases de Background

Background tiene varios constructores. Los constructores con parmetros nos permiten especificar un color o una imagen para el fondo. La geometra del fondo slo se puede aplicar a travs del mtodo apropiado.

Sumario de Constructores de la Clase Background

El nodo hoja Background define un color slido o una imagen para el fondo que se usa para rellenar la ventana al principio de cada nuevo marco. Opcionalmente permite referenciar geometras de fondo. La geometra de fondo debe representarse dentro de una esfera y es dibujada hacia el infinito. Tambin especifica una regin de aplicacin en la que este fondo est activo.

Background()

Construye un nodo Background con un color por defecto (negro).

Background(Color3f color)

Construye un nodo Background con el color especificado.

Background(float r, float g, float b)

Construye un nodo Background con el color especificado.

Background(ImageComponent2D image)

Construye un nodo Background con la imagen especificada.

Cualquier atributo de un fondo puede seleccionarse a travs de sus mtodos.

Sumario de Mtodos de la Clase Background

void setApplicationBoundingLeaf(BoundingLeaf region)

Selecciona la regin de aplicacin del Background a la hoja especificada.

void setApplicationBounds(Bounds region)

Selecciona la regin de aplicacin del Background a los lmites especificados.

void setColor(Color3f color)

Selecciona el color del fondo.

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

Selecciona el color del fondo.

void setGeometry(BranchGroup branch)

Selecciona la geometra del fondo al nodo BranchGroup especificado.

void setImage(ImageComponent2D image)

Selecciona la imagen del fondo.

Sumario de Capacidades de la Clase Background

  • ALLOW_APPLICATION_BOUNDS_READ | WRITE permite leer (escribir) al acceso a los lmites de aplicacin.
  • ALLOW_COLOR_READ | WRITE permite leer (escribir) al acceso a su color
  • ALLOW_GEOMETRY_READ | WRITE permite leer (escribir) al acceso a su geometra de fondo
  • ALLOW_IMAGE_READ | WRITE permite leer (escribir) al acceso a su imagen

BoundingLeaf

Los Bounds (lmites) se usan con luces, comportamientos, fondos y una gran variedad de otras aplicaciones en Java 3D. Los Bounds permiten al programador variar la accin, la apariencia, y/o el sonido sobre el campo virtual. La especificacin de Bounds tambin permite al sistema de renderizado de Java 3D mejorar la ejecucin del recortado y por lo tanto mejorar el rendimiento.

La especificacin tpica de lmites utiliza un objeto Bounds para limitar una regin. En el escenario grfico resultante, los objetos Bounds se mueven con los objetos que lo referencian. Esto esta bin para muchas aplicaciones; sin embargo, podra haber situaciones en las que fuera deseable tener la regin lmite que se moviera independientemente de los objetos que usan los lmites.

Por ejemplo, si un mundo incluye una fuente de luz estacionaria que ilumina unos objetos en movimiento, los lmites de la luz deberan incluir el objeto en movimiento. Una forma de manejar esto podra ser crear los lmites lo suficientemente grandes como para incluir todos los lugares donde se mueve el objeto. Esta no es la mejor respuesta en muchos casos. Una mejor solucin es usar un BoundingLeaf. Situado en el escenario grfico con el objeto visual, el BoundingLeaf se mueve con el objeto visual independientemente de la fuente de luz. La Figura 3-14 muestra un escenario grfico con un una luz que usa un nodo BoundingLeaf.

Figura 3-14, un BoundlingLeaf se mueve con un objeto visual independientemente de la fuente de luz

Una aplicacin interesante de un objeto BoundingLeaf sita un BoundingLeaf en la viewPlatform. Este BoundingLeaf puede usarse para un lmite "siempre sobre" para un comportamiento, o para unos lmites de aplicacin "aplica siempre" para fondos o nieblas. El Fragmento de Cdigo 3-8 presenta un ejemplo de la aplicacin BoundingLeaf usada con un Background.

El Fragmento de Cdigo 3-8 presenta un ejemplo de cmo aadir un BoundingLeaf como un hijo de PlatformGeometry para proporcionar un lmite de "aplica siempre" para un fondo. En este cdigo se ha modificado el mtodo estndard createSceneGraph() para que tome un slo parmetro, que es el objeto SimpleUniverse. Esto es necesario para crear el objeto PlatformGeometry.

Las lneas 2, 3 y 4 crean el objeto BoundingLeaf, el objeto PlatformGeometry y hace del objeto BoundingLeaf un hijo de PlatformGeometry, en este orden. Si tuviera que haber ms objeto PlatformGeometry, se aadiran en este punto. El objeto PlatformGeometry se aade la rama de vista grfica en la lnea 6.

El objeto BoundingLeaf se selecciona como los limites de aplicacin para el objeto background en la lnea 11. El mismo objeto BoundingLeaf puede usarse para otros propsitos en este programa. Por ejemplo, puede usarse para los comportamientos. Observa que usando el BoundingLeaf en este programa como el InfluencingBoundingLeaf de una luz hace que esta luz no influya en todos los objetos del mundo virtual.

Fragmento de Cdigo 3-8, Aadir un BoundingLeaf al ViewPlatform para un lmite 'Aplica siempre'
1.     void createSceneGraph (SimpleUniverse su) {
2.     BoundingLeaf boundingLeaf = new BoundingLeaf();
3.     PlatformGeometry platformGeom = new PlatformGeometry();
4.     platformGeom.addChild(boundingLeaf);
5.     platformGeom.compile();
6.     simpleUniv.getViewingPlatform().setPlatformGeometry(platformGeom);
7.
8.     BranchGroup contentRoot = new BranchGroup();
9.
10.   Background backg = new Background(1.0f, 1.0f, 1.0f);
11.   backg.setApplicationBoundingLeaf(boundingLeaf);
12.   contentRoot.addChild(backg);

.La Clase BoundingLeaf

La clase BoundingLeaf extiende la clase Leaf. La Figura 3-15 representa el rbol de clases de BoundingLeaf.

Figura 3-15, rbol de Clases de la clase BoundingLeaf

El constructor sin parmetros de BoundingLeaf crea lmites para una esfera. El otro constructor permite la especificacin de lmites para el objeto BoundingLeaf.

Sumario de Constructores de la Clase BoundingLeaf

El nodo BoundingLeaf define una regin de lmites que puede ser referenciada por otros nodos para definir un regin de influencia, o una regin programada.

BoundingLeaf()

Construye un nodo BoundingLeaf con un objeto esfera.

BoundingLeaf(Bounds region)

Construye un nodo BoundingLeaf con la regin de lmites especificada.

Sumario de Mtodos de la Clase BoundingLeaf

Bounds getRegion()

Recupera la regin de lmites de este BoundingLeaf

void setRegion(Bounds region)

Selecciona la regin de lmites de este nodo BoundungLeaf

.Datos de Usuario

Cualquier SceneGraphObject puede referenciar cualquier otro objeto como datos de usuario. Primero, deberamos habernos dado cuenta de que casi cualquier clase del corazn del API Java 3D es un descendiente de SceneGraphObject. La lista de descendientes de SceneGraphObject incluye Appearance, Background, Behavior, BranchGroup, Geometry, Lights, Shape3D, y TransformGroup.

Las aplicacin para el campo UserData, slo est limitado por nuestra imaginacin. Por ejemplo, una aplicacin podra tener varios objetos recolectables. Cada uno de estos objetos podra tener algn texto informativo almacenado en el objeto de datos de usuario. Cuando el usuario recoge un objeto, se puede mostrar la informacin de los datos de usuario.

Otra aplicacin podra almacenar algn valor calculado para un objeto de escenario grfico como su posicin en las coordenadas del mundo virtual. Y otra aplicacin podra almacenar alguna informacin especifica de comportamiento que podra controlar el comportamiento aplicado a varios objetos.

Lista Parcial de Mtodos de Datos de Usuario de SceneGraphObject

SceneGraphObject es una superclase comn para todos los objetos componentes de un escenario grfico. Estos incluyen Node, Geometry, Appearance, etc.

java.lang.Object getUserData()

Recupera el campo userData desde este objeto del escenario grfico.

void setUserData(java.lang.Object userData)

Selecciona el campo userData asociado con este objeto del escenario grfico.

COMPARTE ESTE ARTÍCULO

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

SIGUIENTE ARTÍCULO

HAY 1 COMENTARIOS
  • Anónimo dijo:

    Seria bueno poder descargar este fabuloso tutorial

Conéctate o Regístrate para dejar tu comentario.