Salut à tous!:
Je débute un peu en OpenGL, et je réalise actuellement une application Java6 nécessitant un peu d’OpenGL simple pour un rendu graphique 3D.
J’utilise JOGL pour l’OpenGL, pour ceux qui ne connaissent pas, ça permet d’utiliser OpenGL quasiment exactement de la même façon qu’en C/C++.
Bref, le problème n’est pas là, car tout ceci marche, j’arrive à afficher ce que je veux sans problèmes.
Mon programme affiche des points (coordonnées 3D) dans l’espace.
Ce que je cherche à faire est de pouvoir faire tourner cet ensemble de points à la souris, un peu à la façon de GoogleEarth.
Voici l’extrait de mon code concerné, qui est très simple:
[code]/**
-
Initializing OpenGL
-
@param drawable
*/
public void init(GLAutoDrawable drawable)
{
GL gl = drawable.getGL();gl.glClearColor(0, 0, 0, 0); gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrtho(-1, 1, -1, 1, -1, 1);
}
/**
-
Refresh OpenGL display
-
@param drawable
*/
public void display(GLAutoDrawable drawable)
{
GL gl = drawable.getGL();gl.glClear(GL.GL_COLOR_BUFFER_BIT);
// moving camera, if necessary
gl.glRotated((double)(rotationAngleX/5),0,1,0);
gl.glRotated((double)(rotationAngleY/5),1,0,0);// drawing points
gl.glBegin(GL.GL_POINTS);
gl.glColor3d(255, 0, 0);
/* Une boucle qui trace un ensemble de points en utilisant gl.glVertex3d() */
gl.glEnd();rotationAngleX = 0;
rotationAngleY = 0;gl.glFlush();
}[/code]
Comme vous pouvez le voir, il y a deux variables, rotationAngleX, et rotationAngleY, qui sont modifiées lorsque l’on fait un drag avec la souris sur le canvas OpenGL:
[code]/**
- Mouse button down
-
@param e
*/
public void mousePressed(MouseEvent e)
{
mousePrevX = e.getX();
mousePrevY = e.getY();
}
/**
-
Mouse dragged, updating display
-
@param e
*/
public void mouseDragged(MouseEvent e)
{
// computing display rotation with mouse movings
int x = e.getX();
int y = e.getY();
rotationAngleX = x - mousePrevX;
rotationAngleY = y - mousePrevY;
mousePrevX = x;
mousePrevY = y;
if (rotationAngleY > 90)
rotationAngleY = 90;
else if(rotationAngleY < -90)
rotationAngleY = -90;updateCanvas(); // refresh display
}[/code]
Le problème: quand j’effectue ma première rotation gl.glRotated((double)(rotationAngleX/5),0,1,0), le repère lui aussi va bouger.
Ce qui fait que lorsque j’effectue la seconde rotation, elle ne se fera pas de la façon dont l’utilisateur a déplacé la souris sur son écran.
J’aimerai que, à n’importe quel moment, si l’utilisateur bouge sa souris de gauche à droite, l’ensemble des points tourne dans ce sens, pareil de haut en bas. En gros la même chose que GoogleEarth.
Ce qui n’est pas le cas, puisque après la première rotation, le repère est changé.
Il faudrait donc que je puise conserver le repère dans son état initial, mais je n’arrive pas à le faire correctement. J’ai essayé d’utiliser glPushMatrix() et glPopMatrix(), mais rien n’y fait.
J’ai donc besoin d’un petit coup de pouce
Quelqu’un saurait-il m’aider?