[OPEN GL] question sur les listes d'objets...

question sur les listes d'objets... [OPEN GL] - Divers - Programmation

Marsh Posté le 18-12-2002 à 11:14:15    

J'ai un projet à faire où on doit notamment modéliser la fusée de Tintin, et je débute en OpenGL.  
 
J'ai donc crée mes fonctions fuselage, ailette et amortisseur, qui représentent les parties de cette fusée.  
J'ai une liste comme ceci

Code :
  1. glNewList(FUSEE, GL_COMPILE);
  2. Fuselage();
  3. Ailette();
  4. Amortisseur();
  5. glEndList();


 
Le truc c'est que la fusée de Tintin a 3 "pates", donc j'ai calculé à la main les rotations et je les ai inclus dans les fonctions ailette et amortisseur à la barbare.  
Résultat : des fonctions immenses et où je fais 3 fois la même chose.
Je viens de découvrir qu'en enlevant mes rotations à la porc, et en écrivant :

Code :
  1. glNewList(FUSEE, GL_COMPILE);
  2. Fuselage();
  3. Ailette();
  4. Amortisseur();
  5. glPushMatrix();
  6.  glRotatef(120, 0, 1, 0);
  7.  Ailette();
  8.  Amortisseur();
  9.  glRotatef(120, 0, 1, 0);
  10.  Ailette();
  11.  Amortisseur();
  12. glPopMatrix();
  13. glEndList();


 
Eh bien j'arrive au même résultat.  
Cette solution me semble plus propre. Me conseillez vous de procéder ainsi ?

Reply

Marsh Posté le 18-12-2002 à 11:14:15   

Reply

Marsh Posté le 18-12-2002 à 11:28:36    

jotb a écrit :

J'ai un projet à faire où on doit notamment modéliser la fusée de Tintin, et je débute en OpenGL.  
 
J'ai donc crée mes fonctions fuselage, ailette et amortisseur, qui représentent les parties de cette fusée.  
J'ai une liste comme ceci

Code :
  1. glNewList(FUSEE, GL_COMPILE);
  2. Fuselage();
  3. Ailette();
  4. Amortisseur();
  5. glEndList();


 
Le truc c'est que la fusée de Tintin a 3 "pates", donc j'ai calculé à la main les rotations et je les ai inclus dans les fonctions ailette et amortisseur à la barbare.  
Résultat : des fonctions immenses et où je fais 3 fois la même chose.
Je viens de découvrir qu'en enlevant mes rotations à la porc, et en écrivant :

Code :
  1. glNewList(FUSEE, GL_COMPILE);
  2. Fuselage();
  3. Ailette();
  4. Amortisseur();
  5. glPushMatrix();
  6.  glRotatef(120, 0, 1, 0);
  7.  Ailette();
  8.  Amortisseur();
  9.  glRotatef(120, 0, 1, 0);
  10.  Ailette();
  11.  Amortisseur();
  12. glPopMatrix();
  13. glEndList();


 
Eh bien j'arrive au même résultat.  
Cette solution me semble plus propre. Me conseillez vous de procéder ainsi ?


Ben quand je faisais de l'OpenGl, je faisais comme ça. Mais bon, je suis pas du tout un spécialiste, donc mon avis ne doit pas valoir grand chose ... :(  


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 18-12-2002 à 11:32:39    

Instinctivement, ça me semble plus propre. Mais ça doit faire plus de calculs...  
 
D'autres avis ?  :??:

Reply

Marsh Posté le 18-12-2002 à 12:11:58    

jotb a écrit :

Cette solution me semble plus propre. Me conseillez vous de procéder ainsi ?

tout ce qui est propre est à conseiller :D
 
le plus propre reste d'avoir une méthode 'générique' d'affichage, prenant en paramètre une structure contenant un matériau + points & vertices + matrice de l'objet.  
 
tu peux créer ces objets au début de ton programme, mais tu peux encore faire plus propre : un fichier (texte, + simple) contenant le nom de l'objet (fusée), les objets divers (fuselage, ailette, amortisseur), les instances (dessiner l'ailette avec telle matrice).

Reply

Marsh Posté le 18-12-2002 à 12:23:35    

youdontcare a écrit :

tout ce qui est propre est à conseiller :D
 
le plus propre reste d'avoir une méthode 'générique' d'affichage, prenant en paramètre une structure contenant un matériau + points & vertices + matrice de l'objet.
tu peux créer ces objets au début de ton programme, mais tu peux encore faire plus propre : un fichier (texte, + simple) contenant le nom de l'objet (fusée), les objets divers (fuselage, ailette, amortisseur), les instances (dessiner l'ailette avec telle matrice).


 
là c'est un peu compliqué. La matrice de l'objet se complète quand je pose un glVertex3f(...), c'est ça ?

Reply

Marsh Posté le 18-12-2002 à 12:29:56    

jotb a écrit :

La matrice de l'objet se complète quand je pose un glVertex3f(...), c'est ça ?

pas compris.

Reply

Marsh Posté le 18-12-2002 à 12:30:35    


 
ben c'est quoi ce que t'appelle la matrice de l'objet ?  

Reply

Marsh Posté le 18-12-2002 à 12:46:32    

jotb a écrit :

ben c'est quoi ce que t'appelle la matrice de l'objet ?

glRotatef(120, 0, 1, 0); & co. tu peux voir que chaque objet possède une matrice d'orientation : si tu traces deux objets à la suite, c'est juste la même matrice. ton glRotate 'rajoute' une rotation à la matrice courante. le tracé d'ailette trace trois ailettes aux angles 0°, 120°, 240° (angles absolus).
 
le 'problème' de ton code, c'est qu'il ne peut tracer qu'un seul type d'objet : la fusée (fonctions Fuselage() & co). si tu veux améliorer ton code, une chose à faire est de se débarasser de ces fonctions et de n'avoir qu'une seule fonction de tracé d'objet, qui prend les paramètres cités plus haut. (ça reste à voir jusqu'à quel point c'est modifiable vu que tu ne files pas le code de Fuselage(), Ailette() & co).

Reply

Marsh Posté le 18-12-2002 à 12:50:36    

youdontcare a écrit :

glRotatef(120, 0, 1, 0); & co. tu peux voir que chaque objet possède une matrice d'orientation : si tu traces deux objets à la suite, c'est juste la même matrice. ton glRotate 'rajoute' une rotation à la matrice courante. le tracé d'ailette trace trois ailettes aux angles 0°, 120°, 240° (angles absolus).
 
le 'problème' de ton code, c'est qu'il ne peut tracer qu'un seul type d'objet : la fusée (fonctions Fuselage() & co). si tu veux améliorer ton code, une chose à faire est de se débarasser de ces fonctions et de n'avoir qu'une seule fonction de tracé d'objet, qui prend les paramètres cités plus haut. (ça reste à voir jusqu'à quel point c'est modifiable vu que tu ne files pas le code de Fuselage(), Ailette() & co).


 
Bouge pas, je vais te MP un exemple...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed