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 :

[jogl]Déplacement d'une scène à la souris


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut [jogl]Déplacement d'une scène à la souris
    Bonjour

    J'ai mis au point un système de mouse pan avec la souris. En gros, tant que je clique, ma caméra se déplace sur les X et les Y de ma scène.
    Voici un extrait de 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
    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
     
    public void display(GLAutoDrawable arg0) {
            final GL gl = arg0.getGL();
            gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
    //other stuff
            if (firstDraw) {
                this.mustCenter = true;
                this.firstDraw = false;
            } else if (mustCenter) {
                setWrap();
                wrap.setCenter();
                qX = startX - wrap.centerX;
                qY = startY - wrap.centerY;
                x_f = y_f = 0;
                mustCenter = false;
                last_x = qX + x_f;
                last_y = qY + y_f;
            } else {
    //travelling with mouse
                if(travelling){
                    if(this.movePoint!=null){
                        lastx = this.movePoint.getX();
                        lasty = this.movePoint.getY();
                        double[]wcoord = Utils.convertIntoGL(gl, lastx, lasty);
                        last_x = (float)wcoord[0];
                        last_y = (float)-wcoord[1];
                    }
                }
    //travelling with keyboard
                else{
                    last_x+=x_f;
                    last_y+=y_f;
                    x_f = y_f = 0;
                }
            }
     
            gl.glTranslatef(last_x, last_y, 0);
     
    //drawing a marvellous scene
    }
     
        public void mouseDragged(MouseEvent arg0) {
            if (picking) {
                if (arg0.getButton() == 0) {
                    this.point = arg0.getPoint();
                    this.mouse_state = this.PICKED;
                }
            } else if (travelling) {
                movePoint = arg0.getPoint();
            }
        }
    Or, mon problème est que si je déplace une fois avec la souris, OK, tout va bien. Mais je reclique, je me rend à nouveau au centre de ma scène.
    Comment résoudre ce problème ?
    Merci d'avance de votre aide.

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

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

  2. #2
    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,

    il faut que tu resettes last_x et last_y quand tu NE FAIS PAS de mouvement. Si tu ne le fais pas ton prochain clic utilisera les "vieilles" valeurs encore sauvegardées.

    Par exemple chez moi ca ressemble à ca (désolé je ne fais pas de jogl mais tu devrais t'y retrouver) (HandleMouse est appelée à chaque fois que la souris bouge)

    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
     
    public bool HandleMouse(Point pt)
       {
                // If the "Control" key is pressed, we are in 'movement mode' in our OpenGL 
                // window
                if (m_key_CTRL)
                {                
                    // Right mouse button triggers the scene's translation
                    // ---------------------------------------------------
                    else if (m_mouseButtons[2])
                    {
                        if (m_mousePos[0] != -1)
                        {
                            axAxGL_EmptyWin1.IncrementTranslation(0, (pt.X - m_mousePos[0])*0.15f);
                            axAxGL_EmptyWin1.IncrementTranslation(1, -(pt.Y - m_mousePos[1])*0.15f);
                        }
                        m_mousePos[0] = pt.X;
                        m_mousePos[1] = pt.Y;
                        return true;
                    }                
                    // If no mouse button was pressed, reset the mouse position
                    else
                        m_mousePos[0] = m_mousePos[1] = - 1;
                }
                // If the "Control" key wasn't pressed, reset the mouse position
                else
                    m_mousePos[0] = m_mousePos[1] = -1;
     
                return false;
            }

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Bonjour ShevchenKik

    Je te remercie de ta réponse mais je reconnais être un peu perdu.
    J'ai une méthode implémentée pour le release de la souris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public void mouseReleased(MouseEvent arg0) {
            this.point = null;
            this.mouse_state = this.RELEASED;
            this.selected = -1;
            this.node_modified = false;
            this.rebuildList = true;
            this.i_neighbors = null;
            this.lastMovePoint = arg0.getPoint();
            this.movePoint = null;
        }
    Mais, le problème est toujours là. De même, si dans cette méthode je met last_x et last_y à 0, ma scène revient au départ bien évidemment
    Bref, je ne vois pas comment je peux m'en sortir.

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

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

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    logiquement, ta scène est centrée sur un certain point qu'on appellera C(x,y)

    lorsque tu actives le mode pan, tu dois ajouter à Cx et Cy les mouvements P(x,y) de ton clavier ou de ta souris

    lorsque tu désactives le mode pan, ta coordonnée C n'est plus la même que le C avant le mode pan

    si tu réactives le mode pan, tu dois repartir de ces mêmes valeurs modifiées
    et non pas repartir des valeurs initiales

    si j'ai le temps, je regarderai ton code pour être plus concret à ce sujet
    mais de la façon dont je le ferai n'est peut-etre pas commune à celle que tu as utilisé
    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.

  5. #5
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Merci Shenron de ta réponse.
    Je vais tenter de mon côté également.
    Peut être qu'à deux la solution viendra
    Encore merci de ta proposition.

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

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

  6. #6
    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
    Ok, d'après ce que j'ai compris, tu as MovePoint qui contient les coordonées actuelles de ta souris, et lastMovePoint celles à l'instant précédent.


    essaie de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(travelling){
                    if(this.movePoint!=null){
                        lastx = this.movePoint.getX();
                        lasty = this.movePoint.getY();
                        double[]wcoord = Utils.convertIntoGL(gl, lastx, lasty);
                        last_x = (float)wcoord[0];
                        last_y = (float)-wcoord[1];
                    }
                }
    par
    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
     
    if(travelling)
    {
        if(this.lastMovePoint.getX()!=-1)
       {
           deltaX =  this.movePoint.getX() - lastMovePoint.getX();
           deltaY =  this.movePoint.getY() - lastMovePoint.getY();
     
           double[]wcoord = Utils.convertIntoGL(gl, deltaX , deltaY );
           last_x = (float)wcoord[0];
           last_y = (float)-wcoord[1];
        }
        lastMovePoint.SetX(movePoint.getX());
        lastMovePoint.SetY(movePoint.getY());
    }
    else
    {
    lastMovePoint.SetX(-1);
        lastMovePoint.SetY(-1);
     
    }

  7. #7
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Salut ShevchenKik

    J'essaie d'adapter ton code, mais je pense que c'est incomplet ou alors, j'ai mal compris:
    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
     
    if(travelling){
                    if(this.movePoint!=null && lastMovePoint==null){
                        lastx = this.movePoint.getX();
                        lasty = this.movePoint.getY();
                        double[]wcoord = Utils.convertIntoGL(gl, lastx, lasty);
                        last_x = (float)wcoord[0];
                        last_y = (float)-wcoord[1];
                    }
                    else if(this.movePoint!=null && lastMovePoint!=null){
                       double deltaX =  this.movePoint.getX() - lastMovePoint.getX();
                       double deltaY =  this.movePoint.getY() - lastMovePoint.getY();
                       double[]wcoord = Utils.convertIntoGL(gl, deltaX , deltaY );
                       last_x = (float)wcoord[0];
                       last_y = (float)-wcoord[1];
                       lastMovePoint = movePoint;
                    }
                }
    Le résultat est pas fameux. Au release de la souris ma scène est à l'origine (en 0, 0) !
    J'ai pas dû comprendre quelque chose
    Merci encore de ta réponse.
    Autre chose, dans ma version précédente lastMovePoint n'était initialisé qu'au release de la souris.

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

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

  8. #8
    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,

    je dois t'avouer être un peu perdu moi aussi.....

    1 - tout d'abord, tu effectues tes calculs de déplacement de la souris dans ta fonction display. Je ne sais pas si c'est spécifique à Jogl, mais que ce soit en Win32, GLUT ou autres, je n'ai jamais vu ca: normalement il y a une fonction "callback" appelée à chaque fois que ta souris bouge. Le problème de ton approche, c'est par exemple que si ta souris a eu le temps de faire un aller-retour entre deux frames, tu ne verras pas de mouvement. Mais bon comme dit c'est peut être spécifique à Jogl et dans ce cas je n'ai rien dit

    2 - l'exemple que je donnais hier c'est justement cette fonction, j'avais pas fait gaffe que tu faisais tes calculs dans ton display, donc le code n'est pas adapté....

    Essaie de voir si en Jogl tu as moyen d'utiliser une callback pour ta souris. Si oui ca devrait aider pas mal

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

Discussions similaires

  1. Déplacement d'une DIV avec la souris
    Par PtitGénie dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/02/2009, 11h35
  2. Réponses: 14
    Dernier message: 21/01/2009, 17h45
  3. Réponses: 5
    Dernier message: 01/07/2008, 03h12
  4. Programmation de déplacement d'une souris
    Par greenday152 dans le forum Windows
    Réponses: 5
    Dernier message: 09/10/2007, 21h26
  5. Déplacement / zoom dans une scène
    Par foruma dans le forum Flash
    Réponses: 4
    Dernier message: 15/11/2006, 10h57

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