OpenGl en 3D [Résolu]

Signaler
Messages postés
273
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
31 mars 2015
-
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
-
Salut,
C'est juste pour une petite information. En fait, je voudrais tracé avec Glut une courbe en 3D. Mon programme intègre un système de 3 équations differentielles avec l'algo runge kutta et je voudrais tracé x,y et z. J'ai essayé d'utiliser glVertex3f mais j'ai l'impression que ça n'a pas l'air d'être ça. Du moins ça me donne pas ce que je veux. Peut être que je me suis mal pris. Si quelqu'un peut m'aider ça serait bien; Ce que j'ai fais c'est:

...
void display( void )
{
int i;
double a1,a2,a3;

/* Efface la fenêtre */
glClear(GL_COLOR_BUFFER_BIT);

a1 = 1.0; /* position initiale */
a2 = 1.0;
a3 = 1.0;

glBegin(GL_POINTS);
for(i=1 ; i<=nit; i++)
{

rk4(&a1,&a2,&a3); /*runge kutta ordre 4*/
glVertex3f(a1,a2,a3);

}
glEnd();
glFlush(); /* Efface les buffers */
}
et dans mon main:

int main(int argc, char** argv)
{
/* initialisation GLUT */
glutInit(&argc,argv);
/* ModeRGB */
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
/* Taille de la fenêtre */
glutInitWindowSize(400,400);
/* Position fenêtre */
glutInitWindowPosition(0,0);
/* Titre fenêtre */
glutCreateWindow("Attracteur Duffing");
/* Enregistrements des callbacks */
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);


/* Couleurs de fond noir */
glClearColor(0.0, 0.0, 0.0, 0.0);
/* Tracé en vert */
glColor3f(0.0, 1.0, 0.0);
/* activation de la matrice de projection */
glMatrixMode(GL_PROJECTION);
/* Réinitialisation de la matrice de transformation */
glLoadIdentity();
/* Rotation autour de l'axe x */
glRotatef(0.0,0.1,0.0,0.0);
/* visualisation de la matrice */
glOrtho(-10.0, 12.0, -10.0, 10.0,-10.0, 25.0);
glMatrixMode(GL_MODELVIEW);


/* Boucle principale */
glutMainLoop();
return 0;
}

Merci.
Jarod_Delaware

13 réponses

Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Ok, content pour toi et d'avoir pu t'aider.

@+, KeniiyK
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Salut,

/* Couleurs de fond noir */
glClearColor(0.0, 0.0, 0.0, 0.0);
/* Tracé en vert */
glColor3f(0.0, 1.0, 0.0);
Ca mets le dans une void initGL(); par exemple, ca marche mais c juste pour etre plus propre

/* activation de la matrice de projection */
glMatrixMode(GL_PROJECTION);
/* Réinitialisation de la matrice de transformation */
glLoadIdentity();
/* Rotation autour de l'axe x */
glRotatef(0.0,0.1,0.0,0.0);
/* visualisation de la matrice */
glOrtho(-10.0, 12.0, -10.0, 10.0,-10.0, 25.0);
glMatrixMode(GL_MODELVIEW);
Ca met le dans la callback de reshape ou de resize si tu veux, ( glutReshapeFunc ) la fonction de callback prends en parametre deux int (width et height) donc genre resizeGL(int w, int h).
Et par contre glRotatef(0.0,.......); ne modifie pas ta matrice de projection vu que l'angle est nul. Et je sais pas pourquoi tu t'en sers ici. Si tu veux te placer en un point et en regarder un autre utilise plutot gluLookAt()

KeniiyK
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Et au fait, "J'ai essayé d'utiliser glVertex3f mais j'ai l'impression que ça n'a pas l'air d'être ça. Du moins ça me donne pas ce que je veux."
D'accord mais c'est quoi ce que tu veux ?..... s'pas ?.... manque comme un truc, non?

KeniiyK
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Pour ton tracé, je pense que tu veux plutot tracé des droites :
glBegin(GL_LINES);
glVertex*() // premier sommet
glVertex*() // second sommet
glEnd();

ou plutot dans ton cas
glBegin(GL_LINE_STRIP);
glVertex*() // premier sommet / tu peux faire un for(...;....;....){instruction; glVertex*();} aussi
|
|
|
glVertex*() // dernier sommet
glEnd();

glFlush(); /* Efface les buffers */, FAUX ca force le tracé a se terminer

KeniiyK
Messages postés
273
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
31 mars 2015
2
Salut,
Tout d'abord merci pour tes réponses. J'ai fais comme tu m'as dis pour les initGL() et void reshape() en effet c'est plus propre. Par contre c'est vrai que je n'ai pas etais trop précis en ce qui concerne glVertex3f. En fait, mon programme intègre un système de 3 équations differentielles par la méthode de runge kutta ordre 4 puis je voulais tracer en utilisant Glut les points x, y et z dans un repère en 3d. Pour être plus précis je voulais tracer l'allure de l'attracteur de Rossler dans le plan xyz. Lorsque j'utilise glvertex3f j'obtiens la même figure que si j'utilise glvertex2f. Donc la même figure que dans le plan xy. C'est pourquoi j'ai écris que je n'obtiens pas ce que je voulais.
Par contre dans ta dernière explication est ce que tu peux être un peu plus précis svp en ce qui concerne glVertex* que tu as écris.
Merci encore pour tes réponses.

