Bonjour à tous !
J'ai un gros problème. J'essaie de faire une caméra à la quake en jogl.
En gros jogl étant un wrapper OpenGL, le comportement est le même que OpenGL, il y a une méthode display() qui affiche l'univers 3D.
Par contre tout le travail de glut (gestion des fenêtres, clavier, souris) est abandonné au profit de JAVA (Awt et Listener)
La méthode display() est appelée en boucle au moyen d'un Animator (une classe de jogl dont le but est de faire tourner display() dans un thread à part)
Pour ma caméra (classe Camera), je fais au début de display() un camera.setPerspective(gl) qui applique des rotations et des translations à l'objet gl (qui représente le monde 3D pour être rapide).
Donc à chaque itération la perspective avec laquelle on voit le monde est susceptible de changer.
Maintenant le problème à proprement parler : ma classe Camera.
Elle implémente évidemment KeyListener et MouseMotionListener, et dans mon monde 3D il y a :
gldrawable.addKeyListener(camera);
gldrawable.addMouseMotionListener(camera);
Ce qui permet d'écouter tout ce qui se passe dans la fenêtre OpenGL (gldrawable est de type GLDrawable, un objet qui encapsule GL et GLU qu'on utilise classiquement en OpenGL)
Dans mouseMoved(MouseEvent e) de la classe Camera, l'idée est la suivante :
on cherche le centre de la fenêtre
on regarde la position du curseur de souris
on calcule la différence
on fait des rotations en conséquence
on replace le curseur de souris au centre de la fenêtre (dans Quake la souris reste toujours au centre)
Pour replacer le curseur de souris au centre, je n'ai rien trouvé d'autre que la classe Robot, utilisé pour les démonstrations, et qui permet de déplacer la souris, de cliquer avec, de taper au clavier....
La dernière ligne de mon implémentation de la méthode mouseMoved est donc :
robot.mouseMove(centerX, centerY);
SANS "robot.mouseMove(centerX, centerY)" on capte tous les évenements (un println affiche un message à chaque déplacement d'un pixel ou presque)
AVEC "robot.mouseMove(centerX, centerY)" on reçoit un évenement toutes les demi-secondes et encore je suis gentil
D'après la doc java, robot est fait pour ne pas générer d'event, et heureusement sinon il y aurait un appel récursif sans fin à mon implémentation de mouseMoved !
Mais apparement cela gêne le reste du programme...
Il semble y avoir un comportement plus rapide si je lance le programme avec un "nice -20 java Test" (qui augmente la priorité du processus sous Linux), comme si l'Animator et le Robot se bouffaient l'un l'autre
Des idées pour placer le curseur de souris où l'on veut SANS utiliser robot ?
---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.