Vous êtes sur la page 1sur 22

Introduccin a Java3D

API Java3D

La API de Java3D es un conjunto de clases que sirven como interfaz a un sistema para desplegar grficos tri-dimensionales y sonidos. Es similar a la bilioteca grfica OpenGL, pero Java3D tiene la caracterstica de ser estructurado. Los programas de Java3D pueden ser escritos para ser corridos com programas independientes o como applets para ser mostrados en browsers. Scene Graph Un universo virtual de Java3D es definido por un grafo, que se conoce como Scene Graph. El Scene Graph es un ordenamiento de ojetos 3D en una estructura de rbol, que se crea instanciando ojetos de las clases de Java3D. Con este grafo se define la geometra, sonido, luz, ubicacin, orientacin y apariencia de ojetos visuales y de sonido. Los nodos, generalmente se relacionan de la forma 'padre-hijo', pero tambin existe otro tipo de relacin, las 'referencias'. Esta relacin asocia un Nodo Componente con un nodo del Scene Graph. Un Nodo Componente define la geometra y la apariencia usada para mostrar los ojetos visuales. El camino de cada Scene Graph define completamente la informacin del estado de la hoja, es decir, la uicacin, orientacin y tamao del ojeto. La representacin grfica de un Scene Graph sirve como herramienta de diseo y/o como documentacin para programas Java3D. Los smbolos son:

Un ejemplo de un grafo es el siguiente:

Para construir un grafo, se puede seguir la siguiente receta: 1. Crear un ojeto Canvas3D

2. Crear un objeto VirtualUniverse 3. Crear un objeto Locale, adjuntndolo al objeto VirtualUniverse 4. Construir una rama de vista: 1. Crear un objeto View 2. Crear un objeto ViewPlatform 3. Crear un objeto PhysicalBody 4. Crear un objeto PhysicalEnvironment 5. Adjuntar los ojetos ViewPlatform, Physicalody, PhysicalEnvironment y Canvas3D al ojeto View 5. Construir una(s) rama(s) de contenido 6. Compilar las ramas del grafo 7. Insertar su-grafos en el Locale Receta Simple

Los programas de Java3D que usan la receta anterior, tienen grafos con estructuras idnticas.

Por esto, existe la clase SimpleUniverse, que realiza los pasos 2, 3 y 4 de la receta anterior. Esto permite reducir considerablemente el tiempo y esfuerzo necesitado para crear el grafo. Usando esta clase, la receta anterior queda como: 1. Crear un ojeto Canvas3D 2. Crear un ojeto SimpleUniverse que referencia el objeto Canvas3D 1. Personalizar el objeto SimpleUniverse 3. Construir la rama con el contenido 4. Compilar la rama de contenidp 5. Insertar la rama de contenido en el Locale del SimpleUniverse Componentes de un grafp

Los componentes de un grafo son:


BranchGroup (BG): permite agrupar un conjunto de nodos bajo una raiz TransformGroup (TG): tiene asociada una matriz de transformacin que afecta a todos los elementos bajo este nodo

Un BG puede ser compilado, de manera de convertir todos sus descendientes a un formato ms eficiente para poder desplegarlo en pantalla. Ejemplo: Mostrar un cubo de colores, rotado segn uno de sus ejes.
import import import import import import import import import java.applet.Applet; java.awt.BorderLayout; java.awt.Frame; java.awt.event.*; com.sun.j3d.utils.applet.MainFrame; com.sun.j3d.utils.universe.*; com.sun.j3d.utils.geometry.ColorCube; javax.media.j3d.*; javax.vecmath.*;

