figura java 3d





codigo utilizado


package ATM;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.Primitive;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.ViewingPlatform;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.media.j3d.*;
import javax.swing.JOptionPane;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;


/**
 * @author Raúl García Cortés y Oscar García Neri
 * @e-mail GarciaCortes.Raul@gmail.com
 * @web    rgc.mex.tl
 * @version 2014.07.07
 */

public class ATM extends Applet {

    Canvas3D canvas3d;//canvas donde se dibujara el 3d
    private SimpleUniverse universo;//universo central del canvas 
    private static Frame frame; //frame donde se mostrara el universo

    ATM() {
    }

    //Funcion que crea una esfera con una textura externa
    private Sphere CreaEsfera(String textura, float radio) {
        Appearance apEsfera = new Appearance();
        TextureLoader cargador = new TextureLoader(textura, this);//carga la textura desde una ruta url
        Texture textura1 = cargador.getTexture();//guarda la textura
        apEsfera.setTexture(textura1);//aplica la textura a la apariiencia
        TextureAttributes atos = new TextureAttributes();//atributos para manejar la textura
        atos.setTextureMode(TextureAttributes.ALLOW_MODE_READ);
        apEsfera.setTextureAttributes(atos);
        Sphere esfera = new Sphere(radio, Primitive.GENERATE_TEXTURE_COORDS, 50, apEsfera);//crea la esfera con tmaño y textura
        return esfera;//regresa la esfera
    }

    //Funcion que crea una esfera con un color definido
    private Sphere CreaEsfera(float radio, Color3f color) {
// Appearance apEsfera = new Appearance();
// TextureLoader cargador = new TextureLoader(textura, this);
// Texture textura1=cargador.getTexture();
// apEsfera.setTexture(textura1);
// TextureAttributes atos = new TextureAttributes();
// atos.setTextureMode(TextureAttributes.MODULATE);
// apEsfera.setTextureAttributes(atos);
        //Sphere esfera = new Sphere(radio, Primitive.GENERATE_TEXTURE_COORDS, apEsfera);
        Appearance apariencia = new Appearance();
        Material material = new Material();//define un material para el objeto
        material.setShininess(20.0f);//brillo
        material.setDiffuseColor(color);//material de difuminacion
        material.setSpecularColor(color);//color especular
        apariencia.setMaterial(material);//se pasa el material a la apariencia
        Sphere esfera = new Sphere(radio, Sphere.GENERATE_NORMALS, 50, apariencia);//crea la esfera
        return esfera;//regresa la esfera
    }

    @Override
    public void init() {

        super.setLayout(new BorderLayout());
        GraphicsConfiguration configuracion = SimpleUniverse.getPreferredConfiguration();
        canvas3d = new Canvas3D(configuracion);
        super.add("Center", canvas3d);

        universo = new SimpleUniverse(canvas3d);

        universo.addBranchGraph(escena());//agrega la escena creada el branchgroup
        // Añado comportamiento al ViewingPlatform para poder rotarlo con el raton o con el teclado
        ViewingPlatform viewingPlatform = universo.getViewingPlatform();
        viewingPlatform.setNominalViewingTransform();

        // Comportamiento de orbita
        OrbitBehavior orbit = new OrbitBehavior(canvas3d, OrbitBehavior.STOP_ZOOM);
        // BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
        orbit.setSchedulingBounds(bs);
        viewingPlatform.setViewPlatformBehavior(orbit);

        BranchGroup circulo = new BranchGroup();
        BranchGroup circulo2=new BranchGroup();
        BranchGroup circulo3=new BranchGroup();
        
        
        //lineas
//        Transform3D rot = new Transform3D();
//        rot.rotX(Math.toRadians(45));
//        TransformGroup tg = new TransformGroup(rot);
//        
//        Transform3D rot2 = new Transform3D();
//        rot2.rotX(Math.toRadians(-45));
//        TransformGroup tg2 = new TransformGroup(rot2);
//
//        Transform3D rot3 = new Transform3D();
//        rot3.rotY(Math.toRadians(180));
//        TransformGroup tg3 = new TransformGroup(rot3);

        
//        circulo.addChild(circulo(0.8f));
//        tg.addChild(circulo(0.8f));
//        circulo.addChild(giros(tg));
//        universo.addBranchGraph(circulo);
//        
//        circulo2.addChild(circulo2(0.8f));
//        tg2.addChild(circulo2(0.8f));
//        circulo2.addChild(giros(tg2));
//        universo.addBranchGraph(circulo2);
//        
//        
//        
//        circulo3.addChild(circulo3(0.8f));
//        tg3.addChild(circulo3(0.8f));
//        circulo3.addChild(giros(tg3));
//        universo.addBranchGraph(circulo3);
    }

    public TransformGroup giros(TransformGroup tg) {

        Transform3D t3Drotation = new Transform3D();
        TransformGroup giro = new TransformGroup(t3Drotation);//hace un nuevo grupo de transformacion de 3D
        giro.addChild(tg);
        //TransformGroup giro=tg;
        // giro.addChild(tg);
        giro.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        giro.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

        Alpha alpha = new Alpha(-1, 4500);//Factor de velocidad de rotación
        RotationInterpolator rotator = new RotationInterpolator(alpha, giro);
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
                100.0);
        rotator.setSchedulingBounds(bounds);
        giro.addChild(rotator);

        return giro;
    }

    public TransformGroup circulo(float r) {

        float x;
        float y1;
        float z = 0;


        int confila[] = {1995, 200};
        LineStripArray puntos = new LineStripArray(3800, LineStripArray.COORDINATES | LineStripArray.COLOR_3, confila);
        Point3f p1 = new Point3f(0, 0, 0);
        int p = 0;//contador de puntos
       for (x = -(r); x <= (r); x += 0.01f) //inicia en r hasta -r
        {
            y1 = (float) (Math.sqrt(Math.pow(r, 2) - Math.pow(x, 2)));
            puntos.setCoordinate(p, new Point3f(x, y1, z));
            if (x == -r) {
                p1.set(x, y1, z);
            }
            puntos.setColor(p, new Color3f(0, .5f, 0));
            p++;
        }


        for (x = (r); x >= -(r); x -= 0.01f) //inicia en r hasta -r
        {
            y1 = -(float) (Math.sqrt(Math.pow(r, 2) - Math.pow(x, 2)));
            puntos.setCoordinate(p, new Point3f(x, y1, z));
            puntos.setColor(p, new Color3f(0, .5f, 0));
            p++;
        }
        

        for (int i = p; i < 3800; i++) {
            puntos.setCoordinate(i, p1);
        }
        Shape3D s3d = new Shape3D(puntos);
        TransformGroup tg = new TransformGroup();
        tg.addChild(s3d);
        return tg;
    }

    public TransformGroup circulo2(float r2) {

        float x;
        float y1;
        float z = 0;


        int confila[] = {1995, 200};
        LineStripArray puntos = new LineStripArray(3800, LineStripArray.COORDINATES | LineStripArray.COLOR_3, confila);
        Point3f p1 = new Point3f(0, 0, 0);
        int p = 0;//contador de puntos
       for (x = -(r2); x <= (r2); x += 0.01f) //inicia en r hasta -r
        {
            y1 = (float) (Math.sqrt(Math.pow(r2, 2) - Math.pow(x, 2)));
            puntos.setCoordinate(p, new Point3f(x, y1, z));
            if (x == -r2) {
                p1.set(x, y1, z);
            }
            puntos.setColor(p, new Color3f(0.3f, .5f, 0));
            p++;
        }


        for (x = (r2); x >= -(r2); x -= 0.01f) //inicia en r hasta -r
        {
            y1 = -(float) (Math.sqrt(Math.pow(r2, 2) - Math.pow(x, 2)));
            puntos.setCoordinate(p, new Point3f(x, y1, z));
            puntos.setColor(p, new Color3f(0, .5f, 0));
            p++;
        }
        

        for (int i = p; i < 3800; i++) {
            puntos.setCoordinate(i, p1);
        }
        Shape3D s3d = new Shape3D(puntos);
        TransformGroup tg2 = new TransformGroup();
        tg2.addChild(s3d);
        return tg2;
    }
    
     public TransformGroup circulo3(float r3) {

        float x;
        float y1;
        float z = 0;


        int confila[] = {1995, 200};
        LineStripArray puntos = new LineStripArray(3800, LineStripArray.COORDINATES | LineStripArray.COLOR_3, confila);
        Point3f p1 = new Point3f(0, 0, 0);
        int p = 0;//contador de puntos
       for (x = -(r3); x <= (r3); x += 0.01f) //inicia en r hasta -r
        {
            y1 = (float) (Math.sqrt(Math.pow(r3, 2) - Math.pow(x, 2)));
            puntos.setCoordinate(p, new Point3f(x, y1, z));
            if (x == -r3) {
                p1.set(x, y1, z);
            }
            puntos.setColor(p, new Color3f(0.3f, .5f, 0));
            p++;
        }

        for (x = (r3); x >= -(r3); x -= 0.01f) //inicia en r hasta -r
        {
            y1 = -(float) (Math.sqrt(Math.pow(r3, 2) - Math.pow(x, 2)));
            puntos.setCoordinate(p, new Point3f(x, y1, z));
            puntos.setColor(p, new Color3f(0, .5f, 0));
            p++;
        }
        

        for (int i = p; i < 3800; i++) {
            puntos.setCoordinate(i, p1);
        }
        Shape3D s3d = new Shape3D(puntos);
        TransformGroup tg2 = new TransformGroup();
        tg2.addChild(s3d);
        return tg2;
    }
    //Crea la escena que contendra los elementos
    public BranchGroup escena() {

        float r = .5f;
        BranchGroup bg = new BranchGroup();//brachgroup mayor

        TransformGroup tge = new TransformGroup();
        Sphere es = CreaEsfera(r, new Color3f(.5f, .5f, .5f)); //esfera central 

        tge.addChild(es);//agrega la esfera centarl al branch gruop

        tge.addChild(foco(r + .6f, .05f, new Color3f(Color.cyan), 1000, 0));//crea un foco de color rojo
        tge.addChild(foco(r + .4f, .09f, new Color3f(Color.BLUE), 1000, 30));//crea un foco de color azul
        tge.addChild(foco(r + .5f, .08f, new Color3f(Color.yellow), 7000, 60));//crea un foco de color amarillo
      tge.addChild(foco(r + .7f, .05f, new Color3f(Color.pink), 8000, 90));//crea un foco de color azul claro
        tge.addChild(foco(r + .35f, .03f, new Color3f(Color.orange), 9000, 120));//crea un foco de color magneta
        tge.addChild(foco(r + .9f, .04f, new Color3f(Color.green), 10000, 150));//crea un foco de color verde
 tge.addChild(foco(r + .9f, .04f, new Color3f(Color.red), 100, 150));
        // bg.addChild(tge);//agrega al branchgruop todos los focos y la esfera central a un solo grupo

        bg.addChild(Orbita(tge, 0, .0f, (float) Math.toRadians(0)));
        //  bg.addChild(CreaEsfera(.5f,new Color3f(.5f,.8f,.2f)));
        // bg.addChild(foco(0f,.5f,new Color3f(Color.BLACK),3000,0));
        bg.addChild(foco(1.3f,.05f,new Color3f(Color.white),9000,45));
//        bg.addChild(foco(.9f,.09f,new Color3f(Color.BLUE),4000,90));
//        bg.addChild(foco(1f,.08f,new Color3f(Color.yellow),100000,0));
       bg.addChild(foco(.7f,.05f,new Color3f(Color.cyan),9090,167));
//        bg.addChild(foco(1.1f,.03f,new Color3f(Color.MAGENTA),9090,137));



        bg.compile();
        return bg;//regresa el brachgroup
    }

    //crea una punto de luz del color del foco
    public TransformGroup luz(Color3f color) {
        TransformGroup tg = new TransformGroup();

        PointLight slight = new PointLight();//crea una luz
        // new Point3f(0f,3f,1.5f), new Point3f(1f,0f,0f));
        slight.setInfluencingBounds(bs);//la luz afectara a toda la esfera global
        slight.setAttenuation(1f, 0f, 0f);//atenuacion del rayo de luz

        slight.setPosition(new Point3f(0.0f, 0.0f, 0f));//posicion de la luz

        slight.setColor(color);//la luz de acuerdo al color

        tg.addChild(slight);//agreaga la luz al tg

        return tg;//regresa el transform group
    }

    //crea un foco(esfera) con distancia, radio, color, velocidad y angulo de orbita
    public TransformGroup foco(float distancia, float radio, Color3f color, int velocidad, float angulo) {

        TransformGroup foco = new TransformGroup();//crea un transform group
        Sphere esfera = CreaEsfera(radio, color);//crea una esfera de radio y color, llama a crear esfera

        SpotLight slight = new SpotLight();//crea un lunar de luz
        slight.setInfluencingBounds(esfera.getBounds());//la luz afectara a la esfera creada, dara el efecto de que la esfera es de color
        slight.setPosition(new Point3f(radio + .5f, 0.0f, 0f));//pondra la luz a .5 del borde de la esfera
        slight.setConcentration(0f);//concentracion de la luz
        slight.setSpreadAngle(60);//angulo del  cono de luz
        slight.setColor(color);//color de la luz
        esfera.addChild(slight);//agrega al esfera la luz

        SpotLight slight2 = new SpotLight();//crea un lunar de luz
        slight.setInfluencingBounds(esfera.getBounds());//la luz afectara a la esfera creada, dara el efecto de que la esfera es de color
        slight.setPosition(new Point3f(radio + .5f, 0.0f, 0f));//pondra la luz a .5 del borde de la esfera
        slight.setConcentration(0f);//concentracion de la luz
        slight.setSpreadAngle(60);//angulo del  cono de luz
        slight.setColor(color);//color de la luz
        esfera.addChild(slight2);//agrega al esfera la luz

        SpotLight slight3 = new SpotLight();//crea un lunar de luz
        slight.setInfluencingBounds(esfera.getBounds());//la luz afectara a la esfera creada, dara el efecto de que la esfera es de color
        slight.setPosition(new Point3f(radio + .5f, 0.0f, 0f));//pondra la luz a .5 del borde de la esfera
        slight.setConcentration(0f);//concentracion de la luz
        slight.setSpreadAngle(60);//angulo del  cono de luz
        slight.setColor(color);//color de la luz
        esfera.addChild(slight3);//agrega al esfera la luz

        SpotLight slight4 = new SpotLight();//crea un lunar de luz
        slight.setInfluencingBounds(esfera.getBounds());//la luz afectara a la esfera creada, dara el efecto de que la esfera es de color
        slight.setPosition(new Point3f(radio + .5f, 0.0f, 0f));//pondra la luz a .5 del borde de la esfera
        slight.setConcentration(0f);//concentracion de la luz
        slight.setSpreadAngle(60);//angulo del  cono de luz
        slight.setColor(color);//color de la luz
        esfera.addChild(slight4);//agrega al esfera la luz

        esfera.addChild(luz(color));//agrega el color de luz a la esfera
        foco.addChild(esfera);//agrega al transformgroup la esfera


        TransformGroup tgf = Orbita(foco, velocidad, distancia, angulo);//crea una orbita al foco
        //System.out.println("boun "+esfera.getBounds());
        return tgf;//regresa el transformgroup del foco
    }
    BoundingSphere bs = new BoundingSphere(new Point3d(), 100.0);

    //crea una orbita a un transformgroup de entrada
    private TransformGroup Orbita(TransformGroup entrada, float velocidad, float distancia, float angulo) {

        Transform3D t3Dtranslation = new Transform3D();//transform para rtaslacion
        t3Dtranslation.setTranslation(new Vector3f(distancia, 0f, 0f));//traslada el tg a la distancia entrada
        TransformGroup TGTransladado = new TransformGroup(t3Dtranslation);//crea untg del tg trasladado
        TGTransladado.addChild(entrada);//agrega el transformgroup de entrada

        //creamos la rotacion de la 
        TransformGroup TGOrbita = new TransformGroup();
        TGOrbita.addChild(TGTransladado);
        TGOrbita.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

        //creamos la rotacion
        Alpha alpha2 = new Alpha(-1, (int) velocidad);
        Transform3D ejeY2 = new Transform3D();
        RotationInterpolator rot2 = new RotationInterpolator(alpha2, TGOrbita, ejeY2, 0.0f, (float) Math.PI * 2);
        BoundingSphere limites2 = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
        rot2.setSchedulingBounds(limites2);

        TGOrbita.addChild(rot2);


        //inclinamos la orbita
        Transform3D rotOrbita = new Transform3D();
        rotOrbita.rotZ(Math.toRadians(angulo));
        TransformGroup TG = new TransformGroup(rotOrbita);
        TG.addChild(TGOrbita);

        return TG;//regresa un nuevo transformgroup
    }

    public static void main(String[] args) {
        frame = new MainFrame(new ATM(), 700, 600);
        frame.setTitle(" Movimiento - Alex Hernandez");
        frame.setIconImage(null);
        frame.setVisible(true);
        frame.setResizable(true);
        frame.setLocationRelativeTo(null);
        Sonido s;
        
        try {
            s = new Sonido("C:\\atm.wav");
            s.reproducir();
        } catch (Exception ex) {
            System.out.println("ERROR: No encontrado.");
            JOptionPane.showMessageDialog(null, "Se recomienda ubicar el archivo \"atm.wav\" en el directorio Raíz (C:\\)", "Sin archivo de audio", JOptionPane.WARNING_MESSAGE);
        }
//        
//        JOptionPane.showMessageDialog(null,
//                "ATAJOS DEL TECLADO Y MOUSE:\n"
//                + "\n Mouse: Cambiar perspectiva visual"
//                + "\n Scroll del Mouse: Acercar o alejar"
//                + "\n"
//                + "\n D: Definición de átomo"
//                + "\n E: Estructura atómica"
//                + "\n P: Propiedades atómicas"
//                + "\n M: Más información"
//                + "\n F1: Ayuda rápida"
//                + "\n Escape: Salir",
//        "AYUDA", JOptionPane.QUESTION_MESSAGE);
//        
        frame.addKeyListener(new KeyListener(){
            
            @Override
            public void keyPressed (KeyEvent e){
                int key = e.getKeyCode();
                
                switch(key){
                    case KeyEvent.VK_D:
                        System.out.println("Definición de Átomo");
                        JOptionPane.showMessageDialog(null, "DEFINICIÓN DE ÁTOMO:\n"
                                + "Es la partícula más pequeña en que un elemento puede ser dividido sin perder sus propiedades químicas",
                                "Definición de Átomo", JOptionPane.INFORMATION_MESSAGE);
                        break;
                        
                    case KeyEvent.VK_E:
                        System.out.println("Estructura atómica");
                        JOptionPane.showMessageDialog(null, "ESTRUCTURA ATÓMICA:\n"
                                + "El átomo contiene Protones (-), Neutrones (sin carga) y Electrones (+)\n",
                                "Estructura atómica", JOptionPane.INFORMATION_MESSAGE);
                        break;
                        
                    case KeyEvent.VK_P:
                        System.out.println("Propiedades atómicas");
                        JOptionPane.showMessageDialog(null, "PROPIEDADES ATÓMICAS:\n"
                                + "Masa, Tamaño, Niveles de energía, Interacciones eléctricas entre protones y electrones",
                                "Propiedades atómicas", JOptionPane.INFORMATION_MESSAGE);
                        break;
                        
                    case KeyEvent.VK_M:
                        System.out.println("Más información");
                        JOptionPane.showMessageDialog(null, "Espere, cargando página web...", "Más información", JOptionPane.INFORMATION_MESSAGE);
                            try {
                                Desktop.getDesktop().browse(new URI("http://es.wikipedia.org/wiki/%C3%81tomo"));
                            } catch ( IOException | URISyntaxException ex) {
                                Logger.getLogger(ATM.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        break;
                        
                    case KeyEvent.VK_F1:
                        System.out.println("F1");
                        JOptionPane.showMessageDialog(null,
                                "ATAJOS DEL TECLADO Y MOUSE:\n"
                                + "\n Mouse: Cambiar perspectiva visual"
                                + "\n Scroll del Mouse: Acercar o alejar"
                                + "\n"
                                + "\n D: Definición de átomo"
                                + "\n E: Estructura atómica"
                                + "\n P: Propiedades atómicas"
                                + "\n F1: Ayuda rápida"
                                + "\n Escape: Salir",
                        "AYUDA", JOptionPane.QUESTION_MESSAGE);
                        break;
                        
                    case KeyEvent.VK_ESCAPE:
                        System.out.println("Esc");
                        JOptionPane.showMessageDialog(null, "Gracias :)", "FIN", JOptionPane.INFORMATION_MESSAGE);
                        System.exit(0);
                        break;
                        
                    default:
                        //JOptionPane.showMessageDialog(null, "¡ESA TECLA NO TIENE NINGUNA FUNCIÓN!   (Código: " + e.getKeyCode() + "   |   Caracter: " + e.getKeyChar() + ")" );
                        System.out.println("¡ESA TECLA NO TIENE NINGUNA FUNCIÓN!   (Código: " + e.getKeyCode() + " | Caracter: " + e.getKeyChar() + ")" );
                        break;
                }
            }

            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println("keyTyped");
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("keyReleased");
            }
        });
    }
}


Comentarios

Entradas populares