[OpenGL] Combiner plusieurs rotations

Combiner plusieurs rotations [OpenGL] - Divers - Programmation

Marsh Posté le 04-03-2006 à 18:25:11    

J'aimerais pouvoir bouger un objet à l'aide de rotation sur les 3 axes.
 
Ce code ne fonctionne pas comme je le veux :
 

Code :
  1. glRotatef(rotX, 1, 0, 0)
  2. glRotatef(rotY, 0, 1, 0)
  3. glRotatef(rotZ, 0, 0, 1)


 
(On imagine que les variables rotX, rotY, rotZ changent en fonction des coordonnées de la souris)
 
Le problème est que la deuxième rotation se fait par rapport au repère modifié par la première, et non par rapport au repère absolu (ce qui est normal en ogl). Il en ai de même pour la 3eme.
Existe t'il un moyen de combiner les 3 rotations en une seule pour qu'elle s'applique au repère de base? Il y a t'il une autre solution?
 
(Je ne parle pas de Gimbal Lock, d'ailleurs je compte utiliser des Quaternions, j'ai implémenté la classe, mais j'aimerais résoudre ce problème tout d'abord)

Message cité 1 fois
Message édité par WarDrone le 04-03-2006 à 19:05:13
Reply

Marsh Posté le 04-03-2006 à 18:25:11   

Reply

Marsh Posté le 04-03-2006 à 19:21:10    

J'ai fais une ébauche de solution, évidemment c'est un peu lourd :
(je pourrais calculer les matrices moi même)
 

Code :
  1. matrixX = []
  2. matrixY = []
  3. matrixZ = []
  4.        
  5. glPushMatrix()
  6. glLoadIdentity()
  7. glRotatef(self.__rotX, 1, 0, 0)
  8. matrixX = glGetFloatv(GL_MODELVIEW_MATRIX)
  9. glPopMatrix()
  10.        
  11. glPushMatrix()
  12. glLoadIdentity()
  13. glRotatef(self.__rotY, 0, 1, 0)
  14. matrixY = glGetFloatv(GL_MODELVIEW_MATRIX)
  15. glPopMatrix()
  16.        
  17. glPushMatrix()
  18. glLoadIdentity()
  19. glRotatef(self.__rotZ, 0, 0, 1)
  20. matrixZ = glGetFloatv(GL_MODELVIEW_MATRIX)
  21. glPopMatrix()
  22.        
  23. glMultMatrixf(matrixX)
  24. glMultMatrixf(matrixY)
  25. glMultMatrixf(matrixZ)


 
Edit : En fait ça ne fonctionne même pas :(


Message édité par WarDrone le 05-03-2006 à 11:20:48
Reply

Marsh Posté le 04-03-2006 à 22:32:20    

WarDrone a écrit :

J'aimerais pouvoir bouger un objet à l'aide de rotation sur les 3 axes.
 
Ce code ne fonctionne pas comme je le veux :
 

Code :
  1. glRotatef(rotX, 1, 0, 0)
  2. glRotatef(rotY, 0, 1, 0)
  3. glRotatef(rotZ, 0, 0, 1)




Ton objet se trouve-t-il à l'origine?

Reply

Marsh Posté le 05-03-2006 à 10:52:43    

Oui.

Reply

Marsh Posté le 13-05-2006 à 19:21:47    

Salut, as tu trouvé la solution à ton problème ?  
Parce que je pense que ce que tu cherchais à faire (rotationner l'objet dans un repère "global fixe" ), peut trouver sa solution simplement en inversant l'ordre des rotations.
 
Ainsi le code devient simplement cela :
 

Code :
  1. glRotatef(rotZ, 0, 0, 1)
  2. glRotatef(rotY, 0, 1, 0)
  3. glRotatef(rotX, 1, 0, 0)


 
Je crois bien avoir lu ça dans le red book. Je m'en vais de ce pas vérifier sur un exemple mais je pense que ça devrait effectivement te donner une rotation autour d'un repère global fixe.

Message cité 1 fois
Message édité par stochastik le 13-05-2006 à 19:23:00
Reply

Marsh Posté le 15-05-2006 à 08:18:02    

Oui j'ai trouvé une solution, j'utilise des quaternions.
 
Je conserve un quaternion total auquel j'ajoute un quaternion représentant la rotation courante.
 
Dans ton exemple, la 2eme rotation se fera a partir du nouvel axe Y et non pas le Y global.

Reply

Marsh Posté le 15-05-2006 à 09:12:26    

stochastik a écrit :

Salut, as tu trouvé la solution à ton problème ?  
Parce que je pense que ce que tu cherchais à faire (rotationner l'objet dans un repère "global fixe" ), peut trouver sa solution simplement en inversant l'ordre des rotations.
 
Ainsi le code devient simplement cela :
 

Code :
  1. glRotatef(rotZ, 0, 0, 1)
  2. glRotatef(rotY, 0, 1, 0)
  3. glRotatef(rotX, 1, 0, 0)


 
Je crois bien avoir lu ça dans le red book. Je m'en vais de ce pas vérifier sur un exemple mais je pense que ça devrait effectivement te donner une rotation autour d'un repère global fixe.


 
la rotation n'est pas commutative ?

Reply

Marsh Posté le 15-05-2006 à 11:00:22    

généralement jamais :D

Reply

Marsh Posté le 15-05-2006 à 11:11:46    

c'est pour ça que je doute du bien fondé de la solution quotée [:spamafote]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed