Vous êtes sur la page 1sur 9

JAVA 3D Presentado por: Jorge Andrs Fuentes INGENIERIA ELECTRONICA UNIVERSIDAD EL BOSQUE 27 de Mayo de 2005

cod: 04270031

INTRODUCCION JAVA 3D es un suplemento de java para mostrar grficas en 3d, programas hechos en java3d pueden ser ejecutados sobre diferentes tipos de computadores y sobre Internet. La clase de librera java3d provee una interfaz ms simple que la mayora de interfaces graficas en 3d, y a pesar de esto tiene capacidad suficiente para producir buenos juegos y animaciones. Java3d esta basado en tecnologa existentes tales como openGL y directX de esta forma los programas no corren tan lentamente como uno esperara. Tambin se pueden incorporar objetos creados por paquetes de modelamiento en 3d, como TrueSpace y VRML. Como en diferentes programas de modelamiento 3D hay 5 caractersticas principales a tener en cuenta a la hora de crear un objeto 3D, la primera es su forma y estas figuras se basan en la geometra clsica (euclidiana) que conocemos como esferas, cubos, pirmides, conos, etc. Lo siguiente a tener en cuenta es su posicin o ubicacin en el ambiente, por consiguiente ya estando formada la figura y posicionada en el espacio hay que ver su textura y esta puede ser proporcionada por una imagen, o por un tipo especifico de programacin en la superficie del objeto; como paso a seguir se da la impresin de profundidad haciendo uso de los efectos de luz y posicionamiento de imagen. Ya habiendo hecho estas cosas bsicas, lo dems es perfeccionar la imagen de tal forma que se cree un entorno totalmente tridimensional. LA FORMA: Para crear una imagen en 3D es necesario crear un espacio virtual que contenga mi ESCENA, despus de esto se debe crear una estructura de datos que contengan el grupo de objetos a todo esto se le debe agregar un objeto al grupo y despus de esto se selecciona una posicin para el agente externo que vera dicha imagen, finalmente tomamos todo este grupo y lo introducimos al universo virtual que creamos en la etapa inicial del proceso.

ILUMINACION: Si para otros un cuadrado no representa un objeto 3D lo que debe hacerle APRA darle dicha sensacin es agregarle algunas luces al universo ya creado, la cada de luz sobre el objeto nos proporcionara una gama de sombras que nos darn la sensacin deseada y veremos formas en 3 dimensiones.

POSICIONAMIENTO DE LOS OBJETOS: Hasta ahora se ha partido del principio de que todo esta ubicado en el centro del universo virtual que se ha creado en java 3d se trabaja 3 ejes coordenados X,Y,Z los cuales nos permiten manipular el objeto a lo largo, ancho y profundo de la pantalla , esto es llamado sistema coordinado de la mano derecha, se debe tener en cuenta que en JAVA3D todas las distancias estn medidas en metros, para ubicar el objeto UD comienza en la posicin (0,0,0) y variando estas los pueden mover a cualquier sitio, este movimiento es llamado transformacin y las clases que se usan son TransformGroup, Transform3d, entonces se coloca tanto el objeto como el Transform3d a un TransformGroup. PASOS 1. crear un Trasform, un grupo de Transform y un Objeto EJEMPLO Transform = new Transform3D(); transformGroup tg = new TransformGroup(); Cone cone = new Cone(0.5f, 0.5f); Especificar la ubicacin del objeto Vector3f vector = new Vector3f(.2f,.1f , -.4f); inicializar el movimiento del transform y la Transform.setTranslation(vector); ubicacin del objeto agregar el transfom al transform group tg.setTransform(transform); agregar el objeto al grupo transform tg.addChild(cone);

2. 3. 4. 5.

Esto puede parecer complicado pero los grupos de Transform. Nos permiten agrupar objetos y moverlos como una unidad, por ejemplo una mesa puede estar hecha de cilindros para las aptas y una tabla para la superficie, si agregamos todas estas partes a la mesa como un solo grupo Transform. Se puede mover todo el grupo con solamente una translacin. La clase Transform3D puede hacer mucho mas que especificar las coordenadas de un objeto, tambin incluye funciones

