Problème opengl

saprobionte Messages postés 8 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 5 avril 2006 - 3 avril 2006 à 21:11
saprobionte Messages postés 8 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 5 avril 2006 - 5 avril 2006 à 15:51
bonjour,

j'ai un projet à rendre sous peu, et un gros problème me bloque sans que je parvienne à trouver une solution viable.

Je dois réaliser un graphe en trois dimensions, avec des sphères et des
tubes. Pour les sphères, je n'ai pas de problème, je me place au bon
endroit et j'utilise la primitive glu.

Par contre pour les cylindres, c'est autre chose... Avec la primitive
glu, il me faut la taille du tube et sa circonférence. Pour ca, j'y
arrive aussi. Mais le tube est automatiquement orienté sur l'axe des Z.
Pour pouvoir le mettre bien entre les deux points qu'il doit relier, je
ne vois pas les rotations qu'il faut appliquer. En gros j'ai (x,y,z)
pour les deux points et donc le vecteur correspondant. J'ai aussi les
coordonnées polaires ro, théta et phi du vecteur, mais pourtant avec
cela je ne comprend pas les glrotate à faire, si vous pouviez
m'aider...

8 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
3 avril 2006 à 23:26
Alala, c'est des maths ca. Si tu as réussi a avoir les coordonnées polaires, c'est deja fini alors.

Comme deja par orienter ton cylindre sur l'axe x.

Tu lui appliques la rotation phi (si c'est bien celui entre le vecteur
et l'axe z), c'est à dire la rotation d'axe y et d'angle phi.

Tu lui appliques ensuite la rotation d'axe theta (si c'est bien celui
qui est dans le plan xy), c'est à dire la rotation d'axe z et d'angle
theta. Et la ton cylindre est orienté correctement. Plus qu'à lui
appliquer une translation.



Faut juste inverser l'ordre pour opengl puisque c'est des produits de matrices.
0
saprobionte Messages postés 8 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 5 avril 2006
4 avril 2006 à 09:46
je viens de tester, en alignant:

rotation pour aligner sur l'axe des x

translation là ou je veux le début du tube

rotation d'axe theta

rotation d'axe phi



Le résultat montre que les transformations sont les bonnes ( les tubes
sont reliés entre eux) mais par contre ils sont décalés par
rapport aux sphères. Si je fais la translation en premier, les tubes
sont bien collés aux sphères, mais par contre ils sont mal orientés:
ils ne sont reliés qu'à la sphère de début, pas à l'autre bout.
0
saprobionte Messages postés 8 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 5 avril 2006
4 avril 2006 à 10:00
Pour mieux expliquer, voilà ce que j'ai mis:



glMatrixMode(GL_MODELVIEW);

glLoadIdentity();



glDisable(GL_CULL_FACE);

glPushMatrix();

glTranslatef(-0.5,0.0,-35.0);



glRotatef(90,0,1,0);

glTranslatef(coor_x1,coor_y1,coor_z1);

glRotatef(theta,0,0,1);

glRotatef(phi,0,1,0);



glColor3f(0.5,0.2,0.2);

gluCylinder(Quadric,0.1,0.1,h,60,60); // h correspond à la longueur du vecteur entre deux points

glPopMatrix();

glEnable(GL_CULL_FACE);





Si vous voyez le problème... A priori j'ai fait les calculs pour les
points et les angles de points bien définis, et ce que je fais avant
marche, il me renvoie les valeurs correctes, c'est ici que ca merde.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 avril 2006 à 13:04
Evidemment, c'est des produits matricielles, tu mets tes transformation dans la mauvais sens ...



glTranslatef(-0.5,0.0,-35.0);



glTranslatef(coor_x1,coor_y1,coor_z1);

glRotatef(phi,0,1,0);

glRotatef(theta,0,0,1);

glRotatef(90,0,1,0);



glColor3f(0.5,0.2,0.2);

gluCylinder(Quadric,0.1,0.1,h,60,60); // h correspond à la longueur du vecteur entre deux points



Ceci dit, j'ai dis une connerie dans mon premier post, faut d'abord
faire la rotation suivant z avant de faire la rotation suivant y (phi).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
saprobionte Messages postés 8 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 5 avril 2006
4 avril 2006 à 14:06
je ne comprend pas trop... Tu dis avoir dis une connerie dans le
premier post, en disant qu'il faut d'abord faire la rotation theta en
premier. Mais dans ce que tu met juste au dessus tu fais phi en
premier. Et j'ai essayé les deux versions,aucune ne marche.
0
saprobionte Messages postés 8 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 5 avril 2006
4 avril 2006 à 14:33
J'ai modifié mes opérations en faisant ca:





glTranslatef(-0.5,0.0,-35.0);



glTranslatef(coor_x1,coor_y1,coor_z1);

glRotatef(phi,0,1,0);

glRotatef(theta,0,0,1);

glRotatef(90,0,0,1); // selon l'axe des Z



glColor3f(0.5,0.2,0.2);

gluCylinder(Quadric,0.1,0.1,h,60,60);



Et là j'ai une bonne partie des cylindres qui sont correctement placés,
mais pas tous, donc je ne sais pas si je n'oublie pas encore quelque
chose.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
4 avril 2006 à 17:15
Mais non, tu connais pas les matrices ? Les transformations en opengl
doivent etre écris dans l'ordre inverse ! C'est pour ca que entre ce
que tu fais mentalement et le code opengl, tout est inversé.



Mais si ca ne marche pas, on doit pas etre d'accord sur les angles :),
j'ai testé avec juste une ligne au lieu de ton cylindre, ca marche
correctement.



Sinon ca ressemble a ce que tu as fais, mais remplace ca:

glRotatef(90,0,0,1); // selon l'axe des Z <= elle sert a rien la

par ca: glRotatef(90,0,1,0);



Si ca ne marche tjs pas post un peu plus de programme pour que je puisse tester.
0
saprobionte Messages postés 8 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 5 avril 2006
5 avril 2006 à 15:51
Bon alors j'ai encore tester, et pour l'heure ca ne marche pas
vraiment. Pour les matrices je savais comment ca marchait, mais bon
c'est la première fois que je fais de l'opengl, et j'en avais un gros
bout à assimiler... Enfin je me suis débrouillé, j'ai fait les arêtes
avec des lignes épaisses, c'est moins joli mais plus pratique, si j'ai
le temps je me pencherai sur le problème plus tard, je pense pas être
loin.

Merci en tout cas pour l'aide, ca m'a été précieux ne serait ce que pour comprendre comment placer les éléments en 3D.
0
Rejoignez-nous