OpenGl en 3D

Résolu
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 - 23 mars 2005 à 12:04
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 - 24 mars 2005 à 11:52
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

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

@+, KeniiyK
3
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
23 mars 2005 à 15:21
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
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
23 mars 2005 à 15:26
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
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
23 mars 2005 à 15:41
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
0

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

Posez votre question
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
23 mars 2005 à 18:17
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
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
23 mars 2005 à 18:35
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
0
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
23 mars 2005 à 19:17
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
0
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
23 mars 2005 à 19:52
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
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
23 mars 2005 à 20:33
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
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
23 mars 2005 à 20:39
Euh pardon j'avais survolé ton dernier post...

KeniiyK
0
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
24 mars 2005 à 08:42
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
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
24 mars 2005 à 09:56
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
0
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
24 mars 2005 à 11:48
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
0
Rejoignez-nous