como Set Scale que cambian el tamao de un objeto y RotX, RotY y RotZ para hacer que un objeto rote de acuerdo al eje, en sentido de las manecillas del reloj.

TEXTURA: Hay muchas formas de cambiar la manera como luce un objeto, puede cambiar el color como tambin al cantidad de luz reflejada, o pude pintarla con dos imgenes dimensionales o agregarle texturas a la superficie. La clase Appearance contiene las funciones APRA hacer estos cambios. La forma mas simple de ajustar la apariencia es especificando solo el color y el mtodo del sombreado. Esto se trabaja para asignarle textura a un objeto de color simple o solid, pero para hacer que se vea realista se debe especificar como un objeto aparece debajo de las luces, esto se hace creando un material. PASOS Crear un object Crear una appearance Crear un color Crear atributos de un color EJEMPLO Sphere sphere = new Sphere(); Appearance ap = new Appearance(); Color3f col = new Color3f(0.0f, 0.0f, 1.0f); ColoringAttributes ca = new ColoringAttributes (col, ColoringAttributes.NICEST); ap.setColoringAttributes(ca); sphere.setAppearance(ap);

1. 2. 3. 4.

5. Agregar atributos a la apariencia 6. escoger la apariencia para el objeto

Materiales Los materiales tienen 5 propiedades que permiten especificar como un objeto debe lucir, hay cuatro opciones: Ambiente, emisin, difuso, especulativo la quita propiedad es el brillo que se especifica con un nmero. Cada opcin especifica que luz es removida en cierta situacin: Ambiente: Refleja la luz que ha sido dispersa por el medio ambiente haciendo imposible determinar la emisin de la luz. Esto es creado por AmbientLigth en java 3D. emisin: el color es removido aun en la oscuridad, se puede usar para anuncios de neon o brillos en la oscuridad. Difuso: Refleja la luz que viene en una direccin, si es brillante la superficie se vuelve pixelada, con algunos brillos en la superficie. Esto es usado con DireccionalLigth. Especulativo: La luz viene de una direccin en particular y tiende a rebotar en la superficie. Metal brillante y plstico tienen un alto

componente de especularidad, la luz que alcanza a ver el espectador depende de la locacin y el Angulo en que este se encuentre. Cambiando los factores de brillo no solo cambian el brillo del objeto sino que tambin puede cambiar cuanto brilla en una pequea rea o en una larga rea con menos o ms brillos. Para la mayora de los objetos se puede usar un color APRA ambos, ambiente y difusin, de igual forma negro APRA la emisin (la mayora de los objetos no brillan en la oscuridad) si es un objeto brillante se puede usar un color ms suave o luminoso para la reflexin especulativa. Textura: Los materiales cambian la apariencia de toda una forma pero algunas veces aun el objeto ms brillante puede parecer opaco, pero agregando textura se pueden obtener efecto ms interesante como efecto de mrmol o de arrugar. La clase TextureLoader le permite cargar imgenes que usen una textura. Las dimensiones de la imagen debe ser de orden 2n. por ejemplo 128 pxeles por 256 pxeles. Cuando UD carga una textura tambin podemos decir como la vamos a usar en la imagen por ejemplo, RGB para usar el color de la imagen o luminiscencia para ver la imagen en blanco y negro. Despus de que textura es cargada, puede cambiar TextureAttributes para decir si quiere o no reemplazar la imagen con el objeto que esta abajo o modularlo con un color, tambin se pude aplicar como calcomanas o doblar la imagen con el color de su escogencia. Si esta usando un simple objeto como una esfera, tambin tendr que permitir la escogencia de la textura y banderas primitivas. Estas pueden ser seleccionadas Primitive.GENERATE_NORMALS + Primitive. GENERATE_ TEXTURE_ COORDS, cuando se crea un objeto.

ARBOL DE HERENCIA Estas fueron a grosso modo las especificaciones bsicas de un entorno tridimensional que java 3D puede proporcionar, A continuacin se muestra el rbol de herencia de la librera Java3D. Tambin se puede ver en al siguiente direccin:
http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/index.html

PROGRAMA

En este programa se muestra una esfera que al hacer clic en el botn Go se desplaza de arriba abajo en la ventana. Descripcin del programa:

