miércoles, 4 de enero de 2012

Cono Yoyo en java 3D.

Este es un ejemplo de un yoyo creado a partir de 2 conos.


nombre: ConeYoyoApp.java

..........................................................................................................................
/**
 *
 * @author alex4024
 */
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import javax.media.j3d.Alpha;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.RotationInterpolator;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.universe.SimpleUniverse;
import java.awt.GraphicsConfiguration;

public class ConeYoyoApp extends Applet {
    
  public class ConeYoyo {

    private BranchGroup yoyoBG;

    public ConeYoyo() {

      yoyoBG = new BranchGroup();

      Appearance app = new Appearance();

      Transform3D girar = new Transform3D();
      Transform3D transladar = new Transform3D();

      transladar.set(new Vector3f(0.1f, 0.0f, 0.0f));
      TransformGroup yoyoTGT1 = new TransformGroup(transladar);
      yoyoBG.addChild(yoyoTGT1);

      girar.rotZ(Math.PI / 2.0d);
      TransformGroup yoyoTGR1 = new TransformGroup(girar);
      Cone cone1 = new Cone(0.6f, 0.2f);
      cone1.setAppearance(app);
      yoyoTGR1.addChild(cone1);
      yoyoTGT1.addChild(yoyoTGR1);

      transladar.set(new Vector3f(-0.1f, 0.0f, 0.0f));
      TransformGroup yoyoTGT2 = new TransformGroup(transladar);
      yoyoBG.addChild(yoyoTGT2);

      girar.rotZ(-Math.PI / 2.0d);
      TransformGroup yoyoTGR2 = new TransformGroup(girar);
      Cone cono2 = new Cone(0.6f, 0.2f);
      cono2.setAppearance(app);
      yoyoTGR2.addChild(cono2);
      yoyoTGT2.addChild(yoyoTGR2);

      yoyoBG.compile();

    } 

    public BranchGroup getBG() {
      return yoyoBG;
    }

  }

  public BranchGroup createSceneGraph() {

    BranchGroup objRaiz = new BranchGroup();

    TransformGroup objVuelta = new TransformGroup();
    objVuelta.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

    objRaiz.addChild(objVuelta);
    objVuelta.addChild(new ConeYoyo().getBG());

    Alpha rotacionAlpha = new Alpha(-1, 4000);

    RotationInterpolator rotacion = new RotationInterpolator(rotacionAlpha, objVuelta);
    BoundingSphere limites = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
    rotacion.setSchedulingBounds(limites);
    objVuelta.addChild(rotacion);

    objRaiz.compile();

    return objRaiz;
  } 

  public ConeYoyoApp() {
    setLayout(new BorderLayout());
    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); 
    Canvas3D lienzo3D = new Canvas3D(config);
    add("Center", lienzo3D);

    BranchGroup escena = createSceneGraph();

    SimpleUniverse simpleU = new SimpleUniverse(lienzo3D);

    simpleU.getViewingPlatform().setNominalViewingTransform();

    simpleU.addBranchGraph(escena);
  } 

  public static void main(String[] args) {
    Frame frame = new MainFrame(new ConeYoyoApp(), 256, 256);
  } 

}

..........................................................................................................................

Alpha rotacionAlpha = new Alpha(-1,4000); en esta linea declaramos la velocidad de rotación., aclarese que 4000 es igual a 4 segundos, y -1 lo que hace es que el cubo gire infinitamente; (si este valor se cambia por 2, el cubo gira dos vez, así sucesivamente con valores positivos)...

.

Cubo en 3D con las librerías J3D, mejorado!!!

Este  es el cubo que publique hace poco, pero mejorado.


nombre:HelloJava3Dd.java
........................................................................................................
/**
 *
 * @author alex4024
 */
import java.applet.Applet; 
import java.awt.BorderLayout; 
import java.awt.Frame; 
import java.awt.event.*; 
import com.sun.j3d.utils.applet.MainFrame; 
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube; 
import java.awt.GraphicsConfiguration;
import javax.media.j3d.*;
import javax.vecmath.*;

public class HelloJava3Dd extends Applet { 
public HelloJava3Dd(){
setLayout(new BorderLayout()); 
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); 
Canvas3D lienzo3D =new Canvas3D(config); 
add("Center", lienzo3D);

BranchGroup escena=createSceneGraph(); 
escena.compile(); 

SimpleUniverse simpleU =new SimpleUniverse(lienzo3D); 

simpleU.getViewingPlatform().setNominalViewingTransform(); 

simpleU.addBranchGraph(escena); 
}

public BranchGroup createSceneGraph(){ 
            
BranchGroup objRaiz =new BranchGroup(); 

Transform3D rotar =new Transform3D(); 
                Transform3D tempRotar =new Transform3D();
                
rotar.rotX(Math.PI/4.0d); 
                tempRotar.rotY(Math.PI/5.0d);
                rotar.mul(tempRotar);
 
TransformGroup objRotar =new TransformGroup(rotar); 
                TransformGroup objVuelta = new TransformGroup();
                objVuelta.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                
                objRaiz.addChild(objRotar);
                objRotar.addChild(objVuelta);
                
                objVuelta.addChild(new ColorCube(0.4));
                
                Transform3D EjeY = new Transform3D();
                Alpha rotacionAlpha = new Alpha(-1,4000);
                
                RotationInterpolator rotador = new RotationInterpolator(rotacionAlpha, objVuelta, EjeY, 0.0f, (float)Math.PI*2.0f);
                
                BoundingSphere bounds = new BoundingSphere();
                rotador.setSchedulingBounds(bounds);
                objVuelta.addChild(rotador);
                
                return objRaiz;
}
 
public static void main(String [] args){ 
Frame frame =new MainFrame(new HelloJava3Dd(),256,256); 
}
}

........................................................................................................

Mejoras: Gira automáticamente entre los ejes X & Y
Alpha rotacionAlpha = new Alpha(-1,4000); en esta linea declaramos la velocidad de rotación., aclarese que 4000 es igual a 4 segundos, y -1 lo que hace es que el cubo gire infinitamente; (si este valor se cambia por 2, el cubo gira dos vez, así sucesivamente con valores positivos)...

.

martes, 3 de enero de 2012

Cubo 3D en java.....

El siguiente es un Applet en el que tenemos un cubo, el cual rota en cualquier dirección, mostrándonos  sus coordenadas X, Y.


Ahora el código:

nombre: Cubo.java
........................................................................................................
/**
 *
 * @author alex4024
 */
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.awt.Polygon;

class Point{

public double x;

public double y;

public double z;

Point(){ this.x=0; this.y=0; this.z=0; }

Point(double x,double y, double z){ this.x=x; this.y=y; this.z=z; }

int getXCoordinate(){return Cubo.origin + (int)this.x;}

int getYCoordinate(){return Cubo.origin - (int)this.y;}

int getZCoordinate(){return 0;} 

}

class Face{

Point p1,p2,p3,p4;

Polygon side= new Polygon();

Face(){}

Face(Point p1,Point p2,Point p3,Point p4){

this.p1=p1;this.p2=p2;this.p3=p3;this.p4=p4;

this.side.addPoint(p1.getXCoordinate(),p1.getYCoordinate());

this.side.addPoint(p2.getXCoordinate(),p2.getYCoordinate());

this.side.addPoint(p3.getXCoordinate(),p3.getYCoordinate());

this.side.addPoint(p4.getXCoordinate(),p4.getYCoordinate());

}

public void drawFace(Graphics g){ g.fillPolygon(side); }

public boolean isVisible(){

Point aux1, aux2;

aux1 = new Point(p2.x-p1.x, p2.y-p1.y, p2.z-p1.z); // p1->p2

aux2 = new Point(p4.x-p1.x, p4.y-p1.y, p4.z-p1.z); // p1->p4

if((aux1.x*aux2.y - aux1.y*aux2.x) > 0)

return true;

return false;

}

}

public class Cubo extends Applet implements

