J'ai comprit comment faire les rotations, mais le problème c'est que toutes les autres figures tourne aussi autour des axes...
Pour cela j'ai lu qu'il fallait faire une translation. Mais si je fais une translation, toutes mes figures sont translatés et se mettes encore à tourner autour de l'axe...
Quand tu utilises "glRotated(..,..,..)" TOUT ce qui suit cette ligne sera tourné.
si tu veux annuler la rotation, il y a 3 possibilités simples:
1) Annuler la rotation en appelant la meme fonction avec l'angle négatif.
2) Utiliser glLoadIdentity(); qui te ramènes en (0,0,0)
3) Mettre un glPushMatrix(); avant ta rotation, faire ta roattion, dessiner ce qui est tourné puis appeler glPopMatrix();
Je pense bien que tu es dessus depuis 10min. Mais c'est le temps entre mon explication, et ta réponse pour me dire que ça marche pas.
Il faudrait que tu expliques ce que tu veux faire tourner et je pense que simplifier ton code ne serait pas un luxe. Tu fais au moins 10 dessins de faces carrées, ne serait-il pas mieux de mettre tout ça dans une fonction et l'appeler à chaque fois. Ca rendrait le code plus lisible et digeste.
Le plus simple pour tourner qu'une face est la chose suivante:
//Dessin des choses pas tournees qui viennent avant
glRotatef(angle, 0,0,1); //Dessin de la face
glRotatef(-angle, 0,0,1); //Suite du dessin avec des choses pas tournees
C'est pas optimal (et de loin...) mais c'est simple à comprendre.
Bon, j'ai créé une fonction point(); avec tout les sommet des cubes, et une fonction face qui cree toutes les faces du cubes.
J'arrive à la fin, je fait une rotation des face que je veux sur l'axe x (par exemple).
Tout marche correctement.
Mais mon problème c'est que je n'arrive pas à enchainer deux rotations...
La première s'effectue, puis se stop. La deuxième commence mais par dessu la première.
J'ai penser, faire un appelle (c'est a dire mettre à jours les couleurs des carrés après rotation) des couleurs.
Mais ca fait trois foix que je recommence l'algo au complet et je voudrais savoir si c'est une bonne solution ?
Tout ça c'est expliqué dans le cours de Kayl et dans n'importe quel bouquin/tuto traitant de l'Ogl..
Quand tu fais une rotation (ou n'importe quelle transformation), l'ordre est très important.
Tu as plusieurs solution (tout t'as été expliqué plus haut..)
glPushMatrix() Qui va te mettre une matrice sur la pile.
Tu fait ta rotation
glPopMatrix() pour dégager la premiere matrice de la pile et pouvoir recommencer tranquile
glPushMatrix()
Deuxieme rotation
glPopMatrix()
Plus simple:
Pour effectuer une rotation, ogl multilplie la matrice de transformation active (en haut de la pile en fait) par la matrice colonne de la position d'un point (glVertex3f(x, y, z) par ex) (en fait c'est plutôt l'inverse en ce qui conserve la multiplication, vu que la multiplication de matrice n'est pas commutative).
Or, apres chaque transformation, la matrice de transformation active est modifiée (logique, pour coller à la nouvelle position/orientation des axes, d'où d'ailleurs l'importance de l'ordre des transformations...).
Donc, entre chaque transformation, une solution simple si tu n'arrives pas à enchainer deux rotations serait de charger la matrice identité de transformation:
1,0,0
0,1,0
0,0,1
Ce qui se fait tout naturellement par un appel à glLoadIdetity().
Sinon, honnêtement, même passer par une fonction pour dessiner un rubik cube comme tu le fais, ce serait bôf..
Renseigne toi sur les listes d'affichage déjà, ensuite si vraiment tu ne les comprends pas, tu peux dessiner tout ton cube en quelques tours de boucles..
Dans un premier temps, j'ai créé mon cube et lui est affecté deux rotations...
Je me suis appercu que le cube tournait sur deux axes...(Ca parait évident pourtant ).
Ensuite j'ai suivit la solution que l'on ma donner plus haut:
glPushMatrix()
Rotation
Dessin des faces du cube qui doivent être en rotation.
glPopMatrix()
La ma face tournait correctement.
Mais ensuite, j'ai voulus faire une deuxième rotation.
Là, j'ai vus que mes deux faces tournaient en même temps, donc j'ai fait une boucle pour attendre que la première rotation soit fini.
Là c'est parfait j'ai mais deux rotations, mais il y a un problème...
Lorsque la première rotation est fini, elle revient à zero et l'autre commence. Une fois que la deuxième fini, elle revient aussi à zero...
Je ne veux pas faire le gros débutant qui ne comprend rien...
Je connet d'autre l'angage, et je sais ce que ca fait de répondre à des sujets comme celui là.
Et la je sèche complètement (pourtant je lit et relit le cours de Kayl).
Tu dis que passer par une fonction pour dessiner le rubik's cube est bof.
Si tu as une autre solution je suis preneur...
Car je n'arrive pas à établire ce qu'il faut faire pour pouvoir enchainer une suite de rotation qui n'auront pas toujours le même ordre.
(Je vais y passer un moi je sens bien sur ce truc qui semble évident ).
Les rotations et transformations matricielles se cumulent.
Si tu lances un glRotate, puis un autre, alors la résultat est la multiplication matricielle des 2 matrices de rotations.
Si tu veux "remettre a zero", tu une instruction pour mettre la matrice a l'identité.
Chose qu'il ne faut pas faire si tu veux avoir 2 rotations.
Pour ce qui est de faire mieux au niveau du dessin. Il y a les listes d'initialisation. Ce sera plus optimisé, mais je te conseille de faire un truc à la fois. Quand tu maîtriseras les rotations, passe au point suivant.
Pour résumé, quand je fait une rotation sur l'axe des abscisses (x), ce sont les deux autres axes qui tourne autour. (Transformation = Changement de repère) J'ai retenu :).
Sinon, j'ai fait quelques que recherche à listes d'initialisations. Et je n'est pas trouver de Rubik's Cube...
Si vous en avez un je suis preneur !
Je vous met l'exe pour que vous vouyez ce que j'ai fait:
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html