Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1828 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  [OpenGL] Combiner plusieurs rotations

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[OpenGL] Combiner plusieurs rotations

n°1318506
WarDrone
Eeny, meeny, miny, moe.
Posté le 04-03-2006 à 18:25:11  profilanswer
 

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
mood
Publicité
Posté le 04-03-2006 à 18:25:11  profilanswer
 

n°1318524
WarDrone
Eeny, meeny, miny, moe.
Posté le 04-03-2006 à 19:21:10  profilanswer
 

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
n°1318668
breizhbugs
Posté le 04-03-2006 à 22:32:20  profilanswer
 

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?

n°1318847
WarDrone
Eeny, meeny, miny, moe.
Posté le 05-03-2006 à 10:52:43  profilanswer
 

Oui.

n°1365692
stochastik
Posté le 13-05-2006 à 19:21:47  profilanswer
 

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
n°1366154
WarDrone
Eeny, meeny, miny, moe.
Posté le 15-05-2006 à 08:18:02  profilanswer
 

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.

n°1366170
_darkalt3_
Proctopathe
Posté le 15-05-2006 à 09:12:26  profilanswer
 

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 ?

n°1366268
bjone
Insert booze to continue
Posté le 15-05-2006 à 11:00:22  profilanswer
 

généralement jamais :D

n°1366284
_darkalt3_
Proctopathe
Posté le 15-05-2006 à 11:11:46  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  [OpenGL] Combiner plusieurs rotations

 

Sujets relatifs
OpenGLRequête à plusieurs ordres
Plusieurs action dans balise FormopenGL : Un cercle d'angle > 3*PI ??????
Comment avoir plusieurs langues sur mon site?"empiler" plusieurs fichiers en 1
[Oracle XML] Requete simple, 1 ligne de résultat = plusieurs résultatsMéthode : retourner plusieurs éléments
[JSP] [résolu] cookie, plusieurs valeurs ?Driver OpenGl
Plus de sujets relatifs à : [OpenGL] Combiner plusieurs rotations


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)