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 :

Sélection des points avec OpenGl


Sujet :

OpenGL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2008
    Messages : 354
    Points : 139
    Points
    139
    Par défaut Sélection des points avec OpenGl
    Bonjour,
    J'ai développé une application en utilisant OpenGl et VS 2010. Cette application permet d'afficher un ensemble des points. Maintenant je veux sélectionner quelques points de ces points affichés et je veux afficher ses coordonnées. Je suis débutante en openGl et j'ai cherché dans le net mais J'ai pas trouvé une chose qui peut m'aider.
    Est ce que vous pouvez me précisez un tutorial ou bien un lien qui peut m'aider
    J'utilise une carte graphique normale (n'est pas une carte NVIDIA).
    De plus le projet est un projet Win32.

    Merci

  2. #2
    Expert éminent

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

    Citation Envoyé par moooona Voir le message
    Je suis débutante en openGl et j'ai cherché dans le net mais J'ai pas trouvé une chose qui peut m'aider.
    Cherche à "picking". Si tu ne trouves rien, change de moteur de recherche!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Salut,

    C'est plus un problème de géométrie que d'OpenGL. En gros, il faut que tu stock les coordonnée de tes points (dans un tableau ou autre), et que tu cherche à la main les points proche de ton point cliqué.

    Après il existe de nombreuse techniques (comme l'a dit plegat, tu en trouvera rapidement) plus ou moins complexes. Le plus simple étant le brut force:
    Pour chaque point 
      si distance(point, point_cliqué) < tolérance
        garder(point)
    
    Cette technique marche bien pour quelques dizaines/centaines de points. Après, ça commence à ramer
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par pyros Voir le message
    Cette technique marche bien pour quelques dizaines/centaines de points. Après, ça commence à ramer
    Euh ? j'espère que c'est un peu une exagération.
    Je dois dire que la méthode décrite est juste (pour peu que l'on retrouve le rayon sous le curseur de la souris avec gluUnProject), mais que ce soit lent pour une centaine de points, je doute (nos machines sont puissantes).
    Après, je ne dis pas que pour 1 000 000 de points, ça peinera un peu et qu'il faudra un algorithme de partionnement de l'espace (Quad Tree / OctTree / et autres)
    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 éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Plutôt que de se faire chier a recalculer la position de chaque point en espace écran du coté cpu (alors qu'opengl l'a déjà fait), je conseillerai de faire un rendu dans 2 textures (une petite recherche sur les Multiple Render Target pourrait aider). La première stocke le rendu 'normal', donc juste les points avec leur couleur et tout. La deuxième dessine les points avec une couleur unique qui les identifie (en regroupant les 4 canaux couleurs en un seul gros entier). Ensuite, on récupère la texture et on regarde ce qu'il y a sous la souris. Étant donné que le nombre de points est assez élevé, ça me semble être la solution la plus logique. Surtout qu'a part le transfert de la texture vers le cpu, ça coute quasi rien.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Oui, quelques dizaines/centaine c'est un peu faible (enfin, ça dépend aussi sous quel forme sont stocké les points). Mais, si il sont en (x, y, z) dans le même espace, on peut aller facile à plusieurs milliers avant de sentir un ralentissement (sur un mouseMove par exemple). Et encore, par ralentissement, j'entends que la souris commencera légèrement à saccader.

    Sinon la réponse de math_lab fonctionne aussi, mais je répondrai que plutôt que de se faire chier à faire du rendu offScreen, il est plus simple de passer les point en coordonnée écran coté cpu
    Cette technique est efficace lorsque l'on souhaite cliquer sur une forme complexe (un perso dans un FPS par exemple), ça évite de faire du ray-tracing sur les triangles du mesh. De plus, on peut encoder l'"ID" de l'objet dans la couleur, ça permet de savoir sur quoi on a cliqué, mais pour sélectionner juste des points, elle s'avère un peu disproportionnée. D'autant plus que moooona fait ses premier pas en OpenGL, alors faut pas trop l'effrayer avec ce genre de technique barbare
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  7. #7
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Citation Envoyé par math_lab Voir le message
    Plutôt que de se faire chier a recalculer la position de chaque point en espace écran du coté cpu (alors qu'opengl l'a déjà fait), je conseillerai de faire un rendu dans 2 textures (une petite recherche sur les Multiple Render Target pourrait aider). La première stocke le rendu 'normal', donc juste les points avec leur couleur et tout. La deuxième dessine les points avec une couleur unique qui les identifie (en regroupant les 4 canaux couleurs en un seul gros entier). Ensuite, on récupère la texture et on regarde ce qu'il y a sous la souris. Étant donné que le nombre de points est assez élevé, ça me semble être la solution la plus logique. Surtout qu'a part le transfert de la texture vers le cpu, ça coute quasi rien.
    Il me semble que moooona a dit qu'elle était débutante et tu voudrais qu'elle se mette direct au MRT >< tiéfou

    Moi je te conseil de faire la technique décrite par pyros. Je vais tenter de te la détailler :
    Tu stocke la position de tous tes points dans un tableau, et tu les parcours pour savoir s'ils sont sélectionnés.
    Pour cela il faut que tu décrivent un peu plus le contexte, tu veux pouvoir les sélectionner simplement en cliquant dessus, ou en faisant un rectangle de sélection ou en dessinant une forme quelconque qui devra sélectionner tous les points qui sont à l'intérieur ?

    Dans le premier cas il faut que tu extraits la droite de ton espace 3D issue du clique de la souris en utilisant gluUnproject. Puis tu dois déterminer si le point parcourus est à l'intérieur d'un cylindre dont l'axe principal est la droite calculée précédemment et dont le rayon dépend de la distance maximale autorisée entre la droite et le point (ça c'est un paramètre que tu fixes, en gros ça veut dire si mon point est à une distance X de ma droite est-ce qu'on le considère comme sélectionné ou bien est-il trop loin).

    Dans le deuxième cas tu dois déterminé les 4 droites qui passent chacune par un sommet du rectangle de selection et passant par ta camera (avec gluUnproject là aussi). En regroupant ces droites 2 à 2 selon l'adjacence tu obtiendras les plans 3D qui déterminent une pyramide de sélection (la base étant ton rectangle de sélection, et le sommet de la pyramide et ta caméra, ton point oeil). Tu n'auras plus qu'à déterminer si ton point est dans cette pyramide ou non. S'il est dedans il est sélectionné, sinon non.
    Une autre façon de faire est de projeter ton point sur l'écran (gluProject) et de vérifier si ton point est dans le rectangle de sélection (ce qui est bien plus simple à développer et moins matheux ).

    Dans le troisième cas si t'as forme de sélection est quelconque (sélection au lasso), tu peux t'inspirer de la technique précédente, tu calculs les plans qui déterminent ton volume de sélection ou tu projette.


    Dans tous les cas si tu n'as pas beaucoup de points (- de 10000) tu peux faire du brute force (parcourir tous les points). Mais si tu en as plus il faudra mettre en place une structure accélératrice (une grille sera très bien) mais nous en reparlerons plus tard quand tu auras réussi à faire la sélection

Discussions similaires

  1. Impossible de relier des points avec plot
    Par Sylver52 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 28/05/2009, 08h21
  2. Requête sélection des enregistrements avec une '
    Par Vodjedi dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/04/2009, 16h57
  3. Afficher des cylindres avec OpenGL
    Par PetitProgJava dans le forum OpenGL
    Réponses: 3
    Dernier message: 10/01/2009, 02h14
  4. Dessiner des points avec PyQt
    Par Naoli dans le forum PyQt
    Réponses: 1
    Dernier message: 15/01/2008, 18h38
  5. pb relier des points avec la SDL en C
    Par rafale001 dans le forum SDL
    Réponses: 1
    Dernier message: 25/02/2007, 15h42

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