import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.event.WindowAdapter; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.geometry.Sphere; import javax.swing.Timer; public class Jorge extends Applet implements ActionListener, KeyListener { private Button go = new Button("Go"); private TransformGroup objTrans; private Transform3D trans = new Transform3D(); private float height=0.0f; private float sign = 1.0f; // IR HACIA ARRIBA O HACIA ABAJO private Timer timer; private float xloc=0.0f; public BranchGroup createSceneGraph() { // CREACION DE LA RAIZ DE LOS OBJETOS EN LA ESTRUCTURA BranchGroup objRoot = new BranchGroup(); objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRoot.addChild(objTrans); // CREACION DE LA ESFERA Sphere sphere = new Sphere(0.25f); objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); Transform3D pos1 = new Transform3D(); pos1.setTranslation(new Vector3f(0.0f,0.0f,0.0f)); // UBICACION DE LA ESFERA objTrans.setTransform(pos1); objTrans.addChild(sphere); objRoot.addChild(objTrans); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

Color3f light1Color = new Color3f(1.0f, 0.0f, 0.2f); // CREACIOND E COLORES Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f); DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction); // DIRECCION DE LUZ light1.setInfluencingBounds(bounds); objRoot.addChild(light1); // CREACION DE AMBIENTE Y LUZ Color3f ambientColor = new Color3f(1.0f, 1.0f, 1.0f); AmbientLight ambientLightNode = new AmbientLight(ambientColor); ambientLightNode.setInfluencingBounds(bounds); objRoot.addChild(ambientLightNode); return objRoot;

TextureLoader loader = new TextureLoader("textura.jpg", "LUMINANCE", new Container()); Texture texture = loader.getTexture(); texture.setBoundaryModeS(Texture.WRAP); texture.setBoundaryModeT(Texture.WRAP); texture.setBoundaryColor( new Color4f( 0.0f, 1.0f, 0.0f, 0.0f ) ); // cambio de atributos //pueden ser remplazados por Blend, Recal y modulate TextureAttributes texAttr = new TextureAttributes(); texAttr.setTextureMode(TextureAttributes.MODULATE); Appearance ap = new Appearance(); ap.setTexture(texture); ap.setTextureAttributes(texAttr); //material ap.setMaterial(new Material(red, black, red, black, 1.0f)); // cracion de la esfera para los atributos int primflags = Primitive.GENERATE_NORMALS + Primitive.GENERATE_TEXTURE_COORDS;

} public Jorge() { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(config); add("Center", c); c.addKeyListener(this); timer = new Timer(100,this); //timer.start(); Panel p =new Panel(); p.add(go); add("North",p); go.addActionListener(this); go.addKeyListener(this); // CREACION DE LA ESCENA PARA AGREGAR AL UNIVERSO BranchGroup scene = createSceneGraph(); SimpleUniverse u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(scene); } public void keyPressed(KeyEvent e) { //Invoked when a key has been pressed. if (e.getKeyChar()=='s') {xloc = xloc + .1f;} if (e.getKeyChar()=='a') {xloc = xloc - .1f;} } public void keyReleased(KeyEvent e){ // QUE HACER CUANDO PRESIONE ALGUNA TECLA } } public void keyTyped(KeyEvent e){ ){ // QUE HACER CUANDO PRESIONE ALGUNA TECLA public void actionPerformed(ActionEvent e ) { // QUE PASA CUANDO REPSIONA GO if (e.getSource()==go){ if (!timer.isRunning()) { timer.start();

} } else { height += .1 * sign; if (Math.abs(height *2) >= 1 ) sign = -1.0f * sign; if (height<-0.4f) { trans.setScale(new Vector3d(1.0, .8, 1.0)); else { trans.setScale(new Vector3d(1.0, 1.0, 1.0)); } trans.setTranslation(new Vector3f(xloc,height,0.0f)); objTrans.setTransform(trans); } } public static void main(String[] args) { System.out.println("Program Started"); Jorge bb = new Jorge(); bb.addKeyListener(bb); MainFrame mf = new MainFrame(bb, 256, 256); } }

Vous aimerez peut-être aussi