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 :

Mise en place d'un algorithme de color picking


Sujet :

OpenGL

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut Mise en place d'un algorithme de color picking
    Bonjour

    Suite à ma précédente discussion, je reviens pour demander quelques conseils pour la mise en place d'un color picking.
    Pour le moment, je sais attribuer à chacun de mes éléments une couleur unique. En fait, j'aurais jusqu'à 255*255*255-1 possibilités (le -1 étant mon background arbitrairement mis en noir).
    En fait, ce qui me pose problème c'est le point suivant.
    Lorsque je clique, je sais récupérer le point cliqué, aussi bien au niveau de ma fenêtre que de mon "monde" OpenGL.
    La question est: je veux que l'utilisateur voit la scène SANS voir à aucun moment la scène de color picking. En gros, je dois donc faire une copie de ce qui est vu à un instant t.
    Comment peut-on faire une copie de ce que l'on voit ?

    Merci d'avance.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    lorsque tu fais ton rendu de ton color picking, tu ne dois PAS faire de swap
    euh...tu es bien en double buffering ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    lorsque tu fais ton rendu de ton color picking, tu ne dois PAS faire de swap
    euh...tu es bien en double buffering ?
    Euh, bonne question, je vais vérifier

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bon, question à 2 centimes, comment vérifier que je suis en double tampon ?

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  5. #5
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Réponse à moi-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private GLCapabilities initGLCapabilities(){
            GLCapabilities glc = new GLCapabilities();
            glc.setDoubleBuffered(true);
            glc.setHardwareAccelerated(true);
            return glc;
        }
     
    //Far away in my code and in my mind
    getCanvasList().add(new GLCanvas(initGLCapabilities()));
     
    //Test if double buffering
    System.out.println("Double buffering: "+this.myMainWindow.getGLJPanel().getChosenGLCapabilities().getDoubleBuffered());
    //Answers: true !
    Voilà !!
    Si un JOGLien peut confirmer...

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  6. #6
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par GLDavid
    La question est: je veux que l'utilisateur voit la scène SANS voir à aucun moment la scène de color picking. En gros, je dois donc faire une copie de ce qui est vu à un instant t.
    Donc la personne récupère une couleur qui n'est pas celle qui correspond à l'écran ?

    Que souhaites tu faire à l'origine ?

    Car sinon, si tu sais picker des objets 3D, ce sont les objets 3D qui te renvoie la couleur de picking dans ta scène de pick.

  7. #7
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bonjour

    Ce que je veux:
    1) Je visualise un réseau. Chaque noeud peut avoir une couleur globale ou une couleur définie par l'utilisateur.
    2) MAIS, j'ai une table de couleur où j'attribue une couleur UNIQUE par noeud. Cette couleur ne sera pas celle visualisée à l'écran.
    3) Au moment du picking, le système doit récupérer cette couleur unique et derrière, je connaîtrais ainsi le noeud sélectionné.
    Ma question est donc, comment, lors du clic, passer d'un mode de visualisation à un autre pour faire ma sélection de couleur sans que l'utilisateur le remarque.

    J'espère avoir été plus clair dans l'énoncé du problème.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  8. #8
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Points : 172
    Points
    172
    Par défaut
    Salut
    tu est bien en double buffer la
    Pour eviter de faire le rendu sur l'ecran tu peux faire qualque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    gl.glClear(GL.GL_COLOR_BUFFER_BIT|GL.GL_DEPTH_BUFFER_BIT);
     
    //ici le code du rendu pour le picking
     
    gl.glFinish(); //pour etre sur que tout est affiché
     
    //ne pas mettre canvas.swapBuffers(); ici si non le rendu sera affiché sur l'ecran
     
    gl.glReadPixels(...); //Lecture du pixel cliqué ou autre code de picking

  9. #9
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Oki Goast
    Je vais appliquer ceci et merci de ta confirmation pour le double tampon.
    Je vais implémenter ton idée.

    @++ pour dire si ça marche
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  10. #10
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    le fait est que lorsque tu as terminé un rendu opengl, si tu fais
    tu vas échanger le buffer caché dans lequel tu as fais ton rendu avec le buffer visible qui est affiché à l'écran

    tu as donc 1 étape de rendu pour ton color picking qui ne dois pas être affichée donc pas d'appel à canvas.swapBuffers()
    et une étape de rendu "normal" suivi d'un canvas.swapBuffers() pour afficher le rendu à l'utilisateur
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  11. #11
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Oki, c'est bon à prendre Shenron.
    J'ai commencé à implémenter l'idée de goast. Mon premier test marche mais je flashe en noir (la couleur de background lors du picking justement).
    Voici le 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
     
    private void pickPoint(GL gl){
            gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
            clearBackground(gl, gl.GL_SELECT);
     
            gl.glMatrixMode(gl.GL_MODELVIEW);
            gl.glLoadIdentity();
            gl.glScalef(Math.abs(zoom), Math.abs(zoom), 1);
     
            moveCamera(gl);
     
            //displayNodesInSelectMode
     
            gl.glFinish();
     
            FloatBuffer vPixelBuffer = BufferUtil.newFloatBuffer(3);
            gl.glReadPixels(0, 0, 1, 1, GL.GL_RGB, GL.GL_FLOAT, vPixelBuffer);
            int rgb = getClickedColor(vPixelBuffer);
     
            System.out.println(rgb);
        }
    Sans doute qu'un swapBuffer doit traîner ou alors il m'en faut un quelque part.
    Je verrais cela plus tard, le temps de finir complètement l'implémentation.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  12. #12
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Points : 172
    Points
    172
    Par défaut
    Je ne suis pas sur mais il peut y avoir un ptit probleme de synchro.
    (Enfin je suis pas sur si c'est le cas )
    Puisque si t'as une boucle d'affichage normal si on clique cela appel ta methode pickPoint(...) Si par hasard cette methode est appelee au moment d'execution du rendu normal alors le gl.glClear risque d'ecraser le rendu normal ...
    Enfin je ne suis pas sur que ca soit ca, car en jogl ils ont prevu le traitement multitache mais je ne c pas exactement comment c'est gere.
    Au pire pour etre sur tu peut toujours utiliser les "synchronized"

  13. #13
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Pourquoi ne pas utiliser le pick avec un Id qui est spécialement conçue pour en OpenGL ?
    Méthode 3:
    http://glinfrench.apinc.org/article.php3?id_article=83

  14. #14
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    parceque ça ne "marche pas"
    voir le post : Limitation de la pile de noms
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  15. #15
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Points : 1 630
    Points
    1 630
    Par défaut
    Il faut absolument que quand tu fasses ça, tu sois dans le thread que le thread qui a crée le contexte OpenGL. Pour cela rien de bien compliqué :

    Lorsque tu crées ton contexte OpenGL tu fais un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Thread contextThread = System.currentThread();
    Et dans ta boucle de rendu picking tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    contextThread.equals(System.currentThread())
    Si c'est pas true c'est que y'a un soucis. Sinon c'est que c'est bon donc le problème ne vient pas de là.
    Je ne réponds à aucune question par MP, posez vos questions sur le forum adéquat.
    Profils : G+ - LinkedIn

  16. #16
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    parceque ça ne "marche pas"
    voir le post : Limitation de la pile de noms
    Oui effectivement cela serait plus compliqué au final à mettre en marche le système si on à pas les fonctions prévues pour.

    Sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clearBackground(gl, gl.GL_SELECT);
    devient totalement inutile.

  17. #17
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Ok, merci à tous notamment à TanEk. Je m'occuperais de tout ça après le week-end. Non pas à cause des 35h mais à cause d'un changement de projet ponctuel

    Merci à tous.
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  18. #18
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Points : 172
    Points
    172
    Par défaut
    il y a une chose que je ne comprend pas.
    La methode avec couleurs ne permet pas de represanter plus d'objets selectionnables...
    Une couleur = 24 bits ou 32 si on compte les alphas...
    Avec la methode avec le mode GL_SELECT on peut coder les noms en entiers 32 bits , donc pareil comme pour la methode de couleur.

    Le code dans le thread precedent il ne fesai que des pushName et jamais de pop
    Donc c'est evident qu'il y avait un Stack overflow
    si pour chaque noeud on empile son nom, on le dessine et puis on depile le nom on n'aura jamais une profondeur plus que 1 dans le stack des noms...

  19. #19
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Points : 1 630
    Points
    1 630
    Par défaut
    C'est pas faux...
    Je ne réponds à aucune question par MP, posez vos questions sur le forum adéquat.
    Profils : G+ - LinkedIn

  20. #20
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Points : 172
    Points
    172
    Par défaut
    ah et un autre inconvenient pour la methode de couleurs:
    Les drivers des cartes graphiques recentes peuvent activer les methodes anticrenelages par defaut ce qui rend flu les bords des polygones. Dans ce cas la fonction glReadPixels renvoi une couleur degradéé, du coup lors des clicks sur les bords des objets on obtient des erreurs qui rendent inutilisable le picking. (J'ai eu ce probleme avec ma HD3650). Donc a moins d'etre sur que l'utilisateur ne se sert pas d'une carte recente ou qu'il n'a pas activé l'anticrenelage il vaut mieu utiliser le mode GL_SELECT.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Mise en place d'un algorithme récursif
    Par blabliblou dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2013, 10h32
  2. [AD]Mise en place de Active Directory
    Par guiguisi dans le forum Windows Serveur
    Réponses: 9
    Dernier message: 29/07/2004, 08h50
  3. [C#] Mise en place d'un site multilingue
    Par regbegpower dans le forum ASP.NET
    Réponses: 6
    Dernier message: 19/03/2004, 19h15
  4. mise en place serveur web intranet
    Par gui4593 dans le forum Installation
    Réponses: 7
    Dernier message: 01/01/2004, 18h18
  5. Mise en place d'index....??
    Par liv dans le forum Requêtes
    Réponses: 6
    Dernier message: 18/12/2003, 11h04

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