IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

GL_QUAD_STRIP et glNormal ?


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Par défaut GL_QUAD_STRIP et glNormal ?
    Bonjour,

    J'ai construit un petit plateau d'echec avec openGL en utilisant GL_QUADS pour les faces dessus et dessous, et j'utilise un GL_QUAD_STRIP pour faire les quatre côtés (donnant ainsi l'impression d'une épaisseur).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // Epaisseur du plateau
            float epaisseur = widthCase/5;
            gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT_AND_DIFFUSE, noir, 0);
     
            gl.glPushMatrix();
            gl.glBegin(gl.GL_QUAD_STRIP);     
     
            gl.glVertex3f(0.0f, 0.0f, 0.0f);
            gl.glVertex3f(0.0f, 0.0f, epaisseur);
     
            gl.glVertex3f(widthCase * nbColonnes, 0.0f, 0.0f);
            gl.glVertex3f(widthCase * nbColonnes, 0.0f, epaisseur);
     
            gl.glVertex3f(widthCase * nbColonnes, widthCase * nbLignes, 0.0f);
            gl.glVertex3f(widthCase * nbColonnes, widthCase * nbLignes, epaisseur);
     
            gl.glVertex3f(0.0f, widthCase * nbLignes, 0.0f);
            gl.glVertex3f(0.0f, widthCase * nbLignes, epaisseur);
     
            gl.glVertex3f(0.0f, 0.0f, 0.0f);
            gl.glVertex3f(0.0f, 0.0f, epaisseur);
     
            gl.glEnd();
    A l'affichage, il y a tout de même un effet visuel étrange, du fait sans doute que je ne définis pas encore les vecteurs normaux pour ces quatre petites faces de côtés.

    Mais maintenant que j'y suis, je ne vois pas comment faire ! En effet, chaque Vertex est utilisé pour deux faces dans cette configuration, non ?

    Comment faire ?

    Je vous remercie.

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    effectivement, si tu utilise un quad strip, tu est obligé de partager tes normales... donc utilise plutot des quads simple dans ton cas.
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Par défaut
    Merci pour cette rapide réponse. Je songerai alors à utiliser des QUADS plutôt que des QUADS_STRIP ...

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Par défaut
    Finalement je m'en suis sorti en gardant le même QUAD_STRIP. J'ai réalisé que le pipeline OpenGL se charge de faire une interpolation des normales pour chaque face en fonction des Vertex qui les composent. Du coup, il me suffisait que pointer les normales "en diagonale". Voici l'extrait de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
            gl.glPushMatrix();
            gl.glBegin(gl.GL_QUAD_STRIP);
     
            gl.glNormal3f(-1.0f, -1.0f, 0.0f);
     
            gl.glVertex3f(0.0f, 0.0f, 0.0f);
            gl.glVertex3f(0.0f, 0.0f, epaisseur);
     
            gl.glNormal3f(1.0f, -1.0f, 0.0f);
     
            gl.glVertex3f(widthCase * nbColonnes, 0.0f, 0.0f);
            gl.glVertex3f(widthCase * nbColonnes, 0.0f, epaisseur);
     
            gl.glNormal3f(1.0f, 1.0f, 0.0f);
     
            gl.glVertex3f(widthCase * nbColonnes, widthCase * nbLignes, 0.0f);
            gl.glVertex3f(widthCase * nbColonnes, widthCase * nbLignes, epaisseur);
     
            gl.glNormal3f(-1.0f, 1.0f, 0.0f);
     
            gl.glVertex3f(0.0f, widthCase * nbLignes, 0.0f);
            gl.glVertex3f(0.0f, widthCase * nbLignes, epaisseur);
     
            gl.glNormal3f(-1.0f, -1.0f, 0.0f);
     
            gl.glVertex3f(0.0f, 0.0f, 0.0f);
            gl.glVertex3f(0.0f, 0.0f, epaisseur);
     
            gl.glEnd();
    J'avoue cependant que je ne suis pas sûr de moi. Visuellement, ça rend pas trop mal. Est-ce que vous pensez que je fais erreur ?
    Merci

  5. #5
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Si tu utilises des normales "en diagonale", c#est à dire la moyenne des normales de ton quad du dessus et de celui du côté, tu auras un effet de bord arrondi.
    Si tu veux un bord bien marqué, comme c'est le cas avec ton echiquier, il faut que chaque face ait une et une seule normale, donc il faut repeter les vertex appartenant à deux triangles n'ayant pas la meme normale deux fois.

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Par défaut
    Ok merci Shev, je n'avais effectivement pas compris qu'OpenGL fonctionnait ainsi.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de glNormal ???
    Par roms18 dans le forum OpenGL
    Réponses: 10
    Dernier message: 01/02/2006, 10h23
  2. GL_QUAD_STRIP, GL_TRIANGLE_STRIP, ...
    Par hogan dans le forum OpenGL
    Réponses: 4
    Dernier message: 12/12/2005, 10h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo