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 deux objets l'un sur l'autre


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut dessiner deux objets l'un sur l'autre
    bonjour,
    D'abord il faut signaler que je suis débutante dans ces domaines synthèse d'image donc ça se peut que mes questions seront banales.
    j'ai capturé une image et j'ai l'utilisé comme une texture de la fenêtre d'opengl
    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
     
    GLvoid OnDisplay(void)
    {
     
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	glEnable(GL_TEXTURE_2D);
     
    	// Set Projection Matrix
    	glMatrixMode (GL_PROJECTION);
    	glLoadIdentity();
    	gluOrtho2D(0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT, 0);
     
    	// Switch to Model View Matrix
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
     
    	// Draw a textured quad
    	glBegin(GL_QUADS);
    	glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
    	glTexCoord2f(1.0f, 0.0f); glVertex2f(VIEWPORT_WIDTH, 0.0f);
    	glTexCoord2f(1.0f, 1.0f); glVertex2f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
    	glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, VIEWPORT_HEIGHT);
    	glEnd();
     
     
    glFlush();
    	glutSwapBuffers();
     
    }
    et ça marche très très bien
    j'ai aussi dessiné un objet (cylindre) dans un autre programme ou un autre 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
     
    void DrawCylinder(double r,double height)
    {
        double x=0,y=0;
        glBegin(GL_POINTS);
        for(double z=0;z<=height;z++)
        {
            for(double t=0;t<=PI;t+=0.5)
            {
                x=r*cos( t );
                y=r*sin( t );
     
     
                glVertex3d(x,y,z);
            }
        }
        glEnd();
    }
    void Render()
    {
    	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glOrtho (-100.0,100.0,-100.0,100.0,100.0,-100.0);
     
    	glLoadIdentity();
    	glTranslatef(0,0,-15);
    	 glRotatef(90,1,0,0);
    DrawCylinder(1.5,10);
    }
    et ça aussi marche très bien
    je voudrais maintenant dessiner la cylindre de 2éme programme dans le premier programme (la cylindre sur l'image de texture)
    j'ai n'ai pas pu faire ça, il m'affiche que l'image de premier programme
    pourriez vous m'aider pour faire ça ?

  2. #2
    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
    Bonjour,

    à priori pas de problème, il te faut juste positionner ton cylindre correctement, c'est à dire devant le quad texturé.

    Là dans ton 2eme exemple tu as un cadrage différent du 1er:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glOrtho (-100.0,100.0,-100.0,100.0,100.0,-100.0);
    le 1er:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluOrtho2D(0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT, 0);
    donc pour commencer, les coordonnées dans ta fenêtre vont dans un cas de -100 à 100, et dans l'autre de 0 à VIEWPORT_WIDTH (resp. VIEWPORT_HEIGHT)

    quel cadrage utilise-tu dans la version où tu dessines tout?

    Une fois que ca c'est défini, il suffit d'appliquer les bons glTranslate / glRotate à ton cylindre pour l#amener où tu veux.

    Là je pense que si tu utilises directement le code du 2eme exemple, le
    va positionner ton cylindre en Z = -15, alors que le quad est en Z = 0. Du coup ton cylindre est derrière et tu ne le vois pas.

    Bref,mets-voir le code de ton 3eme programme, ca ira plus vite

  3. #3
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    bonsoir, merci ShevchenKik pour votre aide
    j'ai essayé d'appliquer ce que vous avez me dis mais malheureusement j'ai pas réussi ; j'ai essayé de rendre le Z de glortho le même que le max entre height et r de la cylindre .
    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
     
    GLvoid OnDisplay(void)
    {
     
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	glEnable(GL_TEXTURE_2D);
     
    	// Set Projection Matrix
    	glMatrixMode (GL_PROJECTION);
    	glLoadIdentity();
    	gluOrtho2D(0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT, /*0*/15);
     
    	// Switch to Model View Matrix
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    		glTranslatef(0,0,0);
    	// Draw a textured quad
    	glBegin(GL_QUADS);
    	glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
    	glTexCoord2f(1.0f, 0.0f); glVertex2f(VIEWPORT_WIDTH, 0.0f);
    	glTexCoord2f(1.0f, 1.0f); glVertex2f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
    	glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, VIEWPORT_HEIGHT);
    	glEnd();
    	glLoadIdentity();
     
         glTranslatef(0,0,15);
     
     DrawCylinder(5,15);
    glFlush();
    	glutSwapBuffers();
     
    }
    mais le même problème je ne vois pas la cylindre

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 141
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Étant donné que la caméra par défault est en (0, 0, 1), ( et regarde en 0, 0, 0) si vous placer votre quad en 0 sur l'axe des Z, vous le voyez, normal. Mais si vous placer un cylindre à -15, vous ne le voyez pas, car derrière le quad. Toujours normal.
    Si vous placez le cylindre en 15, vous ne le voyez toujours pas. Cela reste normal, c'est qu'il est derrière vous .

    Maintenant, je propose de déplacer le Quad en -1, et le cylindre en 0.
    Mais au hasard, vous vouliez faire votre quad comme font d'écran. Pour cela je n'ai pas de réponse simple. ( Soit faire un gluLookAt, et dessiner le quad ... ou alors, si peut être, dessiner le cylindre en 0.1. )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  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
    Bonjour,

    plusieurs choses sur votre code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluOrtho2D(0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT, /*0*/15);
    Là je ne vois pas ce qu'est censé réaliser votre 15... ce n'est pas là qu'il faut jouer pour régler votre probleme. De plus, l'ordre des paramètres me paraît suspect...on passe d'abord les bornes inférieures, puis les supérieures, essayez plutôt ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluOrtho2D(0, VIEWPORT_WIDTH, 0, VIEWPORT_HEIGHT);
    Ensuite, gluOrtho2D limite les Z entre 1 et -1... Si vous voulez plus "d'épaisseur" (pour avoir la place de dessiner le cylindre devant le quad, par exemple) utilisez glOrtho(), qui permet de fixer zMin et zMax.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glOrtho(0, VIEWPORT_WIDTH, 0, VIEWPORT_HEIGHT, 100, -100);
    ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    		glTranslatef(0,0,0);
    => le glTranslate ne sert à rien, puisque vous translatez de 0....

    Puis, après le dessin du quad, vous appelez glLoadIdentity()... ce qui a pour effet d'annuler tout ce que vous venez de dessiner. à supprimer donc...

  6. #6
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    merci ShevchenKik, LittleWhite pour vos remarques j'ai réglé le problème.

    et ça le code pour dessiner la cylindre (j'ai le réglé)

    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
     
    void drawCylinder(double r,double height)
    {
        double x=0,y=0;
        double pre=height/20;
        glPointSize(1);
        glBegin(GL_POINTS);
        for(double z=0;z<=height;z+=pre)
        {
            for(double t=0;t<=PI;t+=PI/20)
            {
                x=r*cos(t);
                y=r*sin(t);
                glVertex3d(x,z-height/2,y);
            }
        }
        glEnd();
        glLoadIdentity();
    }
    et ça pour mappé le cylindre sur l'image
    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
     GLvoid OnDisplay(void)
    {
     
     
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	glEnable(GL_TEXTURE_2D);
     
    	// Set Projection Matrix
    	glMatrixMode (GL_PROJECTION);
    	glLoadIdentity();
    	glOrtho (0,VIEWPORT_WIDTH,0,VIEWPORT_HEIGHT,-500,500);
     
    	// Switch to Model View Matrix
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
    	// Draw a textured quad
     
    glBegin(GL_QUADS);
        glTexCoord2f(1.0f, 1.0f); glVertex3d(0,0,-499);
        glTexCoord2f(1.0f, 0.0f);glVertex3d(0,VIEWPORT_HEIGHT,-499);
        glTexCoord2f(0.0f, 0.0f);glVertex3d(VIEWPORT_WIDTH,VIEWPORT_HEIGHT,-499);
        glTexCoord2f(0.0f, 1.0f);glVertex3d(VIEWPORT_WIDTH,0,-499);
            glEnd();
     
    glFlush();
     
     
     
    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
             storage = cvCreateMemStorage( 0 );
             Rect=*detect_and_draw(cvLoadImage("lena.jpg"));
    glTranslatef((2*(Rect.x)+Rect.width)/2,VIEWPORT_HEIGHT-(2*(Rect.y)+Rect.height)/2,0);
        drawCylinder(Rect.width/2,Rect.height);
     
    	glutSwapBuffers();
     
     
    }
    il marche bien .
    maintenant si je veux connaitre les coordonnais de la cylindre
    (x,y,z) est ce que l'en peux retrouvé ici(dans les paramètres de gltranslatef)?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     glTranslatef((2*(Rect.x)+Rect.width)/2,VIEWPORT_HEIGHT-(2*(Rect.y)+Rect.height)/2,0);
    et si je travail dans une séquence d'image (video) est ce qu'on peut plaqué chaque frame comme nous avons fait avec un seul image) . et est ce qu'on peux connaitre le x,y ,z de la cylindre je sais que le x,y on peut les trouvé facilement mais mon problème est dans le Z , et avec les angles de rotation de la cylindre autour de x, y , et z (la cylindre c'est un objet 3d) où à chaque fois la cylindre bouger(sa dépend de la mouvement de la partie qui est plaqué )
    ?

Discussions similaires

  1. Mettre deux figures l'une sur l'autre.
    Par mayssaMM dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 07/02/2014, 20h15
  2. [Swing] Empiler deux panels l'un sur l'autre
    Par Babas007 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 14/03/2011, 16h41
  3. Accéder à un objet sur une autre page
    Par AgLS01 dans le forum C++/CLI
    Réponses: 11
    Dernier message: 08/12/2006, 09h04
  4. [VB6] faire référence à un objet situé sur un autre form
    Par coyott dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/05/2006, 15h13
  5. Réponses: 5
    Dernier message: 31/10/2005, 11h58

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