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 :

coordonnées du point cliqué


Sujet :

OpenGL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 11
    Points : 7
    Points
    7
    Par défaut coordonnées du point cliqué
    Bonjour,

    j'ai un problème pour récupérer les coordonnées du point cliqué dans le repère du "monde openGL"...

    apparemment il faut utiliser gluUnProject...
    j'ai essayé 2 codes : celui qui est page 110 du red book et un code donné par El Brujo en réponse à ce post : http://www.developpez.net/forums/viewtopic.php?t=69907
    mais les 2 solutions ne marchent pas chez moi
    les coordonnées renvoyées par gluUnProject sont toujours les mêmes qqe soit le point que je clique ! voici toute ma fonction de gestion de la souris :
    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
     
    void myGlutMouse(int button, int button_state, int x, int y )
    {
    	double ox, oy, oz;
    	double projectionMatrix[16], modelviewMatrix[16];
    	int viewport[4];
     
    	glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix);
    	glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
    	glGetIntegerv(GL_VIEWPORT, viewport);
     
    	double wy = viewport[3] - y;	//le depth buffer est inversé en y
    						//par rapport à ce que l'on voit à l'écran
    	double wx = x;
    	double wz;
     
    	glReadPixels((int)wx, (int)wy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &wz);
     
    	gluUnProject(wx, wy, wz, modelviewMatrix, projectionMatrix, viewport, &ox, &oy, &oz); 
     
    	printf("ox = %g, oy = %g, oz = %g\n", ox, oy, oz);
     
    	if (button == GLUT_LEFT_BUTTON && button_state == GLUT_DOWN)
    	{
    		rect_top_left_x = ox;
    		rect_top_left_y = oy;
    	}
    	if (button == GLUT_LEFT_BUTTON && button_state == GLUT_UP)
    	{
    		rect_width = fabs(ox - rect_top_left_x);
    		rect_height = fabs(oy - rect_top_left_y);
    	}
    	printf("MOUSE : rect_top_left_x = %g, rect_top_left_y = %g\n", rect_top_left_x, rect_top_left_y);
    	printf("\trect_width = %g, rect_height = %g\n\n", rect_width, rect_height);
    	glutPostRedisplay();
    }
    vous l'aurez peut-être compris : j'essaye de dessiner un rectangle à la souris : qd on clique j'enregistre les coordonnées du coin en haut à gauche, puis on bouge la souris en gardant le bouton appuyé et qd on lache, je déduis la longueur et la largeur de mon rectangle. puis je le dessine dans la fonction d'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    glTranslated(rect_top_left_x, rect_top_left_y, 0);
    	glBegin(GL_LINE_LOOP);
    		glVertex2d(0, 0);
    		glVertex2d(rect_width, 0);
    		glVertex2d(rect_width, -rect_height);
    		glVertex2d(0, -rect_height);
    	glEnd();
    et donc qd je clique la 1ère fois, il me donne toujours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ox = 1433.51, oy = -1084.01, oz = 3200.04
    MOUSE : rect_top_left_x = 1433.51, rect_top_left_y = -1084.01
            rect_width = 0, rect_height = 0
    et qd je relache le bouton, il me donne toujours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ox = -0.0101446, oy = 0.00864601, oz = 3200.04
    MOUSE : rect_top_left_x = 1433.51, rect_top_left_y = -1084.01
            rect_width = 1433.52, rect_height = 1084.02
    ce qui est complètement abérant !

    je ne comprends pas du tout ce ki va pas, surtout que je suis assez débutante en openGL...
    est-ce qu'il y a des variables d'environnement à "enable" ou qqch d'autre que j'aurai pas fait et ki fait que ça marche pas ?? ou eske c incompatible ac qqch que j'aurais pu faire ???
    j'espère que vous aurez des idées !!
    Merci d'avance !
    $onia

  2. #2
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    Pour recuperer les coordonnés d'un point clicker il faut utiliser la technique du picking .
    En gros tu dois recuperer le tampon de profondeur du pixel sur lequelle t'as clicker , et selon le plan que tu affiches tu en deduit ses coordonnées .

    Si j'ai dit une betise que quelqu'un me reprenne je n'ai jamais utilisé le picking .
    Enfin tout ca pour dire que pour une débutante ca me parais un poil difficile ...
    6*8 =42

  3. #3
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 84
    Points : 89
    Points
    89
    Par défaut
    Idées qui me viennent à l'esprit:

    Tu as bien vérifié que x et y sont bons quand la fonction est appelée ?
    Ya pas de problème du signe de y?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Salut,

    Là je ne vois pas le problème. Ca vient peut-être d'ailleurs. Si ça ne te dérange pas envoie moi ton code parce que ta fonction me semble correcte.

    A+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    Merci bcp pr ttes vos réponses
    dsl de ne répondre que ce matin, ms g pas internet le week-end...

    charly : je ne connais pas le picking, ms je vais essayer de me renseigner dessus... ms si tu dis que c compliqué ça me fait un peu peur...

    exxos : bah à priori ils sont bons, en tout cas ils ne sont pas constants comme le résultat... pour y, je sais que ma scène se passe dans la partie du plan où x > 0 et y < 0... il parait qu'il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    y = viewport[3] - y;   //le depth buffer est inversé en y
                      //par rapport à ce que l'on voit à l'écran
    mais je dois dire que je comprends pas pkoi...

    El Brujo : oui, ma fonction de gestion de la souris est la même que celle que t'as publiée sur ce forum, dc à priori elle devrait marcher... ça veut surement dire que le pb ne vient pas de là...
    voici tout 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
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    int nb_proj;
    double screen_width;
    double screen_height;
     
    double rect_width = 0;
    double rect_height = 0;
     
    double rect_top_left_x = 0;
    double rect_top_left_y = 0;
     
    int Win1;
     
    // des points que je vais afficher
    std::vector<CvPoint2D64d> * the_points;
     
     
    // mon main...
    // (en fait mon application openGL est appellée par un autre code, c pr ça que c pas un main)
    int start(std::vector<CvPoint2D64d> * points, int nb_projectors, double screen_width, double screen_height)
    {
    	// initialize the global variables
    	nb_proj = nb_projectors;
    	::screen_width = screen_width;
    	::screen_height = screen_height;
    	the_points = new std::vector<CvPoint2D64d> (*points);
     
     
    	// g mis n'importe quoi ici...
    	int arg1 = 1;
    	char * arg2 = "window";
    	glutInit(&arg1, &arg2);
     
    	glutInitWindowSize(640, 480);
    	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
     
    	Win1 = glutCreateWindow("Display Wall Simlator");
     
    	glShadeModel(GL_FLAT);
     
    	glutReshapeFunc(Reshape);
    	glutDisplayFunc(Draw);
    	glutKeyboardFunc(myGlutKeyboard);
    	glutMouseFunc(myGlutMouse);
     
     
    	printf("press 'H' for help\n");
     
    	glutMainLoop();
     
    	return 0;
    }
     
    ////////////////////////////////////////////////////////////////////////////
     
    void Reshape(int width, int height)
    {
    	glViewport(0, 0, width, height);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(45, float(width)/float(height), 1, 5000);
    	glMatrixMode(GL_MODELVIEW);
     
    	glutPostRedisplay();
    }
     
    ////////////////////////////////////////////////////////////////////////////
     
    void Draw()
    {
    	glClearColor(.65, .65, .65, 0.0);
    	glClear(GL_COLOR_BUFFER_BIT);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
    	gluLookAt(0, 0, 3200, 0, 0, 0, 0, 1, 0);
    	glTranslated(-screen_width/2, screen_height/2, 0);
     
    	glColor4f(0.0f, 1.0f, 0.0f, 0.0f);
    	int i = 0;
    	for (i = 0; i < nb_proj; i++)
    	{
    		glBegin(GL_LINE_LOOP);
    			for (int j = 0; j < 4; j++)
    				glVertex2d(the_points->at(j + 4*i).x, -the_points->at(j + 4*i).y);
    		glEnd();
    	}
     
    	glColor4f(0.0f, 0.0f, 1.0f, 0.0f);
    	glBegin(GL_LINE_LOOP);
    		glVertex2d(0, 0);
    		glVertex2d(screen_width, 0);
    		glVertex2d(screen_width, -screen_height);
    		glVertex2d(0, -screen_height);
    	glEnd();
     
     
     
    	printf("DRAW : rect_top_left_x = %g, rect_top_left_y = %g\n", rect_top_left_x, rect_top_left_y);
    	printf("\trect_width = %g, rect_height = %g\n\n", rect_width, rect_height);
    	glColor4f(1.0f, 0.0f, 0.0f, 0.0f);
    	glTranslated(rect_top_left_x, rect_top_left_y, 0);
    	glBegin(GL_LINE_LOOP);	// GL_LINE_LOOP
    		glVertex2d(0, 0);
    		glVertex2d(rect_width, 0);
    		glVertex2d(rect_width, -rect_height);
    		glVertex2d(0, -rect_height);
    	glEnd();
     
     
    	glutSwapBuffers();
    }
     
     
    void myGlutKeyboard(unsigned char key, int x, int y)
    {
    	switch (key)
    	{
    	// move the center of the rectangle
    	case 's':
    		rect_top_left_x--;
    		glutPostRedisplay();
    		break;
    	case 'd':
    		rect_top_left_x++;
    		glutPostRedisplay();
    		break;
     
    	// etc...
     
    	default:
    		break;
    	}
     
      glutPostRedisplay();
    }
     
     
    void myGlutMouse(int button, int button_state, int x, int y )
    {
    	double ox, oy, oz;
    	double projectionMatrix[16], modelviewMatrix[16];
    	int viewport[4];
     
    	glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix);
    	glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
    	glGetIntegerv(GL_VIEWPORT, viewport);
     
    	double wy = viewport[3] - y;	//le depth buffer est inversé en y
    						//par rapport à ce que l'on voit à l'écran
    	double wx = x;
    	double wz;
     
    	glReadPixels((int)wx, (int)wy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &wz);
     
    	gluUnProject(wx, wy, wz, modelviewMatrix, projectionMatrix, viewport, &ox, &oy, &oz); 
     
    	printf("ox = %g, oy = %g, oz = %g\n", ox, oy, oz);
     
    	if (button == GLUT_LEFT_BUTTON && button_state == GLUT_DOWN)
    	{
    		rect_top_left_x = ox;
    		rect_top_left_y = oy;
    	}
    	if (button == GLUT_LEFT_BUTTON && button_state == GLUT_UP)
    	{
    		rect_width = fabs(ox - rect_top_left_x);
    		rect_height = fabs(oy - rect_top_left_y);
    	}
    	printf("MOUSE : rect_top_left_x = %g, rect_top_left_y = %g\n", rect_top_left_x, rect_top_left_y);
    	printf("\trect_width = %g, rect_height = %g\n\n", rect_width, rect_height);
    	glutPostRedisplay();
    }
    voila... j'espère que ça va te permettre de voir une erreur...
    Merci d'avance !
    $onia

  6. #6
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 84
    Points : 89
    Points
    89
    Par défaut
    Je ne comprend pas pourquoi tu as un y <0, il t'en faut un >0. (regarde si tu en a un >0 si tes résultats changent).

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    je ne comprends pas très bien ce que tu veux dire...
    le y que récupère ma fct myGlutKeyboard est bien positif (le y en coordonnées de ma fenêtre openGL), j'ai vérifié le x et le y, ils ont l'air d'être cohérents (proches de 0 qd je clique ds le coin en haut à gauche, etc).
    par contre mon repère openGL se trouve vers le coin supérieur gauche de ma fenêtre, les objets que je dessine ont tous des coordonnées avec ox > 0 et oy < 0 (coord openGL). donc qd je clique vers le milieu de ma fenêtre, je m'attends à avoir x, y > 0 (coordonnées dans la fenêtre), mais je devrais trouver ox > 0 et oy < 0. (ce qui est le cas, mais les valeurs st absurdes)
    voici ce ki se passe qd je clique à 2 endroits complètement différents :
    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
     
    x = 62, y = 2
    wx = 62, wy = 478
    ox = 0.013725, oy = -0.013683, oz = 3200.04
    MOUSE : rect_top_left_x = 0.013725, rect_top_left_y = -0.013683
            rect_width = 1433.49, rect_height = 1083.99
     
    DRAW : rect_top_left_x = 0.013725, rect_top_left_y = -0.013683
            rect_width = 1433.49, rect_height = 1083.99
     
    x = 62, y = 2
    wx = 62, wy = 478
    ox = 1433.5, oy = -1084, oz = 3200.04
    MOUSE : rect_top_left_x = 0.013725, rect_top_left_y = -0.013683
            rect_width = 1433.49, rect_height = 1083.99
     
    DRAW : rect_top_left_x = 0.013725, rect_top_left_y = -0.013683
            rect_width = 1433.49, rect_height = 1083.99
     
    x = 613, y = 459
    wx = 613, wy = 21
    ox = 1433.47, oy = -1083.97, oz = 3200.04
    MOUSE : rect_top_left_x = 1433.47, rect_top_left_y = -1083.97
            rect_width = 1433.49, rect_height = 1083.99
     
    DRAW : rect_top_left_x = 1433.47, rect_top_left_y = -1083.97
            rect_width = 1433.49, rect_height = 1083.99
     
    x = 613, y = 459
    wx = 613, wy = 21
    ox = 0.0137284, oy = -0.0136396, oz = 3200.04
    MOUSE : rect_top_left_x = 1433.47, rect_top_left_y = -1083.97
            rect_width = 1433.45, rect_height = 1083.96
     
    DRAW : rect_top_left_x = 1433.47, rect_top_left_y = -1083.97
            rect_width = 1433.45, rect_height = 1083.96
    mais je ne comprends pas très bien ce que tu veux dire...

    $onia

Discussions similaires

  1. coordonnées d'un point cliqué
    Par tarin dans le forum Lisp
    Réponses: 1
    Dernier message: 21/09/2010, 10h38
  2. Coordonnées des points d'un cercle
    Par guidevelop dans le forum C
    Réponses: 2
    Dernier message: 23/11/2006, 09h28
  3. Réponses: 5
    Dernier message: 30/05/2006, 14h04
  4. Conversion distance , angle vers coordonnées de points
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 26/03/2004, 22h55
  5. Coordonnées d'un point cliqué a la souris
    Par snipereyes dans le forum OpenGL
    Réponses: 3
    Dernier message: 19/08/2003, 10h34

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