Publié le 11/05/2011
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Animer un cube 3D dans un applet

Avec son look AutoCAD des années 80, la class Box3D est une illustration intéressante des possibilités de JAVA: bouger une forme géométrique avec la souris. Coté design on n'est loin des jeux 3D actuels, par contre il est intéressant de comprendre comment animer un cube au survol de la souris.

Exemple basique de CAO avec JAVA

1093_applet3DLa class Point3D comprend les points suivants:
- construction d'un applet, à savoir une application incluse dans une page web,
- modélisation d'un cube en 3D,
- animation d'une forme géométrique.

Pour faire pivoter et pouvoir admirer les perspectives du cube, il suffit cliquer sur le cube et déplacer la souris. Lorsque l'on regarde de plus près le contenu de la class, le mécanisme interne est construit autour des étapes suivantes:
- mouseDragged(): lorsque l'utilisateur déplace le curseur sur le cube, la class stocke le déplacement à appliquer,
- drawWireFrame(): chaque ligne du cube est redessinée aux nouvelles coordonnées.


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
 
/*
 * Afficher et animer un cube 3D dans un applet
 *
 * Author: ???
 * source trouvé sur l'url
 * http://www.itsmauritius.com/krish/blog/java-3d-cube-coding/
 */
class Point3D {
 
    public int x,  y,  z;
 
    public Point3D(int X, int Y, int Z) {
        x = X;
        y = Y;
        z = Z;
    }
}
 
class Edge {
 
    public int a,  b;
 
    public Edge(int A, int B) {
        a = A;
        b = B;
    }
}
 
public class Box3D extends Applet implements MouseListener, MouseMotionListener {
 
    private static final long serialVersionUID = 1L;
    int width, height;
    int mx, my;
    Image backbuffer;
    Graphics backg;
    int azimuth = 35, elevation = 30;
    Point3D[] vertices;
    Edge[] edges;
 
    public void init() {
        setSize(640, 480);
        width = getSize().width;
        height = getSize().height;
        vertices = new Point3D[8];
        vertices[0] = new Point3D(-1, -1, -1);
        vertices[1] = new Point3D(-1, -1, 1);
        vertices[2] = new Point3D(-1, 1, -1);
        vertices[3] = new Point3D(-1, 1, 1);
        vertices[4] = new Point3D(1, -1, -1);
        vertices[5] = new Point3D(1, -1, 1);
        vertices[6] = new Point3D(1, 1, -1);
        vertices[7] = new Point3D(1, 1, 1);
        edges = new Edge[12];
        edges[0] = new Edge(0, 1);
        edges[1] = new Edge(0, 2);
        edges[2] = new Edge(0, 4);
        edges[3] = new Edge(1, 3);
        edges[4] = new Edge(1, 5);
        edges[5] = new Edge(2, 3);
        edges[6] = new Edge(2, 6);
        edges[7] = new Edge(3, 7);
        edges[8] = new Edge(4, 5);
        edges[9] = new Edge(4, 6);
        edges[10] = new Edge(5, 7);
        edges[11] = new Edge(6, 7);
        backbuffer = createImage(width, height);
        backg = backbuffer.getGraphics();
        drawWireFrame(backg);
        addMouseListener(this);
        addMouseMotionListener(this);
    }
 
    void drawWireFrame(Graphics g) {
        double theta = Math.PI * azimuth / 180.0;
        double phi = Math.PI * elevation / 180.0;
        float cosT = (float) Math.cos(theta), sinT = (float) Math.sin(theta);
        float cosP = (float) Math.cos(phi), sinP = (float) Math.sin(phi);
        float cosTcosP = cosT * cosP, cosTsinP = cosT * sinP, sinTcosP = sinT * cosP,
        sinTsinP = sinT * sinP;
// projecting vertices onto two-dimensional view-port
        Point[] points;
        points = new Point[vertices.length];
        int scaleFactor = width / 4;
        float near = 3;
        int i;
        float nearToObj = 1.5f;
 
        for (i = 0; i < vertices.length; i  ) {
            int x0 = vertices[i].x;
            int y0 = vertices[i].y;
            int z0 = vertices[i].z;
            float x1 = cosT * x0   sinT * z0;
            float y1 = -sinTsinP * x0   cosP * y0   cosTsinP * z0;
            float z1 = cosTcosP * z0 - sinTcosP * x0 - sinP * y0;
            x1 = x1 * near / (z1   near   nearToObj);
            y1 = y1 * near / (z1   near   nearToObj);
            points[i] = new Point((int) (width / 2   scaleFactor * x1   0.5),
                    (int) (height / 2 - scaleFactor * y1   0.5));
        }
// draw
        g.setColor(Color.black);
        g.fillRect(0, 0, width, height);
        g.setColor(Color.green);
        for (i = 0; i < edges.length;   i) {
            g.drawLine(points[edges[i].a].x, points[edges[i].a].y,
                    points[edges[i].b].x, points[edges[i].b].y);
        }
    }
 
    @Override
    public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
    }
 
    @Override
    public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
    }
 
    @Override
    public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
    }
 
    @Override
    public void mousePressed(MouseEvent e) {
        mx = e.getX();
        my = e.getY();
        e.consume();
    }
 
    @Override
    public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
    }
 
    @Override
    public void mouseDragged(MouseEvent arg0) {
        int new_mx = arg0.getX(), new_my = arg0.getY();
        azimuth -= new_mx - mx;
        elevation  = new_my - my;
        drawWireFrame(backg);
        mx = new_mx;
        my = new_my;
        repaint();
        arg0.consume();
    }
 
    public void update(Graphics g) {
        g.drawImage(backbuffer, 0, 0, this);
        System.out.println("azimuth: "   azimuth   ", elevation: "   elevation);
    }
 
    public void paint(Graphics g) {
        update(g);
    }
 
    @Override
    public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
    }
}

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
java - class
Mise a jour
11/05/2011
Visualisation
vu 3552 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 267 articles
|BIO_PSEUDO|
Commentaires récents

Publié par khaoula dans java

s' il vous plait j'ai un projet de fin d'etude et je veux integrer une carte google maps dans une interface avec java et toujours j'aurais des problemes et merci de votre reponse

Publié par Deepan dans php5

Bonjour,
Merci pour ce tuto qui m'a bien aide.
Je donne ici les modifications apportees pour que cela fonctionne chez moi.

/****************************************
* Ouvrir u...

Publié par hozin2003 dans CMS

merci, c'est mon problème et voila j'ai trouvé la solution merci et voila un bon pas pour un débutant

Publié par inf0mag dans news

Et avec les objets connectes, a va encore exploser !

Publié par Kezouille dans java

Bonjour Axel,

Merci pour ce petit guide qui m'a bien aide dans ma tache. En effet j'ai developpe une petite application afin de detecter l'ajout d'un fichier une image dans un repertoire et de...