Jarod_Delaware
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Je pense que c'est parce que tu fais une projection orthogonale essaye un gluPerspective(...) plutot que glOrtho(..).

Bon apparement tu veux vraiment tracé des points donc ne tient pas compte du dernier message. Quand je mets glVertex*() le * veut dire (2i,3i,4i,2f,3f,4f,etc + eventuellement la forme vectorielle c a d le v) continue avec glVertex3f(..) c'est ca dont tu as besoin.

KeniiyK
Messages postés
273
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
31 mars 2015
2
Merci pour ta réponse. Je vais essayé avec gluPerspective(...) je vais voir ce que ca me donne. Je te tiens au courant.

Merci encore pour ton aide.

Jarod_Delaware
Messages postés
273
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
31 mars 2015
2
En fait, pour moi tout ça c'est un peu nouveau le tracé en 2D. Si j'ai bien compris gluPerspective ça marche de cette façon:

gluPerspective(40.0,1.5,50.0,100.0)
configure une caméra de visualisation en perspective placée à l'origine et orientée selon l'axe -z avec un angle d'ouverture verticale de 40.0°, un angle d'ouverture horizontale de 40.0*1.5 = 60.0°, un plan de clipping qui élimine tous les objets ou morceaux d'objet situés en z > -50.0 et un plan de clipping qui élimine tous les objets ou morceaux d'objets situés en z < -100.0.
Par contre mon void display( void ) ma boucle reste comme ça:
glBegin(GL_POINTS);
for(i=1 ; i<=nit; i++)
{

rk4(&a1,&a2,&a3); /*runge kutta ordre 4*/
glVertex3f(a1,a2,a3);

}
Ca me donne pas grand chose, autant dire rien du tout. Je suis un petit perdu.
Jarod_Delaware
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Non pas du tout, gluPerspective(fovy,aspect,near,far) sert a definir une matrice de projection perspective (d'ou son nom) il faut la mettre dans ton resize avec
fovy=60.0 par exemple c'est l'angle d'ouverture (ne peut exceder 180.0 et ne peut etre inferieur a 0.0),
aspect represente le rapport largeur/hauteur souhaite donc generalement on met width/height (en calcul floatant)
near represente la distance entre ton plan de clipping proche et la camera (point de vue) suivant l'axe de profondeur, par exemple si tu met 1.0 alors tout ce qui est a moins de 1.0 du point de vue sera supprime (non affiche),
far idem mais c'est le plan de clipping eloigne donc ce qui est affiche est contenu entre le near et le far.
Enfin une matrice de projection decrit comment sont projetés les points 3D sur le plan image.

Pour placer une camera tu peut te servir de gluLookAt(....), si tu te sert pas de ca tu peux aussi te deplacer/tourner via glTranslatef()/glRotatef() sachant que par defaut (avec un glLoadIdentity()) la camera est place a l'origine, le haut est dans le sens des Y positifs et elle regarde selon l'axe des Z negatifs.

Donc dans ton resize(int w, int h) tu enleve glOrtho et tu met gluPerspective().
Et dans ton display(void) apres le glClear(....) tu met
glLoadIdentity();
gluLookAt(....la ou tu veut etre et la ou tu veut regarde...);

KeniiyK
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Euh pardon j'avais survolé ton dernier post...

KeniiyK
Messages postés
273
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
31 mars 2015
2
salut KeniiyK,
Je vais tester ce que tu m'as dis aujourd'hui. Par contre je ne comprend pas pourquoi glOrtho ne marche dans mon cas. Puisque en fait le plan xyz doit former un tirèdre direct, plan orthonormé, enfin si mes souvenirs sont bons.
Je vais essayé ce que tu m'as dis j'espère que ça va marcher. Je te tiens au courant.
Merci beaucoup pour ton aide.

Jarod_Delaware
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Mais si glOrtho marche bien (tout est projete orthogonalement sur le plan image, ce qui fait que tu n'as de vision en "profondeur"), mais c'est bien ca le soucis. XYZ est bien orthonormé direct, si tu regardes suivant les Z (negatif ou positif) et que tu traces 2 points ayant les X et les Y equivalents et quelques soit leurs Z et bien il seront projetés sur le meme point image, d'ou ta remarque (juste) "Lorsque j'utilise glvertex3f j'obtiens la même figure que si j'utilise glvertex2f".

KeniiyK
Messages postés
273
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
31 mars 2015
2
Ok, j'ai compris maintenant. J'ai essayé de faire comme tu m'as dis de faire avec gluLookAt(...) , glRotatef(...) et glPerspective(...) ça marche nickel maintenant. Par contre j'ai fais un autre test en gardant glOrtho(...) et en jouant uniquement sur glRotate(...) ça marche également. Le résultat n'est pas aussi bien que quand j'utilise glPerspective(...) et les autres artifices.
Je te remercie beaucoup pour ton aide précieuse. J'ai appris beaucoup de choses que je ne maîtrisé pas encore bien.
Merci.

Jarod_Delaware