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

Publié par Absolut dans news

Bonjour,
Dans l'outil de localisation d'IP, je ne comprends pas le sens de la rubrique precision dans le Rapport d'analyse de l'adresse IP ex 1/10, 9/10, bonne, ....
Merci

Publié par Toluar dans tuto

Je viens de lire votre article que seulement aujourd'hui.
Une autre solution consiste a regarder le user-agent utilise par le navigateur du visiteur. Les crawlers sont clairement identifies ;-)...

Publié par Djoe dans java

Rien à redire, fonctionne parfaitement. Merci beaucoup

Publié par ammar dans CMS

merci pour ce code , mais ce que je veux savoir c\'est es-ce que possible de récupérer la totalité de code source html de la page original.<br>merci...

Publié par ric dans CMS

c\'est la première fois que j\'utilise ce logiciel