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

Publié par Tchatche dans news

Salut a tous,
@ Outsourcing je suis tout a fait d'accord avec toi que le Pagerank d'un site (ou page) n'est pas un gage de bonnes positions sur Google,on peut tous citer des sites ay...

Publié par Axel dans java

Bonjour Kezouille,
je viens de tester sur notre LAN (serveur Windows 7), la surveillance a l'air de marcher.
De votre cote, s'agit-il d'un serveur sous Windows ou sous Linux ?
Pouvez-vou...

Publié par hungerGames dans php5

Salut!
je suis un debutant en php,et lorsque j'ai execute le code
sur la creation de la base 'member',on m'a affiche cet message:
"Undefined class constant 'ATT_ERRMOD...

Publié par Verkork dans java

Le probleme c'est que ce code ne convient pas quand une partie de la page est dynamique, ie qu'elle est rafraichit toutes les minutes par exemple. Par exemple pour une telle page, c'est...

Publié par jmc dans CMS

Lien sur mon site, rubriques Téléchargez http://users.skynet.be/jean-marie.capellen/