Partage
  • Partager sur Facebook
  • Partager sur Twitter

[OPENGL]Picking

    3 juillet 2007 à 18:01:45

    Bonjour,
    après avoir longuement cherché sur google (si si !) des tutoriaux sur le picking en opengl et les tutos trouvés n'étant pas illustrés d'exemples précis (ce qui les rendaient trop theoriques et peu approfondis, donc peu comprehensibles) je voulais savoir si vous ne connaissiez pas un tuto facile à comprendre (je lis l'anglais) avec des exemples à chaque fois...
    Merci !
    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2007 à 13:58:09

      A l'adresse suivante http://www-evasion.imag.fr/Membres/Fabrice.Neyret/doc/opengl.html#pick, j'ai trouvé ceci :

      Citation : Pas de titre

      Le picking
      Quand on réalise une application interactive, on peut souhaiter savoir ce qui se trouve sous la souris (objet ou face, voire coordonnée), par exemple pour permettre à l'utilisateur de le désigner (c'est le picking). D'une manière plus générale, on peut souhaiter avoir un retour quant à ce qui en définitive a vraiment été tracé à l'écran (ne serait-ce que pour mieux élaguer les parties non visibles de la scène). De ce point de vue, savoir ce qu'il se passe sous la souris est un cas particulier: il suffit de restreindre la fenêtre à quelques pixels (voire un seul) autour de la souris et se poser la question de ce qui s'affiche dans cette fenêtre. La librairie utilitaire GLU permet de positionner cette fenêtre d'intérêt sans modifier les autres paramètres: il suffit d'ajouter juste avant l'affichage

      GLint viewport[4];
      glGetIntegerv(GL_VIEWPORT, viewport);
      gluPickMatrix(xmouse,viewport[3]-ymouse,1.,1., viewport);

      Comme le geometric engine réalise tous les changements de repère, la projection à l'écran et le clipping, à la fin de son traitement on peut savoir tout ce qui peut apparaître à l'écran. Le picking consiste donc à interrompre le traitement du rendu à la fin de la phase 3D, juste avant que le raster engine ne génère les fragments (donc rien ne s'affiche, on a fait un tracé virtuel). On demande alors au geometric engine de fournir une liste décrivant ce qu'il y a à tracer, dans le repère de l'écran. Si un face donnée se trouve dans la liste, c'est qu'elle devrait être visible à l'écran (sauf si elle est cachée par un autre objet), et si l'on avait restreint la fenêtre à quelques pixels sous la souris, on en déduit que cette face est juste sous la souris.

      OpenGL prévoit deux modalités pour le picking selon le type d'information que l'on souhaite récupérer: le mode GL_SELECT, qui permet de savoir quel objet ou quelle face est visible, et le mode GL_FEEDBACK, qui permet d'obtenir toutes les informations disponibles sur la scène, coordonnées géométriques dans le repère écran, couleur, coordonnées textures (u,v), etc. On peut par exemple en tirer les coordonnées du point cliqué à la souris à la surface d'un objet. On active ce mode par glRenderMode(mode) (le mode de tracé normal avec affichage correspondant au mode GL_RENDER). Dans les deux cas il faut fournir un buffer où seront stockées les informations retournées par le geometric engine, avec selon le mode glSelectBuffer(size,buff) ou glFeedbackBuffer(size,GL_3D_COLOR_TEXTURE,buff).
      On accède à ce buffer après être sorti du mode picking par
      nbinfo = glRenderMode(GL_RENDER).

      # Dans le mode GL_SELECT, on regroupe les primitives qui constituent une unité logique en insérant des déclarations glPushName(i) entre leurs tracés, ce qui revient à donner un identifiant à ces unité. Le geometric engine inscrit dans le buffer l'identifiant de toute unité dont au moins une primitive se projette dans la zone de l'écran, c'est ainsi que l'on sait quel objet apparaît.

      # Dans le mode GL_FEEDBACK, chaque primitive apparaissant potentiellement à l'écran va générer une entrée dans le buffer, consistant en un identifiant du type de primitive, GL_POLYGON_TOKEN pour un polygone, suivit du nombre de sommets, puis pour chaque sommet, de tous les attributs demandé, soit pour GL_3D_COLOR_TEXTURE les coordonnées x,y,z dans le repère écran, la couleur apparente RGBA, et les coordonnées de texture u,v,s,t (dans le cas général, il y a 4 coordonnées texture). Comme la phase de clipping redécoupe les facettes qui sortent de l'écran, dans le cas d'une fenêtre de 1 pixel de large positionnée sous la souris on obtient ainsi les coordonnées, l'illumination, etc, sur le lieu de la surface situé sous la souris. NB: on peut remonter aux coordonnées dans le repère monde via la fonction gluUnproject(). (Mais cette fonction est coûteuse si l'on veut retrouver plusieurs points, car elle inverse la matrice de transformation à chaque appel. Mieux vaut alors faire soit même l'inversion de matrice pour appliquer la même transformation réciproque à tous les points.)
      A noter que l'on obtient dans ce mode un descriptif de ce qui est visible, mais pas la désignation des objets comme dans le mode GL_SELECT. On peut retrouver cette fonctionnalité en insérant des appels à glPassThrough(f) entre les primitives constituant une unité, dans le même esprit que glPushName(i). On récupère alors dans le buffer l'identifiant de primitive GL_PASS_THROUGH_TOKEN suivit de la valeur f passée en argument, ce qui permet de reconnaître l'unité à laquelle appartiennent les entrées du buffer.



      Ca peut-être un bon point de départ :D
      • Partager sur Facebook
      • Partager sur Twitter
        4 juillet 2007 à 16:39:24

        Merci beaucoup, j'ai encore du mal à bien piger :-°
        mais je vais tenter des trucs avec sur un projet vide et j'essaierais d'avancer comme ça...
        Encore merci...
        • Partager sur Facebook
        • Partager sur Twitter

        [OPENGL]Picking

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown