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 :

gluUnProject ? Picking - Drag


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut gluUnProject ? Picking - Drag
    Bonjour a tous,

    J'essaye de faire du drag'n'drop de points opengl. (Je me suis mis a opengl depuis qq semaines seulement : je rame!)
    Pour l'instant j'arrive a récupérer mon point grâce a gluPickMatrix.
    Le problème, c'est le déplacement. Pour ca, il faut que je retrouve les coordonnées opengl a partir des coordonnes de la souris dans la fenêtre.
    Et c'est la qu'est mon problème!

    J'ai essaye avec gluUnProject (avec et sans glReadPixel), mais sans succes. Voici comment j'utilise glUnProject :
    gluUnProject( sourisX, sourisY, lePointQueJeDeplaceZ, modelview, projection, viewport, &posX, &posY, &posZ);

    J'aimerais avoir en retour un point qui a conserve sa valeur z, mais qui s'est juste deplacer selon x et y.
    Seulement, actuellement cela me retourne un Z different.

    Voila, je ne sais pas si je suis bien clair, mais j'ai fait de mon mieux.

    Voici mon 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
     
    Point3D* Toto::GetOGLPos(int x, int y, float z) {
    	GLint viewport[4];
    	GLdouble modelview[16];
    	GLdouble projection[16];
    	GLfloat winX, winY, winZ;
    	GLdouble posX, posY, posZ;
     
    	glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    	glGetDoublev( GL_PROJECTION_MATRIX, projection );
    	glGetIntegerv( GL_VIEWPORT, viewport );
     
    	winX = (float)x;
    	winY = (float)viewport[3] - (float)y;
     
            // NOTE : Je pensais a un probleme de perspective, j'ai donc ajoute mon gluPerspective ici, mais sans succes. Idem pour gluLookAt.
     
    	//glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
     
     
     
    	gluUnProject( winX, winY, z, modelview, projection, viewport, &posX, &posY, &posZ);
     
     
     
    	return new Point3D(posX, posY, posZ);
    }
    Je m'y prends mal visiblement : Pourquoi?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    En fait, je vais poser une question plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluUnProject( winX, winY, z, modelview, projection, viewport, &posX, &posY, &posZ);

    => posZ ne devrait-il pas avoir la valeur de z ????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluUnProject( winX, winY, 0, modelview, projection, viewport, &posX, &posY, &posZ);
    devrait retourner les coordonnees openGL a profondeur minimale et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluUnProject( winX, winY, 1, modelview, projection, viewport, &posX, &posY, &posZ);
    devrait retourner les coordonnees openGL a profondeur maximale.

    Right ?

  3. #3
    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 vais laisser à d'autres le soin de répondre à tes questions sur gluProject / UnProject, que j'ai jusque là assez peu utilisées, mais je voulais te demander:

    pourquoi ne pas passer par le gestionnaire d'évênement associé à ton programme? Je veux dire, que ce soit avec glut, MFC, QT, etc... tu as des fonctions appelées quand tu presses une touche, clique, bouge la souris....et par exemple dans ce dernier cas tu recupères très facilement la position X-Y de ta souris.

    Pour moi c'est la manière "standard" de faire bouger ta scene ou tes objets, pas en passant par gluUnproject, qui à priori sert à d'autres choses (MAIS je peux bien sûr me tromper....)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    Salut ShevchenKik,

    Merci pour ta réponse! J'utilise GLUT, et j'utilise les fonctions de callback pour clavier, souris.

    Le problème n'est pas d'avoir les coordonnées de la souris sur la fenêtre, mais les coordonnées openGL qui sont derrière.

    En gros, si je clique en 100x100, et que je veux mettre un point a cet endroit, je ne peux pas faire un glVertex3f(100,100,0)...

    Et c'est a ca que sert la fonction gluUnProject. Tu lui donne en paramètre les matrices et les coordonnées de la souris, et normalement la fonction te renvoie les coordonnées openGL a la profondeur que tu souhaites.
    Sauf que pour moi, beh ça ne marche pas

  5. #5
    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
    Re,

    ok, désolé j'avais pas tout a fait compris ton problème comme ca, je ne voyais pas où tu avais besoin d'utiliser gluunproject.

    Bref, regarde là (déjà posté par plein de gens sur le forum, les questions sur gluunproject reviennent très souvent)
    http://students.iiit.ac.in/~vkrishna/data/unproj.html

    si je compare ca et ton code, je vois que tu as commenté le glReadPixels, alors que c'est précisément ca qui te permet de recuperer ton z....

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    Ou je me suis mal explique plutôt :p

    Sinon, oui j'ai déjà vu ce lien, et tant d'autres.

    glReadPixel me retourne la valeur du DepthBuffer a un point donné. Ce n'est pas ce que je veux.

    En regardant la scène de face, cad Window(x,y) => OpenGL(x,y) ; si je déplace un objet il doit se déplacer selon x et y, et z ne doit pas bouger! Hors avec glReadPixel la valeur de z bouge.
    Si je spécifie moi même un z, (la valeur de z de l'objet que je bouge), la valeur z retournée est modifiée (pourquoi ???). Cela dit ça marche, si j'ignore la valeur retournée et que j'utilise la valeur de z de départ.
    (Tu me suis ?? :p)


    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
    52
    53
    54
    55
     
     
    Point3D* FrontFaceRepresentation::GetOGLPos(Viewport *viewport, int x, int y, float z) {
    	GLdouble modelview[16];
    	GLdouble projection[16];
    	GLfloat winX, winY, winZ;
    	GLdouble posX, posY, posZ;
     
            glMatrixMode( GL_MODELVIEW );
     
            setTransformations(this->currentViewport);
    	glMatrixMode(GL_PROJECTION);
            glPushMatrix();
            glLoadIdentity();
     
            setPerspective();
     
     
     
     
    	glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    	glGetDoublev( GL_PROJECTION_MATRIX, projection );
     
     
    	winX = (float)x;
    	winY = (float)height - (float)y;
     
     
     
     
    	gluUnProject( winX, winY, z, modelview, projection, viewport->toArray, &posX, &posY, &posZ);
     
     
    	glPopMatrix();
    	glFlush();
     
           glMatrixMode(GL_MODELVIEW);
     
     
    	return new Point3D(posX, posY, posZ); // posZ != z  !!!!!!
    }
     
    void FrontFaceRepresentation::myMotion(int x,int y) {
     
    	if(this->currentPoint==NULL) return;
     
    	Point3D* p3d = this->GetOGLPos(mythis->getCurrentViewport(), x,  y, mythis->currentPoint->z );
     
    	this->currentPoint->x =  p3d->x;
     
    	this->currentPoint->y =  p3d->y ;
    	//this->currentPoint->z =  p3d->z ;
    	return;
     
    }

    Donc ok ca marche. Mais si je tourne l'objet de 90 degrés (Window(x,y) => OpenGL(z,y) ), ça ne marche plus, forcement. Et il est crucial pour mon appli que cela marche.... :s

    Je sais pas si c'est tres clair tout ca... ?

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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. picking : gluUnProject + glRenderMode, récupération du Z
    Par quentinthib dans le forum OpenGL
    Réponses: 6
    Dernier message: 07/08/2007, 13h01
  3. Comment faire un Drag&Drop vers Windows ?
    Par Lung dans le forum Composants VCL
    Réponses: 17
    Dernier message: 21/06/2004, 13h10
  4. Drag movie
    Par bolo dans le forum Flash
    Réponses: 3
    Dernier message: 17/04/2003, 15h18
  5. curseur et drag&drop
    Par Pierrot dans le forum Langage
    Réponses: 4
    Dernier message: 25/09/2002, 19h16

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