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 3519 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 267 articles
|BIO_PSEUDO|
Commentaires récents

Publié par dinet dans CMS

merci, chokran, thank you

Publié par claude77 dans tuto

Super application, fonctionne bien
exemple sur une image

Publié par jmc dans CMS

Autre lien de chargement : http://www.fobec.com/protec/logiciels2/encadre.php3?id_log=217&cat=VBureautique

Publié par fobec dans logiciel

MAJ: mise en cache du FAI et optimisation du script de Geolocalisation.

Publié par Fokoneh dans java

Je teste d'abord, Je reviens