[C++] OpenGL : Normales dans un GL_TRIANGLE_STRIP

OpenGL : Normales dans un GL_TRIANGLE_STRIP [C++] - C++ - Programmation

Marsh Posté le 28-01-2006 à 14:32:24    

Bonjour.
 
J'aimerais savoir quand définir les normales des points lorsque l'on créer un GL_TRIANGLE_STRIP
 
Pour expliquer mon problème : un petit exemple. Je veux afficher une page plié en 2 (genre livre à motié ouvert), les 2 parties de la pages formant les plan (Ox, Oz) et (Oy, Oz). Le code donne quelque chose dans le genre :
 

Code :
  1. glBegin(GL_TRIANGLE_STRIP);
  2. glVertex3d(1,0,0);
  3. glVertex3d(1,0,1);
  4. glVertex3d(0,0,0);
  5. glVertex3d(0,0,1);
  6. glVertex3d(0,1,0);
  7. glVertex3d(0,1,1);
  8. glEnd();


 
J'ai donc 2 normales à définir (pour chacun des 2 cotés) : glNormal3d(0,1,0) et glNormal3d(1,0,0). Où dois-je les placer ?
 
car les points (0,0,0) et (0,0,1) sont des points "charnieres", qui n'ont pas vraiment de normale, appartenant au 2 coté de la page en même temps (désolé si ce n'est pas clair, je fais du mieu que je peux promis  :pt1cable: )
 
Merci d'avance.
 
 
PS HS : c'est dommage qu'il n'y est pas un partie spécifique à l'openGL (je sais ce n'est pas un langage mais ca pose quand même des problèmes spécifiques), j'hésite toujours entre poster ici ou chez "graphisme", vu qu'il y a des posts pour OpenGL dans les 2...

Reply

Marsh Posté le 28-01-2006 à 14:32:24   

Reply

Marsh Posté le 28-01-2006 à 15:19:32    

Salut Stan,
 
Cela dépend de l'aspect que tu veux donner à ton angle : lissé ou marqué.
 

  • aspect lissé

Utilise comme normale pour les vertex (0,0,0) et (0,0,1) la moyenne des 2 autres normales : glNormal3d (1,1,0).

Code :
  1. glBegin (GL_TRIANGLE_STRIP);
  2. glNormal3d (0,1,0);
  3. glVertex3d (1,0,0);
  4. glVertex3d (1,0,1);
  5. glNormal3d (1,1,0);
  6. glVertex3d (0,0,0);
  7. glVertex3d (0,0,1);
  8. glNormal3d (1,0,0);
  9. glVertex3d (0,1,0);
  10. glVertex3d (0,1,1);
  11. glEnd ();


  • aspect marqué

Utilise deux triangle_strip, un pour le côté (Ox, Oz) et un autre pour le côté (Oy, Oz). Dans chacun des cas, utilise pour tous les points de la face, la même normale. L'inconvénient de procéder ainsi, est la duplication des points de l'angle entre les deux surfaces...

Code :
  1. glBegin (GL_TRIANGLE_STRIP);
  2. glNormal3d (0,1,0);
  3. glVertex3d (1,0,0);
  4. glVertex3d (1,0,1);
  5. glVertex3d (0,0,0);
  6. glVertex3d (0,0,1);
  7. glEnd ();
  8. glBegin (GL_TRIANGLE_STRIP);
  9. glNormal3d (1,0,0);
  10. glVertex3d (0,0,0);
  11. glVertex3d (0,0,1);
  12. glVertex3d (0,1,0);
  13. glVertex3d (0,1,1);
  14. glEnd();


 
Voila, j'éspère que ceci répondra à ta question...

Reply

Marsh Posté le 28-01-2006 à 17:50:41    

ok merci zbouirf, en effet c'est dommage que l'ont doivent utiliser deux séquences de begin ... end pour l'aspect marqué, mais après tout ca semble logique...

Reply

Sujets relatifs:

Leave a Replay

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