Voila des sources que j'ai faites d'un test en java de rotation 3D il y a quelques temps.
Il est tout simple, peut etre que tu comprendras avec ca
sinon ca donne ca:
http://www.ak-dev.com/tmp/3D.html
Bon c'est pas bo, parce qu'a l'epoque je ne connaissais pas bien le java je debutais... je connaissais pas les api donc je n'avais pas pu faire de bufferisation d'image, donc ca clignote, et je ne savais pas temporie la rotation donc pour le ralentir... lisez le source et vous comprendrez
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class JCube extends JApplet {
private Graphics2D g2D;
private double xcenter;
private double ycenter;
private double povx;
private double povy;
private double povz;
private Point3D[] pointarray = {
new Point3D(-100.0, 100.0, 100.0),
new Point3D(100.0, 100.0, 100.0),
new Point3D(100.0, 100.0, -100.0),
new Point3D(-100.0, 100.0, -100.0),
new Point3D(-100.0, -100.0, 100.0),
new Point3D(100.0, -100.0, 100.0),
new Point3D(100.0, -100.0, -100.0),
new Point3D(-100.0, -100.0, -100.0),
new Point3D(-450.0, 0.0, 0.0),
new Point3D(450.0, 0.0, 0.0),
new Point3D(0.0, -450.0, 0.0),
new Point3D(0.0, 450.0, 0.0),
new Point3D(0.0, 0.0, -450.0),
new Point3D(0.0, 0.0, 450.0)
};
private int[][] trianglearray = {
/* {0, 1, 2},
{2, 3, 0},
{4, 5, 6},
{6, 7, 4},
{0, 1, 5},
{0, 4, 5},
{1, 2, 6},
{1, 5, 6},
{2, 3, 6},
{3, 6, 7},
{0, 4, 7},
{0, 3, 7},
*/ {0, 3, 8},
{0, 4, 8},
{4, 7, 8},
{3, 7, 8},
{1, 2, 9},
{1, 5, 9},
{2, 6, 9},
{5, 6, 9},
{4, 5, 10},
{4, 7, 10},
{5, 6, 10},
{6, 7, 10},
{0, 1, 11},
{1, 2, 11},
{2, 3, 11},
{3, 4, 11},
{2, 3, 12},
{2, 6, 12},
{3, 7, 12},
{6, 7, 12},
{0, 1, 13},
{1, 5, 13},
{4, 5, 13},
{0, 4, 13}
};
public void init() {
povx = 0;
povy = 0;
povz = -500;
xcenter = 500 / 2;
ycenter = 500 / 2;
this.setBounds(0, 0, 500, 500);
}
public void paint(Graphics g) {
g2D = (Graphics2D)g;
g2D.setPaint(Color.red);
move();
}
public void renderPoint(Point3D p3d) {
double x1 = (double)p3d.getX();
double y1 = (double)p3d.getY();
double z1 = -500.0 / (-1000.0 - (double)p3d.getZ());
Rectangle2D.Double l1 = new Rectangle2D.Double(x1 * z1 + xcenter, y1 * z1 + ycenter, 1.0, 1.0);
g2D.draw(l1);
}
public void renderLine(Point3D p3d1, Point3D p3d2) {
double x1 = (double)p3d1.getX();
double y1 = (double)p3d1.getY();
double z1 = -500.0 / (-1000.0 - (double)p3d1.getZ());
double x2 = (double)p3d2.getX();
double y2 = (double)p3d2.getY();
double z2 = -500.0 / (-1000.0 - (double)p3d2.getZ());
Line2D.Double l1 = new Line2D.Double(x1 * z1 + xcenter, y1 * z1 + ycenter, x2 * z2 + xcenter, y2 * z2 + ycenter);
g2D.draw(l1);
}
public void renderTriangle(Point3D p3d1, Point3D p3d2, Point3D p3d3) {
double x1 = (double)p3d1.getX();
double y1 = (double)p3d1.getY();
double z1 = -500.0 / (-1000.0 - (double)p3d1.getZ());
double x2 = (double)p3d2.getX();
double y2 = (double)p3d2.getY();
double z2 = -500.0 / (-1000.0 - (double)p3d2.getZ());
double x3 = (double)p3d3.getX();
double y3 = (double)p3d3.getY();
double z3 = -500.0 / (-1000.0 - (double)p3d3.getZ());
int[] tabx = {(int)(x1 * z1 + xcenter), (int)(x2 * z2 + xcenter), (int)(x3 * z3 + xcenter)};
int[] taby = {(int)(y1 * z1 + ycenter), (int)(y2 * z2 + ycenter), (int)(y3 * z3 + ycenter)};
g2D.fillPolygon(new Polygon(tabx, taby, 3));
}
public void renderObject() {
for (int i = 0 ; i < trianglearray.length ; i++) {
renderTriangle(pointarray[trianglearray[i][0]], pointarray[trianglearray[i][1]], pointarray[trianglearray[i][2]]);
}
}
public void move() {
while (true) {
for (int j = 0 ; j < 360 ; j++) {
for (int i = 0 ; i < pointarray.length ; i++) {
pointarray[i] = RotatePointAroundAxes(pointarray[i], Math.PI / 101, Math.PI / 171, Math.PI / 343);
}
g2D.clearRect(0, 0, 500, 500);
// je repete 20 fois pour ralentir , j'ai pas encore trouvé comment faire un wait en java
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
renderObject();
}
}
}
[edit]Edité par freka le 09-03-2002 à 12:04:23[/edit]