Runnable, MouseMotionListener{

Thread luxury;

static Point[] vertex = new Point[8]; 

static int maxSize =300; 

static int origin = maxSize/2;

static int xMouseP=0, yMouseP =0;

int xAux , yAux ; 

int module = 50; 

Image canvasAux;

Graphics backBuffer;

public void init(){

setSize(maxSize,maxSize);

setBackground( new Color(0.2f,0.6f,0.1f,1.0f) );

addMouseMotionListener(this);

int[] coordX = new int[]{-module,module,module,-module,-module,module,module,-module};

int[] coordY = new int[]{-module,-module,module,module,-module,-module,module,module};

int[] coordZ = new int[]{module,module,module,module,-module,-module,-module,-module};

canvasAux = createImage(500,500);

backBuffer = canvasAux.getGraphics();

for(int i =0; i<vertex.length; i++){

vertex[i] = new Point(coordX[i],coordY[i],coordZ[i]);

}

}

public void start(){

try { luxury = new Thread(this); luxury.start(); }

catch (Exception e){}

}

public void run() {}

public void stop(){}

public void paint(Graphics g){

int[] pts1 = new int[]{0,1,5,0,0,3};

int[] pts2 = new int[]{1,5,4,3,4,2};

int[] pts3 = new int[]{2,6,7,7,5,6};

int[] pts4 = new int[]{3,2,6,4,1,7};

Color[] colorRGB = new Color[]{ Color.black, Color.blue,Color.orange,Color.pink,Color.red, Color.yellow};

Face[] faces = new Face[6];

backBuffer.clearRect(0,0,500,500);

for(int i=0; i<6; i++){

backBuffer.setColor(colorRGB[i]);

faces[i] = new 

Face(vertex[pts1[i]],vertex[pts2[i]],vertex[pts3[i]],vertex[pts4[i]]);

if(faces[i].isVisible()){

faces[i].drawFace(backBuffer);

}

}

g.drawImage(canvasAux,0,0,this);

g.drawString(" Coordenadas: ", 30,30);

g.drawString(" X= " + xMouseP, 30,50);

g.drawString(" Y= " + yMouseP, 30,65);

return;

}

public void update(Graphics g){ paint(g); }

public void destroy(){

try {Thread.sleep(1500);}

catch (InterruptedException e) {

System.out.println("Exception in sleep");

}

}

void rota(double angleTeta, double anglePhi, double anglePsi) {

double teta= Math.toRadians(angleTeta);

double phi= Math.toRadians(anglePhi);

double psi= Math.toRadians(anglePsi);

Point pAux = new Point();

Point pAux1 = new Point();

Point pAux2 = new Point();

for(int i =0; i<8; i++){

pAux1.x = vertex[i].x;

pAux1.y= vertex[i].y * Math.cos(teta) + vertex[i].z * (-Math.sin(teta));

pAux1.z = vertex[i].y * Math.sin(teta) + vertex[i].z * Math.cos(teta);

pAux2.x = pAux1.x * Math.cos(phi) + pAux1.z * Math.sin(phi);

pAux2.y = pAux1.y;

pAux2.z = pAux1.x * (-Math.sin(phi)) + pAux1.z * Math.cos(phi);

pAux.x= pAux2.x * Math.cos(psi) + pAux2.y * (-Math.sin(psi));

pAux.y = pAux2.x * Math.sin(psi) + pAux2.y * Math.cos(psi);

pAux.z= pAux2.z;

vertex[i].x = pAux.x;

vertex[i].y = pAux.y;

vertex[i].z = pAux.z;

}

}

public void mouseDragged( MouseEvent e ){

xAux = xMouseP;

yAux = yMouseP;

xMouseP = e.getX();

yMouseP = e.getY();

if(yMouseP > yAux){ rota(2,0,0); }

if(yMouseP < yAux){ rota(-2,0,0); }

if(xMouseP > xAux){ rota(0,2,0); }

if(xMouseP < xAux){ rota(0,-2,0); }

repaint();

e.consume();

}

public void mouseMoved( MouseEvent e ) { }

........................................................................................................

java 3D

El siguiente código genera un cubo en 3D, utilizando las librerías Java3D....



Aunque instalar y configurar en mi S.O. las librerías no fue nada facil, a fina de 4 horas continuas de intentos fallidos lo pude lograr.

Ahora el código del anterior cubo:

nombre: HelloJava3D.java
.......................................................................................................................................
/**
 *
 * @author alex4024
 */
import java.applet.Applet; 
import java.awt.BorderLayout; 
import java.awt.Frame; 
import java.awt.event.*; 
import com.sun.j3d.utils.applet.MainFrame; 
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube; 
import java.awt.GraphicsConfiguration;
import javax.media.j3d.*;
import javax.vecmath.*;

public class HelloJava3D extends Applet { 
public HelloJava3D(){
setLayout(new BorderLayout()); 
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); 
Canvas3D canvas3D =new Canvas3D(config); 
add("Center",canvas3D); 

BranchGroup scene=createSceneGraph(); 
scene.compile(); 

SimpleUniverse simpleU =new SimpleUniverse(canvas3D); 

simpleU.getViewingPlatform().setNominalViewingTransform(); 

simpleU.addBranchGraph(scene); 
}

public BranchGroup createSceneGraph(){  
BranchGroup objRoot =new BranchGroup(); 
Transform3D rotate =new Transform3D(); 
 
rotate.rotX(Math.PI/4.0d); 
 
TransformGroup objRotate =new TransformGroup(rotate); 
objRotate.addChild(new ColorCube(0.4)); 
objRoot.addChild(objRotate);
 
return objRoot; 
}
public static void main(String [] args){ 
Frame frame =new MainFrame(new HelloJava3D(),256,256); 
}
}

.......................................................................................................................................

Lo que no he podido hacer es rotar el cubo, no se si es por las librerías, o por el código.....