public class HelloJava3Da extends Applet { public HelloJava3Da(){ setLayout(new BorderLayout());

GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D =new Canvas3D(config); add("Center",canvas3D); BranchGroup scene=createSceneGraph(); scene.compile(); //SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU =new SimpleUniverse(canvas3D); //This moves the ViewPlatform back a bit so the //objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); }//end of HelloJava3Da (constructor) public BranchGroup createSceneGraph(){ //Create the root of the branch graph BranchGroup objRoot =new BranchGroup(); //rotate object has composite transformation matrix Transform3D rotate =new Transform3D(); rotate.rotX(Math.PI/4.0d); TransformGroup objRotate =new TransformGroup(rotate); objRotate.addChild(new ColorCube(0.4)); objRoot.addChild(objRotate); 13. return objRoot; }//end of createSceneGraph method of HelloJava3Da //The following allows this to be run as an application //as well as an applet public static void main(String [] args)){ Frame frame =new MainFrame(new HelloJava3Da(),256,256); }//end of main (methodof HelloJava3Da) }// end of class HelloJava3Da

El grafo que representa lo anterior es:

y la representacin es:

Figuras Geomtricas
Sistema de Coordenadas

EL sistema de coordenadas del universo en Java3D se representa segn un sistema cartesiano, que sigue la "regla de la mano derecha", como se observa en el siguiente diagrama:

Shape3D Una instancia del objeto Shape3D define un objeto visual. La clase Shape3D es una subclase de la clase Leaf, luego, solamente puede estar presente en el grafo, como una hoja. El objeto Shape3D no tiene informacin sobre la forma o el color del objeto, peor puede referenciar un Nodo Componente Geometry y un Nodo Componente Appearance. Los Nodos Componentes Gemoetry permiten definir la geometra de la figura, y los Nodo Componentes Appearance sirven para definir las caractersticas de la apariencia del objeto. En el grafo, esto se representa:

Para crear los objetos, es til crear una clase para definir las caractersticas del objeto visual. El patrn general es:
public class VisualObject extends Shape3D{ private Geometry voGeometry; private Appearance voAppearance; // create Shape3D with geometry and appearance // the geometry is created in method createGeometry // the appearance is created in method createAppearance public VisualObject() { voGeometry = createGeometry(); voAppearance = createAppearance(); this.setGeometry(voGeometry); this.setAppearance(voAppearance); } private Geometry createGeometry() { // code to create default geometry of visual object } private Appearance createAppearance () { // code to create default appearance of visual object } } // end of class VisualObject

Despus, este objeto puede ser agregado a un nodo:


objRoot.addChild (new VisualObject());

Con esto, es posible definir figuras geomtricas especficas, segn las necesidades del usuario. Figuras Utiles En Java3D tambin existen clases de objetos grficos que permiten generar figuras geomtricas primitivas. En estas primitivas, no se puede modificar la geometra de la figura, pero s es posible modificar la apariencia y su tamao. Las figuras geomtricas primitivas son:

Box Cone Cylinder Sphere

Sus constructores son: Box (float xdim, float ydim, float zdim) crea una caja de dimensiones xdim * ydim * zdim, centrada en el origen Cone (float r, float h) crea un cono de radio r y altura h, centrada en el origen alineada segn el eje y Cylinder (float r, float h) crea un cilindro de radio r y altura h, centrada en el origen con su eje principal segn el eje y Sphere (float r) crea una esfera de radio r, centrada en el origen

Todos estos objetos tienen en comn, entre otros, el mtodo:


void setAppearance (Appearance ap)

que permite definir la apariencia de la figura, haciendo referencia a otro Nodo Componente Appearance.

Ejemplo: Dibujar un yo-yo, utilizando 2 conos. Para esto, es necesario rotar ambos conos segun el eje z, y luego trasladarlos segn el eje x.

El grafo se vera como:

y el cdigo sera:
public class ConeYoyo{ private BranchGroup yoyoBG; // create Shape3D with geometry and appearance public ConeYoyo() {

yoyoBG = new BranchGroup(); Transform3D rotate = new Transform3D(); Transform3D translate = new Transform3D(); Appearance yoyoAppear = new Appearance(); rotate.rotZ(Math.PI/2.0d); TransformGroup yoyoTGR1 = new TransformGroup(rotate); translate.set(new Vector3f(0.1f, 0.0f, 0.0f)); TransformGroup yoyoTGT1 = new TransformGroup(translate); Cone cone1 = new Cone(0.6f, 0.2f); cone1.setAppearance(yoyoAppear); yoyoBG.addChild(yoyoTGT1); yoyoTGT1.addChild(yoyoTGR1); yoyoTGR1.addChild(cone1); translate.set(new Vector3f(-0.1f, 0.0f, 0.0f)); TransformGroup yoyoTGT2 = new TransformGroup(translate); rotate.rotZ(-Math.PI/2.0d); TransformGroup yoyoTGR2 = new TransformGroup(rotate); Cone cone2 = new Cone(0.6f, 0.2f); cone2.setAppearance(yoyoAppear); yoyoBG.addChild(yoyoTGT2); yoyoTGT2.addChild(yoyoTGR2); yoyoTGR2.addChild(cone2); yoyoBG.compile(); } // end of ConeYoyo constructor public BranchGroup getBG(){ return yoyoBG; } } // end of class ConeYoyo

y la figura que se obtiene es:

GeometryArray Es una clase abstracta que permite definir puntos, lneas y polgonos (tringulos y cuadrilteros). Entre las clases que extienden a GeometryArray estn:

LineArray PointArray TriangleArray QuadArray GeometryStripArray

Estas subclases se obervan en el siguiente diagrama:

Sus constructores son:


PointArray (int vertexCount, int vertexFormat) LineArray (int vertexCount, int vertexFormat) TriangleArray (int vertexCount, int vertexFormat) QuadArray (int vertexCount, int vertexFormat)

vertexCount es la cantidad de vrtices que conforman la figura, y vertexFormat es un conjunto de flags que determinan ciertas caractersticas de la figura. Despus de crear el objeto, es necesario empezar a llenarlo con la informacin de las coordenadas de sus vrtices. La clase GeometryStripArray es una clase abstracta, de la cual se derivan varias clases que permiten reusar los vrtices definidos. Estas subclases son:

LineStripArray TriangleStripArray TriangleFanArray

Appearance Los objetos de Shape3D, as como referencian Nodos Componentes de Geometry, tambin pueden referenciar Nodos Componentes de Appearance. Al referenciar a los nodos de Appearance, permiten describir como se "ven" los objetos. Adems permite que varios objetos de Shape3D referencien al mismo nodo Appearance, haciendo que los objetos de "vean" similares. Los nodos de Appearance pueden referenciar a varios tipos de Nodos Componentes como:

PointAttributes LineAttributes PolygonAttributes ColoringAttributes

Para estos nodos, se utilizan los siguientes constructores: PointAttributes (float pointSize, boolean state) Crea un Nodo Componente que describe el tamao del punto, y si habilitar o no anti-aliasing LineAttributes (float pointSize, int linePattern, boolean state) Crea un Nodo que describe la lnea, de grosor pointSize, el patrn ha usar para dibujarla, y si habilitar o no el anti-aliasing PolygonAttributes (int polygonMode, int cullFace, float polygonOffset, boolean backFaceNormalFlip)

Crea un Nodo que determina si el polgono va a ser dibujado con puntos, lneas, o polgonos rellenos; mostrar ambas caras o no; la profundidad del polgono; y si generar las normales para la cara reversa ColoringAttributes (float red, float green, float blue, int shadeModel) Crea un Nodo para describir el color (con los valores de red, green y blue), y determinar la forma de sombrear la figura

Al definir el Nodo Appearance, se determina las caractersticas de apariencia que va a tener el objeto que hace referencia al nodo.

Interaccin y Animacin
Behaviors En Java3D, las modificaiones a las escenas creadas se hacen a traves de clases de tipo Behavior, dentro de las clases incluidas en la distribucin de Java3D se encuentran interpoladores de rotacion, traslacion y escalamiento; asi como receptores de eventos del maouse y teclado. Dependiedo del tipo de Behavior, es el nodo en la escena que es cambiado, en el caso de los Behaviors de movimiento, ellos cambian un TransformGroup, mientras que el interpolador de color modifica un material. Para poder cambiar las caracteriticas del elemento del grafo requerido, los Behaviors deben recibir referencias a los nodos o componentes a modificar.

Mouse Behavior Este grupo de clases atrapa los eventos de Mouse y los usa para rotar, trasladar y hacer zoom a los objetos en la escena; normalmente se asocian al ViewPlataform para manejar la visualizacion de la escena en forma interactiva. Key Behavior Esta clase atrapa los eventos del teclado para manejar la visualizacion de la escena. Al igual que los Mouse Behavior normalmente se asocia al ViewPlataform Interpolator La lista de interpoladores asi como la informacion que cambian se ve en la siguiente tabla:
Behavior ColorInterpolator Target Type Material

PathInterpolator TransformGroup PositionInterpolator TransformGroup RotationInterpolator TransformGroup ScaleInterpolator TransformGroup SwitchValueInterpolator Switch TransparencyInterpolator TransparencyAttributes

Custom Behaviors En la mayoria de las aplicaiones uno quiere tener el control sobre los cambios que se producen en la escena, en esta caso es necesario escribir nuestros propios Behavior, ya sean estos para generar una animacin, como para interactuar de forma adecuada con el usuario. Para crear nuestros proios Behaviors se puede seguir la siguiente receta: 1. Escribir al menos un cosntructor que reciba la referencia al objeto a cambiar. 2. sobreescribir el mtodo public void initialization() especificando el criterio inicial de wakeup (trigger) 3. sobreescribir el mtodo public void processStimulus() el cual decodifica el trigger, produce el cambio en el objeto, y dependiendo de las condiciones setea el trigger nuevamente Criterios de Wakeup Como se ve en la receta los Behaviors utilizan un sistema de cirterios para despertar, estos criterios estn definidos en las clases que heredan de WakeupCondition. Para ver los posibles criterios aqui se presenta la herarquia de los WakeupCondition

Dentro de los mas tiles estn las clases WakeupOnAWTEvent y WakeupOnElapsedTime ya que con el primero se puede manejar toda la interaccion con el ususario, y con el segundo crear animaciones. Los constrcutores para cada uno de estos dos tipos de WakeupCondition son los siguientes: WakeupOnAWTEvent(int AWTId) AWTid es uno de los siguientes: KeyEvent.KEY_TYPED, KeyEvent.KEY_PRESSED, KeyEvent.KEY_RELEASED, MouseEvent.MOUSE_CLICKED, MouseEvent.MOUSE_PRESSED, MouseEvent.MOUSE_RELEASED, MouseEvent.MOUSE_MOVED, MouseEvent.MOUSE_DRAGGED, etc. WakeupOnAWTEvent(long eventMask) Se dan como parametro valores 'OR'eados. estos valores pueden ser: KEY_EVENT_MASK, MOUSE_EVENT_MASK, MOUSE_MOTION_EVENT_MASK, entre otros. WakeupOnElapsedTime(long milliseconds) Despierta en el tiempo dado. Como usar los Behaviors Aqui se presenta una simple receta, para el uso de los Behaviors:

1. Preparar el SceneGraph, poniendo un TrasformGroup o los objetos necesarios 2. Insertar el Behavior en el SceneGraph referenciado al objeto a cambiar 3. Especificar una frontera de ejecucion 4. Setear las capacidades (de escritura o lectura) del objeto a cambiar

A continuacin se meustran dos grafos con Behaviors incluidos: El primero modifica el TransformGroup, el segundo la apariencia del Shape3D

Iluminacin
Caracteristices Bsicas Hasta el momento todolo que se ha visto a nivel de pintado de las figuras es l a informacin que se da en el ColoringAttributes de la Apariencia. De esta forma no se tiene un buen nivel de realismo, Es por eso que en en esta seccin Veremos como Java3D maneja los efectos de la Luz. Java3D basa completamente sus modelos de 'Shading' en OpenGL, asi que mas informacin se puede encontrara en la documentacin de OpenGL. Modelo de Iluminacin Primero que nada se debe decir que al igual que en OpenGL, el modelo slo simula los efectos de la luz sobre objetos independientes, por lo que no hay

sombras ni reflexiones; para lograr estos efectos se deben simular dibujando poligonos que aparezcan en la escena como sombras o reflejos. El modelo de iluminacin tres tipos de reflexiones de la luz, la ambiental, la difusa y la especular. Para entender mejor estos terminos se presenta la siguiente ilustracin

Colores y Sombreado Los colores en Java3D se especifican usando los valores RGB (red, green, blue), y para casos esciales se puede utililzar el RGBA (RGB mas Alpha, transparencia). Los tipos de sombreado aceptados por Java3D son Flat y Gouraud; esta caracteristica se debe setear en el ColoringAttributes, de la apariencia de los objetos. Las diferencias son claras en la siguiente figura.

Receta para crear un objeto iluminado 1. Especificar la fuente de luz 1. Setear Lmites 2. Ponerlo en el Grafo de la Escena

2. Objeto 1. Generar normales 2. Ponerle un Material a la apariencia

A continuacin un ejemplo mnimo usando la receta


Appearance createAppearance() { Appearance appear = new Appearance(); Material material = new Material(); appear.setMaterial(material); material en la apariencia return appear; } BranchGroup createScene (){ BranchGroup scene = new BranchGroup(); scene.addChild(new Sphere(0.5f, Sphere.GENERATE_NORMALS, normales del objeto createAppearance())); AmbientLight lightA = new AmbientLight(); lightA.setInfluencingBounds(new BoundingSphere()); scene.addChild(lightA); en el grafo return scene; } //2.1 generar

//2.2 poner

//1.1 Bounds //1.2 ponerlo

Y el grafo correspondiente.

Fuentes de Luz Existen cuatro tipos de fuentes de luz, AmbientLight, PointLight, DirectionalLighty SpotLight; para cada una de ellas veremos sus constructores. AmbientLight(boolean lightOn, Color3f color) Crea una luz ambiental con los parametros especificados DirectionalLight(boolean lightOn, Color3f color, Vector3f direction) Crea la luz direccional con los parametros indicados y en la direccin dada PointLight(boolean lightOn, Color3f color, Point3f position, Point3f attenuation) Crea una luz puntual con los datos entregados; la atenuacin contiene los parametros de una ecuacin cuadratica para indicar como la luz pierde intensidad con la distancia SpotLight(boolean lightOn, Color3f color, Point3f position, Point3f attenuation, Vector3f direction, float spreadAngle, float concentration) Crea la luz 'spot' con los parametros dados Material Los materiales presentan las cracteristicas reflectivas de un objeto, el cual es sumado a la informacin de colores dada por las fuentes de luz. A cotinuacion un resumen de los constructores y mtodos de la clase Material Material()

Crea el material con parametros por default Material(Color3f ambientColor, Color3f emissiveColor, Color3f diffuseColor, Color3f specularColor, float shininess) Crea el material con los parametros dados void setAmbientColor(Color3f color) cambia el color de ambiente para el material void setDiffuseColor(Color3f color) cambia el color de reflexin difusa para el material void setEmissiveColor(Color3f color) cambia el color emitido por el material void setEmissiveColor(Color3f color) cambia el color de ambiente para el material void setShininess(float shininess) cambia el brillo(reflectividad especular) del material void setSpecularColor(Color3f color) cambia el color de reflexin especular para el material
http://users.dcc.uchile.cl/~lmateu/CC60H/Trabajos/cmiddlet/introduccion.html

Vous aimerez peut-être aussi