Bonjour,

Pour un projet de mathématique, j'ai choisis de programmer un fractale en 3D.
Le tétraèdre de Sierpinski pour être exacte.

Mon fractale est terminé et je passe donc à son affichage. Je n'ai jamais utilisé de librairie pour faire de la 3D et je tâtonne un peu mal grès tout les tutoriaux qu'on peut trouver sur internet.

J'ai réussi à le modéliser et maintenant j'aimerais pouvoir faire tourner la camera autour de son centre pour le voir sous différents angles.

J'ai pu voir des méthodes glRotate ou glTranslation, d'autre parle de modifier la position de la caméra avec glLookAt. Je comprend bien comment marche glLookAt, mais je ne vois pas du tout comment faire pour modifier la camera après avoir appuyer sur une touche clavier par exemple. (Je voudrais pouvoir tourner la caméra autour de mon fractale avec les flèches directionnelles)

Mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
import javax.media.opengl.GLCapabilities;
 
import com.sun.opengl.util.GLUT;
 
 
 
public class TetraedreSierpinski3D extends GLCanvas implements GLEventListener, KeyListener{
 
	TetraedreSierpinski tetra;
	double base, hauteur;
	int rang;
 
	double cameraX, cameraY, cameraZ;
	public TetraedreSierpinski3D(double base, double hauteur, int rang){
		super(new GLCapabilities());
		cameraX =  base/2;
		cameraY =  base;
		cameraZ = hauteur/2;
		addGLEventListener(this);
		addKeyListener(this);
		setSize(800, 600);
		setPreferredSize(getSize());
		tetra = new TetraedreSierpinski(base, hauteur, rang);
		this.base = base;
		this.hauteur = hauteur;
		this.rang = rang;
	}
 
	public void display(GLAutoDrawable drawable){
		GL gl = drawable.getGL();
		gl.glMatrixMode(GL.GL_MODELVIEW);
 
		gl.glEnable(GL.GL_DEPTH_TEST);
		gl.glDepthMask(true);
		gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
		gl.glLoadIdentity();
 
		GLU glu = new GLU();
		glu.gluPerspective(80, 1, 1, 1000);
		glu.gluLookAt(cameraX, cameraY, cameraZ, base/2, Math.sin(60)*base/2, hauteur/2, 0, 0, 1);
 
		while(!tetra.estVide()){
			Polygone poly = tetra.depiler();
			gl.glBegin(GL.GL_TRIANGLE_FAN);
			for(int i = 0; i < poly.index.length; i++){
				gl.glColor3d(1.0, 0.0, 0.0);
				if (i == 1) gl.glColor3d(0.0, 0.5, 0.5);
				if (i == 2) gl.glColor3d(0.5, 0.5, 0.0);
				if (i == 3) gl.glColor3d(0.0, 1.0, 0.0);
				if (i == 4) gl.glColor3d(0.0, 0.0, 1.0);
				gl.glVertex3d(poly.sommets[poly.index[i]].X(), poly.sommets[poly.index[i]].Y(), poly.sommets[poly.index[i]].Z());
			}
			gl.glEnd();
			gl.glBegin(GL.GL_TRIANGLE_FAN);
			gl.glColor3d(0.5, 0.5, 0.5);
			for(int i = 0; i < poly.sommets.length-1; i++){
				gl.glVertex3d(poly.sommets[i].X(), poly.sommets[i].Y(), poly.sommets[i].Z());
			}
			gl.glEnd();
		}
		gl.glFlush();
		swapBuffers();
	}
 
	public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged){
 
	}
 
	public void init(GLAutoDrawable drawable){
		GL gl=drawable.getGL();
		gl.glEnable(GL.GL_COLOR);
	}
 
	public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height){
		GLU glu = new GLU();
		glu.gluPerspective(80, 1, 1, 1000);
		glu.gluLookAt(cameraX, cameraY, cameraZ, base/2, Math.sin(60)*base/2, hauteur/2, 0, 0, 1);
 
	}
 
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
 
	}
 
	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
 
	}
 
	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
 
	}
 
}
Le fractale qu'il affiche :



La durée du projet est relativement courte, (à rendre pour lundi en sachant qu'il faut que je fasse un rapport et un poster) je n'ai pas vraiment le temps pour comprendre les subtilités d'opengl.

Si quelqu'un aurait une méthode rapide pour pouvoir bouger ma caméra, je veux juste pouvoir la voir sous différents angles, la rigidité de la caméra m'importe peu.

Merci de m'avoir lu.