Bonjour,
J'ai une scène dans laquelle j'ai 2 objets, disons pour simplifier un cube et une boule.
Il est possible de faire des translations et rotations (par rapport au centre de la boule) qui s'appliquent à toute la scène, à l'aide de la souris (les deux objets subissent les translations et rotations de toute la scène). Le cube peut, en plus, avoir sa propre translation indépendamment de la scène.
Pour la scène et le cube, je stocke des translations et rotation "cumulées" que je mets à jour à chaque mouvement de souris.
Si le cube ne translatait pas indépendamment de la scène, cela reviendrait au problème du mini système solaire dans le redbook, et jusque là tout va bien. Mon problème est que la translation du cube seul déplace aussi l'origine du repère et à la boucle d'affichage suivante, la rotation se fait à la nouvelle origine (celle résultant de la première translation). Donc le centre de rotation du cube est décalé en fonction de sa propre translation.
Est-ce qu'il y a un moyen de garder le centre de rotation au centre de la boule, indépendamment des transformations du cube?
Je mets mon "code" à la fin du message.
Merci beaucoup d'avance.
lia
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 glPushMatrix(); { glMatrixMode(GL.GL_PROJECTION); glLoadIdentity(); setProjection(); glMatrixMode(GL.GL_MODELVIEW); glLoadIdentity(); setCameraPosition(); glTranslatef(sceneTranslation); //sceneTranslation est la translation cumulée de toute la scène. Elle se répercute sur la boule est sur le cube. glPushMatrix(); { glTranslatef(centre[0], centre[1], centre[2]); // translation jusqu'au centre de la molécule pour qu'elle soit le centre de rotation glMultMatrixf(sceneRotationMatrix, 0); // rotation cumulée de la scène glTranslatef(-centre[0], -centre[1], -centre[2]); drawBall(); } glPopMatrix(); glTranslatef(centre[0], centre[1], centre[2]); // le centre du repère se place au centre de la molécule glPushMatrix(); { glTranslatef(cubeTranslation); // translation cumulée du cube. C'est cette ligne qui décale tout. glMultMatrixf(sceneRotationMatrix, 0); // la même que celle de la scène mais est amenée à être différente elle aussi drawCube(); } glPopMatrix(); } gl.glPopMatrix(); ... }
Partager