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

Publié par Fobec dans tuto

Merci pour la remarque Toluar,
Les user-agent sont effectivement un bon indicateur pour les utilisateurs. Les crawlers et robots en tout genre ne prennent pas toujours la peine de renseigner cette...

Publié par web agency cms Typo3 dans tuto

De nombreux articles sur le web parlent des CMS (Content Management System) et tentent de lister les meilleurs d'entres-eux.
Mais très souvent, sauf quelques rares libres blancs, ces article...

Publié par troops28 dans CMS

C un truc qui va plaire ca ;) enfin j'espere
En ajoutant :
if ColWidths[i] < Canvas.TextWidth(strTemp) then ColWidths[i] := Canvas.TextWidth(strTemp)+10;

Dans la procedure LoadStr...

Publié par bakouz dans java

Bonjour Axel,
je suis tombe sur ton site un peu par hasard.
Hasard car je ne le connaissais pas jusqu'a maintenant, et non du hasard car c'est exactement ce genre de class que je recherchais. !...

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...