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 :

dessiner cylindre + glTranslatef (beginner)


Sujet :

OpenGL

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut dessiner cylindre + glTranslatef (beginner)
    Bonjour,

    j'arrive a dessiner un cylindre correctement avec des GL_QUAD.
    Resultat :


    Maintenant si je fais un glTranslateF en x juste pour le decaler un peu mon cylindre est deforme, je me demande si cela vient du code de ma creation de cylindre ou du glTranslateF que j'utilise mal ou tout simplement un effet d'optique... ><



    Merci

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut
    salur

    Citation Envoyé par saturn1 Voir le message
    Merci
    de rien...

    sinon on pourrait avoir des détails, histoire de pouvoir te répondre?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut re
    Ok desole de ne pas avoir etait assez clair.

    Donc le cylindre je le draw avec le code suivant :

    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
    31
    32
    33
    34
    35
    36
     
    void            Cylinder::draw()
    {
      int           lats = 20;
      int           longs = 20;
      float         sliceLats;
      float         sliceLongs;
     
      sliceLats = 2.0f * PI / lats;
      sliceLongs = PI / longs;
      glTranslatef(this->center->X(), this->center->Y(), this->center->Z()); // ligne problematique
      glScalef(this->radius, this->radius, this->radius);
      glBegin(GL_QUADS);
      for (int i = 0; i <= longs; i++)
        {
          float y0 = cos(i * sliceLongs);
          float y1 = cos((i + 1) * sliceLongs);
          for (int j = 0; j <= lats; j++)
            {
              float x0 = sin(j * sliceLats);
              float x1 = sin((j + 1) * sliceLats);
              float z0 = cos(j * sliceLats);
              float z1 = cos((j + 1) * sliceLats);
              float x2 = sin(j * sliceLats);
              float x3 = sin((j + 1) * sliceLats);
              float z2 = cos(j * sliceLats);
              float z3 = cos((j + 1) * sliceLats);
              glColor3f((float)(i + j) / (float)(lats + longs), (float)(i + j) / (float)(lats + longs), (float)(i + j) / (float)(lats + longs));
              glVertex3f(x0, y0, z0);
              glVertex3f(x1, y0, z1);
              glVertex3f(x3, y1, z3);
              glVertex3f(x2, y1, z2);
            }
        }
      glEnd();
    }
    Donc si mon centre est 0,0,0 j'ai le bon cylindre comme sur la bonne image, mais si je change de X mon cylindre est deforme comme sur la deuxieme image

    Merci encore

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 362
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 362
    Points : 20 391
    Points
    20 391
    Par défaut
    Salut je ne suis pas expert Open Gl ( je connais plus Direct 3d ) mais si tu as ce genre de résultat c'est que tu as mal défini dans ton code la matrice de projection voire celle pour la vue ( caméra ) .
    Et puis également le type de repérage, orthonormé système main droite ou main gauche ( mais je crois que pour Open GL c'est main droite )
    Ou bien alors tu effectues les mauvaises transformations sur chacun des quads

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    avec une matrice de projection en perspective classique d'OpenGL il y a effectivement des déformations au niveau des objets rendus sur les côtés.
    Notamment une sphère devrait être rendue comme un cercle ce qui ne sera pas le cas. idem les cercles en perspective ne seront pas rendus sur les côtés comme des ovales parfais.

    Pour réduire cette impression de déformation il faut réduire le paramètre de l'angle avec gluPerspective (l'attribut souvant nommé "fovy" ou "fov" pour field of view, le y indiquant que l'angle est donné suivant l'axe Y), cependant ceci n'est pas toujours possible par exemple dans un jeu de tir à la première personne si tu réduis cet angle on aura moins de visibilité sur les côtés, donc il faut trouver un compromis.

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 362
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 362
    Points : 20 391
    Points
    20 391
    Par défaut
    Citation Envoyé par saturn1 Voir le message
    glTranslatef(this->center->X(), this->center->Y(), this->center->Z()); // ligne problematique
    euhh si je ne me trompe pas tu n'effectues qu'une translation sur le centre !!


    Il faudrait que tu translates également tous les Quads dans la boucle il me semble!
    Donc tu dois appeler glTranslate pour chaque quad dans ta boucle

  7. #7
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut
    le glscal est mal placé, met-le avant ton gltranslate.
    Là, tu fais une mise à l'échelle centrée sur (0,0,0), donc si tu déplaces ton cylindre d'abord, les points éloignés de l'origine vont plus "gonfler" que les points proches.

    [edit] didiou, 4 réponses en 4 minutes!!! C'est des malades!!!! Oh les gars, j'étais prem's sur ce coup!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    lol, hé les gars pour répondre sur les forum c'est avant l'apéro et pas après

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    oui effectivement le scale avant le translate, et aussi il faudrait ajouter un glPushMatrix() avant le translate aussi et ajouter un glPopMatrix() après le glEnd(), car sinon tu ne retournes pas avec le même état qu'en entrant dans la fonction, ce qui affectera le dessin de tes autres éléments.

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    Citation Envoyé par adtunum Voir le message
    oui effectivement le scale avant le translate, et aussi il faudrait ajouter un glPushMatrix() avant le translate aussi et ajouter un glPopMatrix() après le glEnd(), car sinon tu ne retournes pas avec le même état qu'en entrant dans la fonction, ce qui affectera le dessin de tes autres éléments.

    Euh j'ai fais ceci pour contrer ce probleme est-ce vraiment horrible ?

    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      for(i = this->listEntitys.begin(); i != this->listEntitys.end(); ++i)
        {
          glLoadIdentity();
          glTranslatef(this->camera.X(), this->camera.Y(), this->camera.Z());
          glScalef(1, 1, 1);
          (*i)->draw();
        }

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par saturn1 Voir le message
    Euh j'ai fais ceci pour contrer ce probleme est-ce vraiment horrible ?
    sur une petite application on peux généralement presque tout se permettre car on pourra facilement appréhender la faible complexité de l'ensemble

    avec des applis plus conséquentes il vaut généralement mieux appliquer un minimum de discipline pour limiter les risques, mais effectivement ici tu n'as probablement pas besoin de te prendre trop la tête

    et puis c'est vrai que parfois il faut aussi savoir coder vite plutôt que bien

Discussions similaires

  1. [Débutant] dessiner sphere a l'interieur d'un cylindre
    Par hakimetudiant dans le forum MATLAB
    Réponses: 3
    Dernier message: 29/06/2015, 17h12
  2. cylindre mal dessine
    Par imperio dans le forum OpenGL
    Réponses: 8
    Dernier message: 15/10/2013, 10h07
  3. Réponses: 2
    Dernier message: 01/07/2010, 20h05
  4. [Graphic] Dessiner des hachures
    Par sylverspoon dans le forum 2D
    Réponses: 7
    Dernier message: 22/03/2006, 21h46
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

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