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 :

opengl/glut Probleme de coordonnées souris/écran


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut opengl/glut Probleme de coordonnées souris/écran
    Bonjour à tous,
    alors j'ai vu pas mal de topic qui parlent de ce probleme, et j'ai beau avoir essayé les solutions proposées, ça ne marche toujours pas.

    En gros pour faire simple, je dessine un cube en (0,0,0)
    Lors d'un clic, jutilise un picking pour déterminer si mon cube est en dessous du curseur. Jusque là, pas de probleme.
    Seulement je veux faire un déplacement (par des translate) du cube tant que le bouton est enfoncé: le cube doit donc théoriquement "suivre" le curseur de ma souris.
    J'ai donc créé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Définition de la fonction de gestion de la souris (sur clic)
       glutMouseFunc(mouseEvent);
       // Définition de la fonction de gestion de la souris (sur déplacement lorsqu'un bouton est enfoncé)
    	glutMotionFunc(mouseMoveEvent);
    avec:

    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
     
    void mouseEvent( int button, int state, int x, int y ){
    if ( button == GLUT_LEFT_BUTTON ){
    		if(state==GLUT_DOWN){
    				px=x;
    				py=y;
    				picking(...);
    			}
    		}
    		//s'il est relaché (state==GLUT_UP)
    		else{
    				px = 0; 
    				py = 0;
    		}
    }
    void mouseMoveEvent(int x, int y){
            px = x; 
            py = y;
            deplacer_obj();
     
    }
    x représente la position du curseur lors du clic, et px la position en éplacement (respectivement avec py)
    Le probleme se pose donc dans ma fonction deplacer_obj():
    si je fait un translate de (x-px), les données ne sont pas bonne car en coordonnées souris: le cube se déplace, mais trop "vite" par rapport au curseur.

    J'ai testé la solution avec gluUnProject (http://nehe.gamedev.net/data/article...sp?article=13), et ça ne fonctionne pas du tout :/

    qulqu'un pourrait-il me venir en aide?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    petit up :$
    je n'y arrive vraiment pas. C'est si compliqué que ça de faire un grad and drop?
    Pour le moment j'ai réussi en trichant un peu avec des valeurs en dur, mais quand je zoom ou dezoom, mon objet ne suit plus très bien la souris (le zoom est un gltranslatef en z)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    probleme partiellement résolu.
    Le déplacement marche bien, mais lorsque jeffectue une rotation autour de la scene (pour me placerderrière) avec un glrotate, le déplacement d'une piece se fait dans le sens inverse :/

  4. #4
    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
    il faut que tu tiennes compte de l'angle entre toi et l'objet par rapport aux axes d'origine lorsque tu fais ton glTranslatef
    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 du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    j'y avais bien pensé, mais la rotation se fait d'un point de vue global avant l'affichage de l'objet.

    en gros j'ai une fonction d'affichage dans mon main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    drawScene(){
     
    glPushMatrix();
       glTranslatef(0,0,-zoom);
     
       glRotatef(rotationX,1,0,0);
       glRotatef(rotationY,0,1,0);
       glRotatef(rotationZ,0,0,1);
     
       objet.draw();
     glPopMatrix();
    }
    Les valeurs de transformations sont modifiées à la souris (avec touche ctrl appuyée)
    Or l'objet n'a pas connaissance des transformations appliquées dans la fcontion de dessin. En simplifiant j'ai dans l'objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    objet::draw(){
    glPushMatrix();						
    glTranslatef(deplacementX,deplacementY, 0 );
    //affichage							
    glPopMatrix();
    }
    avec deplacementX e deplacementY modifiés lors du déplacement de la souris (en utilisant les coordonnées via un gluUnProject).

    J'avoue c'est un peu crade,parce que lorsque je tourne autour de l'objet, celui ci ne suis plus le curseur de la souris (à la limite pas génant , mais plus lorsque l'on regarde derriere l'objet car les déplacemnts sont opposés)


    Donc avec ta méthode je devrais passer en parametre les valeurs actuelles des transformations? Et comment j'en dédui la bonen transformation?
    Autre chose aussi enfin ça vient du même probleme), quand je regarde la scene sur le coté, je devrai déplacer en X en fonction du déplacement Y de la souris et inversement pour y.

    Après peut être que je dois carément changer de technique en utilisant un déplacement du point de vue à la place d'une rotation de la scène, mais étant débutant je croyait que c'était la meilleure solution

    je ne sais pas si j'ai été assez clair, si au cas ou tu a besoin du code (en tout ou partie), je peux toujours le mettre.

  6. #6
    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
    et si tu regardes l'objet de profil, les déplacements à la souris ne doivent pas être bons non plus ?

    deplacementX et deplacementY sont les valeurs de déplacement de ton objet mais il manquera le Z (si x et Z sont les axes "à plat" et Y la verticale)
    le déplacement horizontal de ta souris influe sur 2 axes

    tu dois donc modifier deplacementX et un deplacementZ non seulement avec le gluUnProject mais également avec le cos et le sin de l'angle depuis lequel tu regardes ton objet

    imagine le cercle des radians, ton objet au centre et toi qui tournes autour tu te situes quelque part sur le périmètre
    si tu veux déplacer ton objet perpendiculairement à l'angle de vision, il faut recalculer l'orientation de la translation
    tu regardes le cercle comme si tu regardais ton objet d'en haut, donc suivant l'axe -Y, les 2 axes du cercle sont X et Z
    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.

Discussions similaires

  1. Coordonnées souris OpenGL
    Par goutbouyo dans le forum OpenGL
    Réponses: 3
    Dernier message: 26/11/2004, 10h27
  2. Réponses: 2
    Dernier message: 14/04/2004, 19h37
  3. syntaxe coordonné souris
    Par gaut dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 19h28
  4. OpenGL, GLut... comment?
    Par big_gie dans le forum GLUT
    Réponses: 2
    Dernier message: 16/07/2003, 11h25
  5. Configurer OpenGL/Glut avec C++Bluider
    Par MiGoN dans le forum OpenGL
    Réponses: 2
    Dernier message: 13/09/2002, 23h18

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