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 :

Slider OpenGl (avec Glut)


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 23
    Par défaut Slider OpenGl (avec Glut)
    Salut les développeurs

    J'aimerais créer un slider (overlay) sur une fenêtre qui m'affiche de la 3D; est-ce possible ?

  2. #2
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Peux tu préciser un peu plus ce que tu cherches à faire ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 23
    Par défaut Combiner Rendu 3D et ortho2D
    Oui, c'est pas clair tout ça

    ...il s'agit de pouvoir créer des éléments tels qu'un
    slider et des boutons en 2D (projection ortho) sur un rendu
    3D. Autrement dit, j'aimerais pouvoir modifier dynamiquement les propriétés des objets 3D d'une scène via ces éléments graphiques..


    Alors, voilà j'ai trouvé une partie de ma réponse ici...

    Par contre j'ai du m'y prendre à l'envers, c-à-d rendre d'abord mon objet 2D avant de rendre la 3D, car ça interférait avec une fonction glutMotionFunc(MotionCallback) ds laquelle je détecte le survol d'un objets 3D. Enfin, je sais pas si c'est une bonne chose mais de cette manière j'obtiens mes 2 rendus, même si mon obj 2D perd sa transparence.
    Un bout du code épuré, pour donner une idée:

    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
    void RenderCallback()
    {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	updateOVERLAY();
    	updateCAMERA();
    	RenderScene();
    }
     
    void updateOVERLAY()
    {
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, (float)glutGet(GLUT_WINDOW_WIDTH), 0, (float)glutGet(GLUT_WINDOW_HEIGHT) );
    glMatrixMode(GL_MODELVIEW);
    //--- 
    glPushMatrix();
    drawOverTEXTURE();
    glPopMatrix();
    }
     
     
    void drawOverTEXTURE()
    {
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glColor4f(0.0f, 1.0f, 0.0f, 0.6f);
    glRectf(50.0f, 150.0f, 150.0f, 50.0f);
     glFlush();
    }
    Donc, à priori j'affiche correctement mon futur boutton...Euh, d'ailleurs pour le rendre interactif, faut-il que je crée moi-même une fonction qui compare la position de la souris à celle des points qui définissent sa forme ou bien il existe une fonction Glut qui le fait ?

  4. #4
    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
    Salut,

    Euh, d'ailleurs pour le rendre interactif, faut-il que je crée moi-même une fonction qui compare la position de la souris à celle des points qui définissent sa forme ou bien il existe une fonction Glut qui le fait ?
    Non pas besoin de l'ecrire toi même, il faut utiliser une fonctionnalité d'openGL appelée le picking. En gros tu assigne une ID a chaque "objet" (un ou plusieurs polygônes, en fonction de ce que tu veux faire), tu passes en mode "feedback" et quand tu cliques quelque part openGL te retourne quelles IDs se trouvent sous le curseur.

    C'est très utile pour selectionner des objets de ta scene 3D par exemple, mais honnêtement si ton but n'est pas de créer une interface, tu aurais plus vite fait d'en utiliser une toute faite.

    Par exemple:
    http://en.wikipedia.org/wiki/OpenGL_...erface_Library
    mais il y en a des tas d'autres!

    Bref à toi de voir

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 23
    Par défaut
    si ton but n'est pas de créer une interface
    Oui et non, car lors d'une naviguation ds la scene, j'aurais besoin d'une fenêtre dégagée, mais pour la modification de ses props d'un objet j'aimerais bien pouvoir afficher une interface faite d'icones dont certain pourrait eventuellement se positionner par rapport à l'objet 3D sélectionné...

    Enfin, tu as ss doute raison, autant commencer par du tout fait avant de bien pouvoir fabriquer le sien

    Merci beaucoup

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 23
    Par défaut Problème avec les Names
    Salut,

    Finalement j'ai fabriqué mon propre slider
    mais je rencontre un problème avec les Names lors de la création d'une série d’objets.
    Chaque Slider à un ID (int), issue d’une Structure, utilisée par glLoadName ou glPushName , lors du dessin… Avec glLoadName() j’obtiens les hits mais on ne trouve pas l’objet par rapport à son ID (de sa structure), tandis qu’avec glPushName(), pas de problème. Sauf que cela ne fonctionne qu’une seule fois. Si je clique sur un autre objet l’ID détecté reste le même, pire, tout mes slider finissent par avoir le même nom…

    Voilà, j’ai du loupé quelque chose dans le Picking, mais peut être que mon code sera plus explicite :

    // STRUCTURE DU SLIDER
    //--- SLIDER

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    struct Sldr_o
    {
    	GLuint id;
    	string name;
    	int W;
    	int H;
    	int min ;
    	int max;
    	int X;
    	int Y;
    	int X0;
    	int Y0;
    };
     
    //------------------------------------------------------------------------------------
     
    void RenderCallback()
    {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	drawSLIDERS ();
    }
    // ------------------------------------------------------------------------------------
    void MotionCallback(int x, int y)
    {
    	int dx = mx - x;
    	int dy = my - y;
    	if( gSelectedSLIDER ) gSelectedSLIDER->slide(dx, dy);
    }
     
    //------------------------------------------------------------------------------------
    void drawSLIDERS(GLenum mode, GLint a)
    {	
    	int t1 = sldr_A.size();
    	if( t1 != 0)
    	{
    		for (int i = 0; i < t1; i++) 
    		{
    			Slider *m = sldr_A[ i ];		
    			//glLoadName(m->_o_->id);
    			glPushName(m->_o_->id);
    			m->draw(mode, 1);
    			glPopName();
    		}
    	}
     
     
    }
     
    //------------------------------------------------------------------------------------
    void pick(int button, int state, int x, int y)
    {
      GLuint selectBuf[BUFSIZE];
       GLint viewport[4];
     
       if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN)
          return;
     
       glGetIntegerv (GL_VIEWPORT, viewport);
     
       glSelectBuffer (BUFSIZE, selectBuf);
       (void) glRenderMode (GL_SELECT);
     
       glMatrixMode (GL_PROJECTION);
       glPushMatrix ();
       glLoadIdentity ();
     
       gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y), 5.0, 5.0, viewport);
       int w = 50.0f;
    gluOrtho2D (0, (float)glutGet(GLUT_WINDOW_WIDTH), 0, (float)glutGet(GLUT_WINDOW_HEIGHT));// -2.0, 2.0, -2.0, 2.0);
     
     
    //----------------------------------------------------------
     
       drawSLIDERS (GL_SELECT, pHIT);
     
       //----------------------------------------------------------
     
       glPopMatrix ();
       glFlush ();
     
       GLint hits  = glRenderMode (GL_RENDER);
       processHits (hits, selectBuf);
    }
    //---------------------------------------------------------
    void processHits (GLint hits, GLuint buffer[])
    {
    	 unsigned int i, j;
       GLuint ii, jj, names, *ptr;
     
       pHIT = hits;
       printf ("{processHits} hits = %d\n", hits);
       ptr = (GLuint *) buffer; 
     
     //--- HIT loop
       for (i = 0; i < hits; i++) 
       {	
          names = *ptr;
    	  ptr+=3;
     
    //---  NAME loop
    for (j = 0; j < names; j++)
     { 
     
    cerr <<"{processHits} names %d " << *ptr << endl;
     
     
     //--- CHECK SLIDERS
    gSelectedSLIDER = getSLIDER( NULL, *ptr );
    if( gSelectedSLIDER )
    {
     cerr << j << "{ProcessHITS}- ptr: " << *ptr << " / FOUND id: " << gSelectedSLIDER->_o_->id << endl;
    }
    else
    {
    cerr << j << "{ProcessHITS} ptr: " << *ptr << " /  NOT FOUND !"<< endl;
     
             ptr++;
          }
     
          printf ("\n");
       }
    }

Discussions similaires

  1. Impossible d'appliquer une texture avec Glut et Opengl
    Par akrogames dans le forum OpenGL
    Réponses: 5
    Dernier message: 29/10/2010, 10h20
  2. [OpenGL]Compilation avec GLUT
    Par saad.hessane dans le forum OpenGL
    Réponses: 1
    Dernier message: 11/10/2009, 22h56
  3. Utilisation de Glut et OpenGL avec DevCpp
    Par Invité dans le forum OpenGL
    Réponses: 8
    Dernier message: 04/12/2008, 10h55
  4. Gros pb de débutant sous opengl avec glut
    Par mozillo3625 dans le forum Dev-C++
    Réponses: 2
    Dernier message: 06/12/2007, 14h21
  5. Problème de profondeur avec OpenGL et GLUT
    Par brotelle dans le forum GLUT
    Réponses: 3
    Dernier message: 12/03/2006, 14h47

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