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 :

Obtention de cette figure ?


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Obtention de cette figure ?
    Bonjour,

    j'ai récupérer un code simple pour voir les bases.
    Une fois compilé le programme donne ceci comme scene :


    Les objets de la scene sont tous construit à partir d'un cube.
    J'ai essayé de faire les translations et les homotethies à la main mais je n'arrive pas à comprendre comment ça se fait que les 4 bouts de code se touchent pour former le P par exemple.

    Voici le 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     void display(void)
    {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Clear the colour and depth buffer
     
    glLoadIdentity(); // Clear matrix stack
     
    // We set the camera in position 50,50,100 and we look at origo
    gluLookAt(50,50,100,0,0,0,0,1,0);
     
    // Make the model rotate around the y axis.
    glRotatef(rot_val,0,1,0);
     
    glColor3f(1,0,0);
    glBegin(GL_LINES);
    glColor3f(1,0,0);
    glVertex3f(0,0,0);
    glVertex3f(1000,0,0);
    glEnd();
     
    glColor3f(0,1,0);
    glBegin(GL_LINES);
    glVertex3f(0,0,0);
    glVertex3f(0,1000,0);
    glEnd();
     
    glColor3f(0,0,1);
    glBegin(GL_LINES);
    glVertex3f(0,0,0);
    glVertex3f(0,0,1000);
    glEnd();
     
     
    glPushMatrix();
    glTranslatef(-10,0,-10);
     
    // T base
    // Draw cube 1
    glPushMatrix();
    glTranslatef(0,5,25);
    glScalef(5,5,50);
    drawCube();
    glPopMatrix();
     
    // T roof
    // Draw cube 2
    glPushMatrix();
    glTranslatef(0,5,0);
    glScalef(30,5,5);
    drawCube();
    glPopMatrix();
     
    // P base
     
    glPushMatrix();
    glTranslatef(30,5,25);
    glScalef(5,5,50);
    drawCube();
    glPopMatrix();
     
    glPushMatrix();
    glTranslatef(40,5,0);
    glScalef(25,5,5);
    drawCube();
    glPopMatrix();
     
    glPushMatrix();
    glTranslatef(40,5,25);
    glScalef(25,5,5);
    drawCube();
    glPopMatrix();
     
    glPushMatrix();
    glTranslatef(50,5,13);
    glScalef(5,5,25);
    drawCube();
    glPopMatrix();
     
    glPopMatrix();
     
    // Draw plane
    glPushMatrix();
    glScalef(100,100,100);
    drawPlane();
    glPopMatrix();
     
     
    glFlush(); // Makes sure that we output the model to the graphics card
    glutSwapBuffers();
    glutPostRedisplay();
    }
    Ce n'est pas le code en lui-même qui me pose problème mais les transformations qui arrivent à ce résultat

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    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 818
    Par défaut
    Salut,

    Citation Envoyé par Premium
    Ce n'est pas le code en lui-même qui me pose problème mais les transformations qui arrivent à ce résultat
    Comment tu fais pour comprendre le code, mais pas ce qu'il fait???


    On sauvegarde la matrice courante

    On se déplace là où on veut dessiner

    On applique un facteur d'échelle sur chaque axe du repère

    On dessine notre cube (qui, vu que l'on a des facteurs d'échelle sur les trois axes, ressemblera plus à un parallélépipède qu'à un vrai cube )

    On rappelle la matrice sauvegardée pour revenir aux conditions de départ (position d'origine et facteurs d'échelle=1)

    Et on continue pour les autre parallélépipèdes.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par plegat
    Salut,
    Comment tu fais pour comprendre le code, mais pas ce qu'il fait???

    On sauvegarde la matrice courante

    On se déplace là où on veut dessiner

    On applique un facteur d'échelle sur chaque axe du repère

    On dessine notre cube (qui, vu que l'on a des facteurs d'échelle sur les trois axes, ressemblera plus à un parallélépipède qu'à un vrai cube )

    On rappelle la matrice sauvegardée pour revenir aux conditions de départ (position d'origine et facteurs d'échelle=1)

    Et on continue pour les autre parallélépipèdes.
    Je comprends tous ça met, ce qui me pose problème, c'est les paramètres donnés aux fonctions de transformations.
    Par exemple pour le T, le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // T base
    // Draw cube 1
    glPushMatrix();
    glTranslatef(0,5,25);
    glScalef(5,5,50);
    drawCube();
    glPopMatrix();
    On agrandit de 50 suivant l'axe des Z pour obtenir la base puis on la translate de (0,5,25). Pour l'instant, je comprends

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // T roof
    // Draw cube 2
    glPushMatrix();
    glTranslatef(0,5,0);
    glScalef(30,5,5);
    drawCube();
    glPopMatrix();
    C'est là, que je ne saisis pas comment ça se fait qu'avec cette translation, la barre du T sera centré sur la base et qu'elle la touchera ?

    Pour le P, pareil, pour la base, pas de soucis mais c'est les translations qui sont utilisées ensuite (les parametres) qui amenent à la construction du P que je ne comprend pas

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    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 818
    Par défaut
    Citation Envoyé par Premium
    On agrandit de 50 suivant l'axe des Z pour obtenir la base puis on la translate de (0,5,25). Pour l'instant, je comprends
    Non, désolé de te dire ça, mais tu n'as pas compris.
    En informatique, quand une ligne de code est située juste avant une autre, elle est exécutée en premier, et l'autre ensuite.
    Donc là, on se translate, on met les facteurs d'échelle, et on construit ensuite. En plus on ne construit pas la base, on construit le cube.


    Citation Envoyé par Premium
    mais c'est les translations qui sont utilisées ensuite (les parametres) qui amenent à la construction du P que je ne comprend pas
    Les translations ne construisent pas les éléments du T, elles ne servent qu'à se placer dans l'espace pour commencer la construction du cube. C'est le cube en lui-même qui crée les éléments du T (et ensuite du P). Si tu prends ton cube, de côté 1 je présume, et que tu le construit à partir de là où tu es arrivé avec la translation, et que tu le construits avec comme facteurs d'échelle 5 sur x, 5 sur y, et 50 sur z, tu obtiens un parallélépipède (un rectangle en 3D) qui aura pour dimension 5 sur un des petits côtés, 5 sur l'autre des petits côtés, et une longueur de 50.

    En gros, quand tu fais un gScalef(5,5,50), ça veut dire que ton unité de longueur suivant x fait 5 mètres, celle suivant y fait 5 mètres, et celle suivant z fait 50 mètres. Donc ensuite, quand tu demandes la construction du cube de une unité de côté, ça fera 5 mètres en x (=1 unité de longueur), 5 mètres en y (=1 unité), et 50 mètres en z (=1 unité).
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    D'accord et est-ce que tu pourrais m'expliquer pourquoi, ce qui est en gras est correcte pour qu'on aie le T ?
    Je pensais plutot qu'il fallait mettre glTranslatef(0,5,25); comme pour le cube 1 ?
    La on n'avance pas de Z unités . Comment se fait-il que le T est tout de même formé ?
    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
    // T base
    // Draw cube 1
    glPushMatrix();
    glTranslatef(0,5,25);
    glScalef(5,5,50);
    drawCube();
    glPopMatrix();
    
    // T roof
    // Draw cube 2
    glPushMatrix();
    glTranslatef(0,5,0);
    glScalef(30,5,5);
    drawCube();
    glPopMatrix();

  6. #6
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    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 818
    Par défaut
    Citation Envoyé par Premium
    D'accord et est-ce que tu pourrais m'expliquer pourquoi, ce qui est en gras est correcte pour qu'on aie le T ?
    Je pensais plutot qu'il fallait mettre glTranslatef(0,5,25); comme pour le cube 1 ?
    La on n'avance pas de Z unités . Comment se fait-il que le T est tout de même formé ?
    Je te rappelle que tu ne nous as pas donné le code de la procédure drawCube(); et que donc tu es le seul ici à savoir comment se dessine ton cube...

    Cependant, même sans avoir toutes les infos, on arrive à peu près à savoir comment ça marche...



    Après, il suffit de gérer les translations correctement... il faut que tu piges ça avant d'aller plus loin en OpenGL... parce qu'avec les rotations, ça va être plus ardu!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

Discussions similaires

  1. qu'est ce qui va pas dans cette fonction???
    Par access001 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/04/2006, 13h10
  2. Réponses: 12
    Dernier message: 08/03/2006, 17h27
  3. [GEF]class Figure dans container SWING ?
    Par Albarad dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/06/2004, 12h12
  4. Encore cette fichu erreur (0x80004005)
    Par AF_STjohn dans le forum ASP
    Réponses: 2
    Dernier message: 18/05/2004, 11h14
  5. Réponses: 3
    Dernier message: 06/05/2002, 18h24

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