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
Publicar un comentario