Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Java3dmanual 150705114255 Lva1 App6892 PDF
Java3dmanual 150705114255 Lva1 App6892 PDF
1 INTRODUCCIN
1.1Qu es la API Java 3D API?
La API Java 3D es una jerarqua de clases java que sirven como interfaz a sistemas grficos de 3
dimensiones de imagen y sonido. Los programadores trabajan con constructores de alto nivel para
crear y manipular objetos 3D. Estos objetos residen en un universo virtual que es dibujado para su
presentacin a los usuarios.
Un programa Java 3D crea instancias de objetos Java 3D y los coloca en la estructura de datos de
objetos grficos de la escena. El grfico de la escena est organizado en forma de rbol y especifica
completamente el contenido del universo virtual, y cmo este es dibujado.
<JREDIR>\lib\ext\j3dutils.jar
<JDKDIR>\j3d-utils-src.jar
<JDKDIR>\demo\java3d
Una vez instalado el paquete, ya podremos desarrollar nuestras aplicaciones Java3D, pero antes
daremos unas nociones bsicas de la arquitectura de construccin de los universos virtuales en Java
3D.
Pero un efecto lateral de la compilacin es que las capacidades del TransformGroup de modificar
su comportamiento se ve limitado. La solucin que utilizaremos para evitar este comportamiento
ser la de establecer las capacidades del objeto TransformGroup para notificar al compilador de que
queremos permitir ciertos comportamientos en nuestros objetos. Todo esto lo realizaremos a travs
del mtodo setCapability(Capability), donde podremos especificar los comportamientos que
queremos permitir. Algunas de las capacidades que tendremos disponibles son:
1) ALLOW_TRANSFORM_READ - Acceso de lectura del objeto TransformGroup
2) ALLOW_TRANSFORM_WRITE - Acceso de escritura del objeto TransformGroup
3) ALLOW_CHILDREN_EXTEND - Se permiten aadir ms nodos hijo
4) ALLOW_CHILDREN_READ - Acceso de lectura de los nodos hijo
5) ALLOW_CHILDREN_WRITE - Acceso de escritura de los nodos hijo
1.6 Animacin
En Java 3D, Behaviour es una clase para especificar animaciones o interacciones de objetos
visuales, capaz de cambiar virtualmente cualquier atributo de un objeto visual. Un programador
puede usar un nmero predefinido de comportamientos o especificar uno personalizado. Una vez
que se especifica un comportamiento para un objeto visual, el sistema Java 3D actualiza la posicin,
orientacin, color u otros atributos del objeto visual automticamente.
La diferencia entre animacin e interaccin est en cuando el comportamiento es activado en
respuesta al paso del tiempo o en respuesta a las actividades del usuario.
Para especificar un comportamiento para un objeto visual, el programador crea los objetos que
especifican el comportamiento, aaden al objeto visual a la escena del grfico, y se construyen las
referencias apropiadas entre los objetos del escenario y los objetos Behaviour.
Un problema que nos encontraremos al utilizar los comportamientos es que tendremos que
especificar una regin que haga de lmite para el comportamiento. Este lmite se llama regin de
planificacin. Un comportamiento no est activo a menos que el volumen de activacin de la
plataforma de visin tenga un punto de interseccin con la regin de planificacin de un objeto
Behavior.
Una de las clases de comportamiento predefinidas que nos podremos encontrar es la clase
Interpolator. Esta clase est basada en una funcin de tiempo en la que el objeto Interpolator
manipula los parmetros de un objeto del grfico del escenario. Por ejemplo, RotationInterpolator
manipula la rotacin especificada por un TransformGroup para afectar a la rotacin de los objetos
visuales hijos del TransformGroup.
Los pasos para especificar una animacin con un objeto Interpolator son los siguientes:
1) Crear un TransformGroup con la capacidad ALLOW_TRANSFORM_WRITE
2) Crear un objeto Alpha que especifique los parmetros de tiempo
3) Crear un objeto Interpolator que haga referencia a los objetos Alpha y TransformGroup
5) Especificar una regin de planificacin
1.7 Ejemplo
Para ver el funcionamiento de todas las clases mencionadas anteriormente, veremos un pequeo
programa en el que utilizaremos todos los puntos anteriores. El programa que crearemos crear un
objeto predefinido en el paquete de utilidades que nos define un cubo con un color para cada cara.
Adems a la escena le aadiremos un rotacin dependiente del tiempo y un lmite para el
comportamiento definido por una esfera de radio 100 y centrado en el punto (0,0,0).
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class Hello extends Applet {
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
// Crear la raiz de la rama de objetos grficos
BranchGroup objRoot = new BranchGroup();
2. CREANDO GEOMETRAS
En el captulo 1 exploramos los conceptos bsicos de la construccin de un universo virtual Java
3D, concentrndonos en especificar las transformadas y comportamientos, y para demostrar su
construccin y funcionamiento construimos un pequeo programa. Pero en el programa que
construimos slo haba un figura, y era un cubo de colores que ya vena preconstruido en las clases
de utilidades de la distribucin de Java 3D, y a la cual no le podamos especificar ni la apariencia ni
el color.
En este captulo veremos que hay tres formas de construir los objetos que queremos representar y
que podremos construir a travs de objetos ya predefinidos (cubos, conos, esferas ...), a travs de
coordenadas de los vrtices o a travs de cargadores de geometras.
2.2.1 Shape3D
Un nodo Shape3D define un objeto visual genrico. La clase Shape3D no contiene informacin
sobre el color o la forma de un objeto visual, sino que esta informacin se almacena en los objetos
NodeComponent referenciados por el objeto Shape3D. Un objeto Shape3D puede referenciar a un
componente del nodo Geometry y/o Appearance.
Los objetos NodeComponent contienen la especificacin de los atributos del objeto visual. Cada
una de las subclases de NodeComponent define ciertos atributos visuales como la apariencia,
geometra, material, texturas ...
2.2.3 Definiendo las Clases de objetos visuales
El mismo objeto visual puede encontrarse varias veces en nuestra escena, por lo que tendr
sentido definir una clase que cree el objeto visual en vez de construir cada objeto visual desde el
principio.
La estructura de la construccin de un objeto visual es la siguiente:
public class VisualObject extends Shape3D {
private Geometry voGeometry;
private Appearance voAppearance;
// Creamos el objeto Shape3D con la geometra y apariencia
public VisualObject(){
voGeometry = createGeometry();
voAppearance = createAppearance();
this.setGeometry(voGeometry);
this.setAppearance(voAppearance);
}
....
}
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
public class HelloCone extends Applet {
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
// Crear la raiz de la rama del grfico
BranchGroup objRoot = new BranchGroup();
// Crear un objeto Shape3D y aadirlo a la escena.
Appearance apariencia = new Appearance();
apariencia.setColoringAttributes(new ColoringAttributes(0.3f, 1.0f,1.0f,
ColoringAttributes.SHADE_FLAT));
Node node = new Cone(0.5f,0.3f,apariencia);
objRoot.addChild(node);
// Compilar para optimizar
objRoot.compile();
return objRoot;
}
public HelloCone() {
}
public void init() {
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
// Crear una escena y atacarla al universo virtual
BranchGroup scene = createSceneGraph();
u = new SimpleUniverse(c);
// Mueve el punto de vista un poco atrs para ver los objetos
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
public void destroy() {
u.cleanup();
}
public static void main(String[] args) {
new MainFrame(new HelloCone(), 256, 256);
}
}
Las subclases de IndexedGeometryArray nos proporcionarn una forma de eliminar los vrtices
redundantes, aunque con la penalizacin de tener que construir arrays de datos que contengan los
ndices para las coordenadas, ndices, color, texturas y normales. Lo nico que deberemos tener en
cuenta es que la matrices de ndices podrn tener mltiples referencias al mismo vrtice en los
arrays de datos. Las clases que tendremos disponibles son IndexedGeometryArray,
IndexedPointArray, IndexedLineArray, IndexedTriangleArray, IndexedQuadArray,
IndexedGeometryStripArray, IndexedLineStripArray, IndexedTriangleStripArray y
IndexedTriangleFanArray.
EL siguiente ejemplo muestra la construccin de dos rectas y un tringulo con los vrtices de
colores distintos en nuestro escenario.
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class BasicFigures extends Applet {
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
LineArray line1 = new LineArray(2, LineArray.COORDINATES);
line1.setCoordinate(0, new Point3f(0.0f, 0.0f, 0.0f));
line1.setCoordinate(1, new Point3f(0.3f, 0.0f, 0.0f));
LineArray line2 = new LineArray(2, LineArray.COORDINATES);
line2.setCoordinate(0, new Point3f(0.0f, 0.3f, 0.0f));
line2.setCoordinate(1, new Point3f(0.1f, 0.0f, 0.3f));
TriangleArray triangle = new TriangleArray(3, TriangleArray.COORDINATES|
TriangleArray.COLOR_3);
PointAttributes
LineAttributes
PolygonAttributes
ColoringAttributes
TransparencyAttributes
RenderingAttributes
Material
TextureAttributes
Texture
TexCoodGeneration
Con el objeto Text2D tendremos que especificar el texto que deseamos visualizar junto con los
atributos de color, tamao y fuente al aadirlo al BranchGroup. Ejemplo:
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Text2D;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class HelloText2D extends Applet {
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
// Crear la raiz de la rama del grfico
BranchGroup objRoot = new BranchGroup();
Text2D text2D = new Text2D("Texto en 2D", new Color3f(0.8f, 1.0f, 1.0f),
"Helvetica", 21, Font.BOLD);
objRoot.addChild(text2D);
public HelloText2D() {
}
public void init() {
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
// Crear una escena y atacarla al universo virtual
BranchGroup scene = createSceneGraph();
u = new SimpleUniverse(c);
// Mueve el punto de vista un poco atrs para ver los objetos
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
public void destroy() {
u.cleanup();
}
public static void main(String[] args) {
new MainFrame(new HelloText2D(), 256, 256);
}
}
En el caso del objeto Text3D tendremos que especificar una extrusin a lo largo del eje Z en el
constructor de la fuente (Font3D).
Y con el fondo necesitaremos especificar el color deseado y los lmites dentro de los que se
aplicar el nuevo color de fondo. En el siguiente cdigo veremos un ejemplo de estas dos ltimas
caractersticas juntas.
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class HelloText3D extends Applet {
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
// Crear la raiz de la rama del grfico
BranchGroup objRoot = new BranchGroup();
Background bg= new Background();
bg.setColor(0.3f, 0.6f,0.0f);
bg.setApplicationBounds(new BoundingSphere(new Point3d(),100.0f));
Font3D font3D = new Font3D(new Font("Helvetica", Font.PLAIN, 6), new
FontExtrusion());
Text3D text3D =
new Text3D(font3D,
"Texto en 3D",
new Point3f(-12.0f, 0.8f, -50.0f));
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class BasicTransform extends Applet {
private SimpleUniverse u = null;
u = new SimpleUniverse(c);
// Mueve el punto de vista un poco atrs para ver los objetos
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
public void destroy() {
u.cleanup();
}
public static void main(String[] args) {
new MainFrame(new BasicTransform(), 256, 256);
}
}
3.Interaccin
En los captulos previos hemos hecho varios programas que demuestran las capacidades del API
Java 3D, pero estas capacidades estn bastante limitadas, ya que son estticas. Lo verdaderamente
interesante de los mundos virtuales es la interaccin y animacin que pueden producir. La
interaccin es la respuesta a los eventos producidos por el usuario. La animacin est definida por
los cambios de la escena a lo largo del tiempo sin la interaccin directa del usuario.
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior;
import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.Point3d;
public class MovingCone extends Applet {
4.Animacin
Ciertos objetos pueden cambiar independientemente de las acciones del usuario, por ejemplo las
manecillas de un reloj deberan de moverse sin tener que depender del estmulo del usuario. Las
manecillas de un reloj son un ejemplo de animacin. En este manual consideramos una animacin
como los cambios producidos en nuestra escena debido al transcurrir del tiempo y sin necesitar la
interaccin del usuario.
Como sucede con las interacciones, las animaciones son implementadas usando los objetos
Behavior, y como hemos visto con la interaccin, podemos describir nuestros propios descendientes
de Behavior o utilizar aquellos que ya vienen definidos en la distribucin.
Una de las clases de animacin que veremos es la clase Interpolator. Un objeto Interpolator, junto
con un objeto Alpha, manipula un objeto visual de la escena para conseguir una animacin basada
en el tiempo.
Otro conjunto de clases de animacin de objetos visuales son los BillBoard y LOD (Nivel de
detalle) que no responden al paso del tiempo sino al cambio de punto de vista del usuario.
Un objeto Alpha produce una valor entre 0.0 y 1.0 incluidos que cambian con el tiempo y que
generan una onda y que marcarn los tiempos de nuestra animacin y las veces que se repetir la
onda. La forma de las fases de las que consta nuestra onda son todas parametrizables a travs del
objeto Alpha y podremos alterarlas para que, si es lo que deseamos, la onda slo est formado por
una fase.
Ahora que ya sabemos qu es un objeto Alpha y para que sirve, veremos como se integra con el
objeto Interpolator. Para conseguir animacin con el objeto Interpolator deberemos de seguir los
siguientes pasos:
En el primer ejemplo que mostramos en este tutorial vimos un ejemplo de la aplicacin de los
objetos Interpolator y Alpha. El cdigo era muy parecido al siguiente, con la salvedad de que hemos
cambiado el eje de rotacin al eje X:
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class RotColorCube extends Applet {
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
// Crear la raiz de la rama del grfico
BranchGroup objRoot = new BranchGroup();
// Crear el nodo TransformGroup y engancharlo a la raz
// Habilitar la capacidad TRANSFORM_WRITE para que se pueda modificar
// en tiempo de ejecucin.
TransformGroup objSpin = new TransformGroup();
objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// Creamos un objeto Alpha rota indefinidamente y con un
// periodo de 1 minuto
Alpha alpha = new Alpha(-1, 6000);
Adems del RotationInterpolator tambin podremos utilizar los interpoladores ya definidos como
ColorInterpolator, PathInterpolator, PositionInterpolator, ScaleInterpolator y
TransparencyInterpolator, cuyo funcionamiento es muy similar al ya descrito RotationInterpolator.
El comportamiento billboard funciona bien para los rboles porque estos parecen bsicamente
los mismos cuando son vistos desde el frente, atrs o desde cualquier otro ngulo. Como un
billboard hace que un objeto visual parezca el mismo desde todos los ngulos de vista sern
apropiados para representar objetos 3D que son geomtricamente simtricos sobre el eje Y.
Usar un objeto billboard es muy similar a un objeto interpolator, excepto que no existe un objeto
Alpha que controle la animacin. La animacin del billboard se controla por la posicin relativa al
visor en el mundo virtual. Los pasos para usar un Billboard son:
1. Crear un TransformGroup con ALLOW_TRANSFORM_WRITE de destino
2. Crear un objeto BillBoard haciendo referencia al TransformGroup de destino.
3. Suministrar unos lmites para el objeto BillBoard
4. Construir el escenario.
Un cdigo de ejemplo mostrando su funcionamiento es el siguiente:
public BranchGroup createSceneGraph(SimpleUniverse u) {
BranchGroup objRoot = new BranchGroup();
Vector3f translate = new Vector3f();
Transform3D T3D = new Transform3D();
TransformGroup TGT = new TransformGroup();
TransformGroup TGR = new TransformGroup();
Billboard billboard = null;
BoundingSphere bSphere = new BoundingSphere();
En el siguiente ejemplo crearemos varias esferas de distinto nivel de detalle y distintos colores
que irn apareciendo dependiendo de la distancia a la que se encuentren del visor.
public LOD() {
}
public void init() {
setLayout(new BorderLayout());
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
// Creamos la escena y la atacamos al universo virtual
BranchGroup scene = createSceneGraph();
u = new SimpleUniverse(c);
// aadimos un zoom a la escena
ViewingPlatform viewingPlatform = u.getViewingPlatform();
viewingPlatform.setNominalViewingTransform();
u.addBranchGraph(scene);
}
public void destroy() {
u.cleanup();
}
public static void main(String[] args) {
new MainFrame(new LOD(), 512, 512);
}
5. Iluminacin
En el mundo real, en la visualizacin de un objeto no slo se tiene en cuenta el color y la forma
de este, sino que tambin tenemos en cuenta la cantidad y el ngulo de la luz que recibe y las luces y
sombras de los objetos adyacentes. En este captulo presentaremos el modelo de iluminacin en
Java 3D y veremos cmo crear ambientes y sombras para nuestro universo virtual.
luz. La presencia del objeto Material en el objeto Appearance de un objeto visual es el que nos
habilitar el modelo de luces para este objeto. Sin la presencia de Material el objeto ser coloreado,
pero no ser iluminado por las fuentes de luz.
En la siguiente figura se muestra una luz dbil de ambiente sobre una esfera:
Si comparamos las dos imgenes veremos una pequea diferencia de color en las esferas, esta
diferencia ser la provocada por la luz de ambiente.
El cdigo del programa que produjo estas imgenes es el siguiente:
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class BasicLight extends Applet {
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
Background background = new Background(0.2f, 0.4f, 0.5f);
background.setApplicationBounds(new BoundingSphere());
Appearance appearance = new Appearance();
appearance.setMaterial(new Material());
// Generamos la esfera con la una apariencia y generamos las normales
Sphere sphere = new Sphere(0.5f, Sphere.GENERATE_NORMALS ,appearance);
AmbientLight light = new AmbientLight();
light.setInfluencingBounds(new BoundingSphere());
objRoot.addChild(light);
objRoot.addChild(sphere);
objRoot.addChild(background);
// Compilamos para optimizar
objRoot.compile();
return objRoot;
}
public BasicLight() {
}
public void init() {
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
// Crear una escena y atacarla al universo virtual
BranchGroup scene = createSceneGraph();
u = new SimpleUniverse(c);
// Mueve el punto de vista un poco atrs para ver los objetos
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
public void destroy() {
u.cleanup();
}
public static void main(String[] args) {
new MainFrame(new BasicLight(), 256, 256);
}
}
La nica diferencia en el cdigo de estos dos ejemplos radica en el nmero de vrtices de las
figuras. Mientras que en la figura de la derecha la esfera est construida con 20 vrtices, la figura de
la izquieda est construida con 40. El cdigo de la luz direccional es el siguiente:
Sphere sphere = new Sphere(0.5f, Sphere.GENERATE_NORMALS ,40,appearance);
DirectionalLight light = new DirectionalLight();
light.setInfluencingBounds(new BoundingSphere());
light.setDirection(-1.0f, -1.0f, 0.0f);
5.5 Normales
Tal y como se dijo en la seccin 5.2, las normales son un requisito indispensable para la
realizacin de sombreados sobre objetos visuales. La normal de una superficie nos indica cual es la
parte de la superficie que se ver afectada por los efectos de iluminacin. Por esto es tan importante
el definir este parmetro de forma correcta. Para definr correctamente una normal debemos definir
un vector que apunte hacia las fuentes de luz. Para definir las normales cuando creamos objetos
visuales usando las clases Geometry, podremos usar uno de los mtodos setNormal() para
especificar las normales para cada vrtice.
6. Texturas
6.1 Qu es una textura?
La apariencia de los objetos del mundo real depende de su textura. La textura de un objeto es
realmente la geometra de menor detalle de la superficie del objeto. Una textura especifica la
complejidad y densidad de la geometra de la superficie.
Si intentramos modelar una representacin de un objeto real en Java 3D con su textura mediante
las primitivas que hemos visto, el modelo sera imposible de representar debido a su alta
complejidad. Lo que se hace para la simulacin de texturas es la simulacin de estas mediante un
grfico o dibujo, y asignndolo a la forma geomtrica del modelo del objeto visual.
Este paso no requiere programacin alguna y consta de la edicin de nuestra textura en una
herramienta que nos permita la edicin de una imagen. Algo que tenemos que tener en cuenta aqu
es que la imagen debe de tener una dimensin potencia de 2, para optimizar el rendimiento de la
aplicacin, y asegurarnos de que la imagen se graba en un formato de imagen que los cargadores de
Java sean capaces de entender.
6.2.2 Carga de la textura
Ahora que ya hemos preparado nuestro archivo de texturas, podremos cargarlo. Para cargar la
textura utilizaremos una clase de utilidad llamada TextureLoader. Esta clase lo que hace es cargar el
archivo de texturas desde un archivo del sistema de archivos o desde un URL para devolver un
objeto ImageComponent2D. El cdigo para realizar esta operacin es el siguiente:
TextureLoader loader = new TextureLoader(textura.gif, this);
ImageComponent2 image = loader.getImage();
Para ser usada como textura la imagen que hemos cargado en el apartado anterior, debemos de
establecerla como textura en un objeto Texture2D. El siguiente cdigo muestra un ejemplo de carga
y asignacin de la textura a un nodo Appearance:
TextureLoader loader = new TextureLoader(textura.jpg, this);
ImageComponent2D image = loader.getImage();
Texture2D texture = new Texture2D();
texture.setImage(0, image);
Appearance appearance = new Apperance();
appearance.setTexture(texture);
Ahora lo nico que nos falta es especificar los puntos de colocacin de la textura en la geometra
de nuestro objeto visual. Cada coordenada de la textura especifica un punto de la textura a ser
aplicada a un vrtice. Con la especificacin de algunos de los puntos de la imagen a ser aplicados a
los vrtices de la geometra, la imagen ser acondicionada para que cuadre en ella. Algo que
debemos de tener en cuenta es que las coordenadas de la textura son coordenadas con valores
normalizados. Esto es, cuando establezcamos una coordenada de textura a 1.0f, esto querr
significar que queremos que una de la esquina de la textura estar en un lmite del plano. Vemoslo
con un ejemplo.
En el siguiente trozo de cdigo crearemos un plano y estableceremos en el una textura:
QuadArray plane = new QuadArray(4, GeometryArray.COORDINATES |
GeometryArray.TEXTURE_COORDINATE_2);
Point3f p = new Point3f();
p.set(-1.0f, 1.0f, 0.0f);
plane.setCoordinate(0,p);
p.set(-1.0f, -1.0f, 0.0f);
plane.setCoordinate(1,p);
p.set(1.0f, -1.0f, 0.0f);
plane.setCoordinate(2,p);
p.set(1.0f, 1.0f, 0.0f);
plane.setCoordinate(3,p);
Point2f q = new Point2f();
q.set(0.0f, 1.0f);
plane.setTextureCoordinate(0.q);
q.set(0.0f, 0.0f);
plane.setTextureCoordinate(1,q);
q.set(1.0f, 0.0f);
plane.setTextureCoordinate(2,q);
q.set(1.0f, 1.0f);
plane.setTextureCoordinate(3,q);
En el ltimo ejemplo de este tutorial veremos el cdigo de un programa que carga una textura de
piedra en un cubo que gira. En este ejemplo no ser necesario especificar las coordenadas de la
textura debido a que nuestro objeto visual es cuadrado y encajar perfectamente.
package es.udc.fi.gc;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.geometry.Box;
import javax.media.j3d.*;
import javax.vecmath.*;
public class TextureExample extends Applet {
private java.net.URL texImage = null;
private SimpleUniverse u = null;
public BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
7. Bibliografa