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 :

Réalisation d'une sélection type lasso


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de LaDeveloppeuse
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut Réalisation d'une sélection type lasso
    Bonjour à tous !

    Voila je doit réaliser une petit programme pour mettre en oeuvre la sélection de type lasso en openGL. Après une recherche soutenu sur google je n'ai pas trouver grand chose a ce sujet.
    Jusqu'à ce jour, mon petit programme affiche deux objets 3D (une sphère et la fameuse théière) et elle donne la possibilité de tracer une forme fermée a l'aide de la souris. Donc en gros, je suis parvenu à tracer le lasso. Maintenant reste à déterminer quel objet sont entourés partiellement ou entièrement par celui-ci pour les sélectionner.

    Ne connaissant rien sur le sujet, est-ce que vous pourriez m'expliquer comment déterminer les objets entourés partiellement ou entièrement par le lasso. Et comment procéder ?

    Je vous remercie d'avance !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut,

    ton lasso est définie par un set de point sur l'écran. Tes points doivent etre défini dans le même reprère 3D que els objets.

    La premiere chose a faire est de faire un test pour savoir si les boites englobantes des objets sont contenues dans le carré englobant du lasso. C'est un test de frustum classique. Ca fait déja un premier filtre.

    Ensuite je vois 2 méthodes qui se complètent :

    La première consiste a effectuer un lancer de rayon pour chaque point du lasso ayant pour vecteur (point i du lasso - position de la camera) et de tester l'intersection avec les faces, des qu'une intersection est detectée, ca suffit pour savoir que l'objet entre dans la selection. le problème c'est qu'en fonction de la résolution de ton lasso, un objet peut très bien rentré dans la zone en passant entre 2 points, dans ce cas c'est plutot de l'intersection face/face qu'il faut faire.
    Cette méthode te permet de repérer tous les objets qui intersecte avec le lasso mais pas les objets entièrement contenu dans le lasso.

    C'est la que la méthode 2 intervient : Plutot que de tester si des faces intersecte avec le lasso, on va tester si les points sont contenu dans le lasso. Pour ca il faut tester chaque sommet avec chaque plan formé par 2 points contigue du lasso et la position de la caméra dans l'espace 3D. Si pour chaque plan, le produit scalaire entre la normal du plan i et le vecteur (sommet a tester - point arbitraire sur le plan (position de la camera par exemple) est de même signe, le somme et contenu dans la selection, on peut donc affirmer que l'objet entre dans la selection. Cette méthode ne fonctionne pas dans le cas ou aucun somme de l'objet n'est contenu dans le lasso (l'objet est très grand par rapport a la selection)

    Donc utiliser les 2 méthodes permet de tester toutes les possibilités. Ca peut paraitre lourd, mais en affinant les tests en plusieurs passes et en faisant des early outs, ca se fera bien.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  3. #3
    Membre confirmé Avatar de LaDeveloppeuse
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut
    Citation Envoyé par Frifron Voir le message
    Salut,

    ton lasso est définie par un set de point sur l'écran. Tes points doivent etre défini dans le même reprère 3D que els objets.

    La premiere chose a faire est de faire un test pour savoir si les boites englobantes des objets sont contenues dans le carré englobant du lasso. C'est un test de frustum classique. Ca fait déja un premier filtre.

    Ensuite je vois 2 méthodes qui se complètent :

    La première consiste a effectuer un lancer de rayon pour chaque point du lasso ayant pour vecteur (point i du lasso - position de la camera) et de tester l'intersection avec les faces, des qu'une intersection est detectée, ca suffit pour savoir que l'objet entre dans la selection. le problème c'est qu'en fonction de la résolution de ton lasso, un objet peut très bien rentré dans la zone en passant entre 2 points, dans ce cas c'est plutot de l'intersection face/face qu'il faut faire.
    Cette méthode te permet de repérer tous les objets qui intersecte avec le lasso mais pas les objets entièrement contenu dans le lasso.

    C'est la que la méthode 2 intervient : Plutot que de tester si des faces intersecte avec le lasso, on va tester si les points sont contenu dans le lasso. Pour ca il faut tester chaque sommet avec chaque plan formé par 2 points contigue du lasso et la position de la caméra dans l'espace 3D. Si pour chaque plan, le produit scalaire entre la normal du plan i et le vecteur (sommet a tester - point arbitraire sur le plan (position de la camera par exemple) est de même signe, le somme et contenu dans la selection, on peut donc affirmer que l'objet entre dans la selection. Cette méthode ne fonctionne pas dans le cas ou aucun somme de l'objet n'est contenu dans le lasso (l'objet est très grand par rapport a la selection)

    Donc utiliser les 2 méthodes permet de tester toutes les possibilités. Ca peut paraitre lourd, mais en affinant les tests en plusieurs passes et en faisant des early outs, ca se fera bien.
    Waw ! c'est assez simpas tout ca !!
    J'ai tout compris de la première méthode que j'avais déjà étudier mais pas mis en place. Par contre j'ai pas trop saisie ta deuxième méthode



    Donc par exemple:
    - O étant la position de l'œil,
    - P est un plan formé par trois points (O, et deux points contigu sur le lasso)
    - V est la normal a ce plan,
    - U est un vecteur entre O et le point A du cube


    le produit scalaire entre la normal du plan i et le vecteur (sommet a tester - point arbitraire sur le plan (position de la camera par exemple) est de même signe
    le produit scalaire du vecteur V et U est de même signe que quoi ?

    Et si il est de même signe que ce quelque chose ca veux dire que le sommet A est compris dans la sélection ?

    PS : sinon c'est quoi un early outs ?? lol

    Merci a toi de te pencher sur mon problème

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Ton schéma représente exactement le truc. Mais en fait ma deuxième méthode ne va fonctionner que si ton lasso est convexe.

    En gros tu as calculé la normale pour chaque plan tel que défini sur ton schéma. Toutes les normales étant evidemment orientées dans le même sens (mettons vers l'interieur du lasso).

    Le produit scalaire t'indique en fait de quel coté du plan se trouve ton point. Dans ton cas s'il est positif (en supposant les normales orientées vers l'interieur), le point A est du bon coté du plan (donc potentiellement a l'interieur du lasso). S'il est négatif, il n'est pas du bon coté du plan et donc tu peux passer au point suivant (c'est ca un early out, essayer de s"extraire d'un algo le plus tot possible). Donc si tous les produits scalaires sont positifs, le sommet se trouve a l'interieur du lasso.

    Maintenant ca ne fonctionne qu'avec des lassos convexes. Si ce n'est pas le cas, il faut décomposer ton lasso en plusieurs sous lasso convexes.

    Est ce que c'est plus clair ?
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  5. #5
    Membre confirmé Avatar de LaDeveloppeuse
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut
    Citation Envoyé par Frifron Voir le message
    Ton schéma représente exactement le truc. Mais en fait ma deuxième méthode ne va fonctionner que si ton lasso est convexe.

    En gros tu as calculé la normale pour chaque plan tel que défini sur ton schéma. Toutes les normales étant evidemment orientées dans le même sens (mettons vers l'interieur du lasso).

    Le produit scalaire t'indique en fait de quel coté du plan se trouve ton point. Dans ton cas s'il est positif (en supposant les normales orientées vers l'interieur), le point A est du bon coté du plan (donc potentiellement a l'interieur du lasso). S'il est négatif, il n'est pas du bon coté du plan et donc tu peux passer au point suivant (c'est ca un early out, essayer de s"extraire d'un algo le plus tot possible). Donc si tous les produits scalaires sont positifs, le sommet se trouve a l'interieur du lasso.

    Maintenant ca ne fonctionne qu'avec des lassos convexes. Si ce n'est pas le cas, il faut décomposer ton lasso en plusieurs sous lasso convexes.

    Est ce que c'est plus clair ?


    On ne peut plus clair ! Tu ferai un excellent professeur

    Je te remercie beaucoup ! je vais mettre cette théorie en place et je te tiens au courant

    A bientôt Frifron !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ZF 1.11] Comment réaliser une sélection dans un affichage
    Par Paul75 dans le forum MVC
    Réponses: 0
    Dernier message: 14/04/2011, 15h33
  2. Réponses: 2
    Dernier message: 20/11/2009, 22h19
  3. Programme qu'Excel réalise une sélection
    Par sylv123123 dans le forum Excel
    Réponses: 7
    Dernier message: 28/06/2007, 16h24
  4. Réaliser une sélection MP3
    Par la_praline dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 12/03/2007, 22h13
  5. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47

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