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 :

Problème pour dessiner carré via un clique


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 27
    Par défaut Problème pour dessiner carré via un clique
    Bonjour, je souhaiterais créer des carrés à l'endroit ou je clique sur la fenêtre (utilisation de Glut) mais cela ne marche malheureusement pas. Il me semble que le problème vient des coordonnées de la souris et Glut qui ne sont pas les même d'où l'utilisation d'un glOrtho. Mais cela ne marche toujours pas, peut être est-ce du à une mauvaise utilisation de cette fonction ou tout simplement le problème ne vient pas de là. Je vous passe mon code et vous remercie d'avance !

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <GL/glut.h>
     
     
     
    void tracerpoly(int x,int y){
    	printf("x=%d et y=%d\n",x,y);
    	glColor3f(0.4,0.8,0.4);
    	glBegin(GL_POLYGON);
    	glVertex2f(x-0.15,y-0.15);
    	glVertex2f(x+0.15,y-0.15);
    	glVertex2f(x+0.15,y+0.15);
    	glVertex2f(x-0.15,y+0.15);
    	glEnd();
    }
     
    void affichage(void) {
    	glClear (GL_COLOR_BUFFER_BIT);
    	tracerpoly(0,0);
    	glutSwapBuffers();
    }
     
     
    void redim(int width, int height){
    	glViewport(0,0,width,height);
    	glOrtho(0,800,0,600,0.1,1000);
    }
     
    void clavier(unsigned char key, int x, int y){
    	switch(key) {
    		case 27:
    		case 'q':
    		case 'Q': exit(0);
    		break;
    		case 'r' : glClearColor(1., 0., 0., 1.); /* rouge */ 
    		break;
    		case 'v' : glClearColor(0., 1., 0., 1.); /* vert */ 
    		break;
    		case 'b' : glClearColor(0., 0., 1., 1.); /* bleu */ 
    	}
    	glutPostRedisplay();
    }
     
    void ChoixMenuPrincipal(int value) {
    switch (value) { 
    	case 10 : exit(0);
    break;
    }
    }
     
     
    void ChoixSousMenu(int value) { 
    	printf("Choix sous menu numero %d\n", value); 
    	switch (value) {
    		case 1 : glClearColor(1., 0., 0., 1.); /* rouge */ 
    		break;
    		case 2 : glClearColor(0., 1., 0., 1.); /* vert */ 
    		break;
    		case 3 : glClearColor(0., 0., 1., 1.); /* bleu */ 
    		break;
    		case 4 : glPolygonMode( GL_FRONT, GL_FILL ); 
    		break;
    		case 5 : glPolygonMode( GL_FRONT, GL_LINE );
    		break;
    	} glutPostRedisplay();
    }
     
    void CreerMenu(void) { 
    	int sousMenu;
    	sousMenu = glutCreateMenu(ChoixSousMenu); 
    	glutAddMenuEntry("Rouge",1); 
    	glutAddMenuEntry("Vert",2); 
    	glutAddMenuEntry("Bleu",3);
    	glutAddMenuEntry("Rempli",4);
    	glutAddMenuEntry("Aretes",5);
    	glutCreateMenu(ChoixMenuPrincipal);	
    	glutAddSubMenu("Mon carré",sousMenu); 
    	glutAddMenuEntry("Quitter",10);
    	glutAttachMenu(GLUT_RIGHT_BUTTON);
     
    }
     
    void souris(int button, int state, int x, int y)
    {
     
      if (button == GLUT_LEFT_BUTTON)
        {
    		if(state==GLUT_DOWN){
          tracerpoly(x,y);
    	  glutPostRedisplay();
    	 }
     
        }
    }
     
    int main ( int argc, char** argv){
     
     
    	glutInit(&argc, argv);
    	glutInitWindowSize(800,600);
    	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
     
    	glutCreateWindow("Ma fenêtre");
    	glClearColor(0,0,0,0);
    	glutDisplayFunc(affichage);
    	glutReshapeFunc(redim);
    	glutKeyboardFunc(clavier);
    	glutMouseFunc(souris);
    	CreerMenu();
    	glutMainLoop();
     
    	return 0;
    }

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 820
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 820
    Par défaut
    Salut,

    Je vais faire mon fainéant, je suis un peu allergique au pavé de code livré en pâture après un simple:

    Citation Envoyé par Harmonic Voir le message
    mais cela ne marche malheureusement pas.
    Pourrait-on avoir un minimum de description des symptômes de manière plus précise qu'un "cela ne marche pas"?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Citation Envoyé par Harmonic Voir le message
    Bonjour, je souhaiterais créer des carrés à l'endroit ou je clique sur la fenêtre (utilisation de Glut) mais cela ne marche malheureusement pas. Il me semble que le problème vient des coordonnées de la souris et Glut qui ne sont pas les même d'où l'utilisation d'un glOrtho. Mais cela ne marche toujours pas, peut être est-ce du à une mauvaise utilisation de cette fonction ou tout simplement le problème ne vient pas de là. Je vous passe mon code et vous remercie d'avance !
    Faudrait deja un peu lire la doc pour voir ce que renvoie ces coordonnés avant non ?
    C'est coordonné renvoie la position en x et y de ton ECRAN (je crois par rapport au centre mais pas sur m'en souviens plus).

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 27
    Par défaut
    Bonjour, j'ai lu justement la doc mais ne suis pas sur de bien avoir compris d'où mon appel à l'aide. Et non je ne livre pas ce code en pâture. J'ai mis tout le code au cas ou le problème ne vienne pas de ce glOrtho et afin d'en déduire d'où vient le problème vu qu'on me demande généralement de mettre mon code.

    Sinon les symptômes: j'ai mis un printf dans la partie du code où je suis censé prendre les coordonnées afin de tracer le carré à l'endroit voulu. Les coordonnées de la souris sont bien acquises vu que j'ai bien le printf avec les coordonnées qui s'affichent mais sans les formes malheureusement. D'origine mon programme dessine un carré centré à l'origine d'où le tracé d'un carré dans la fonction afficher. J'ai mis le glOrtho dans la fonction redim, cela devrait être la bonne position il me semble ?

    Si vous avez d'autres questions n'hésitez pas et merci de bien vouloir m'aider

  5. #5
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Bon j'ai testé ton code et j'ai réglé le problè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
    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <GL/glut.h>
     
     
    int px = 0;
    int py = 0;
     
    void tracerpoly(){
    	printf("x=%d et y=%d\n",px,py);
     
    	float tx,ty;
     
    	tx = 0;
    	ty = 0;
     
     
        tx = (float)(px-400)/400.0;
        ty -= (float)(py-300)/300.0;
     
    	//if(px < 400) tx = -tx;
    	glColor3f(0.4,0.8,0.4);
    	glBegin(GL_POLYGON);
    	glVertex2f(tx-0.15,ty-0.15);
    	glVertex2f(tx+0.15,ty-0.15);
    	glVertex2f(tx+0.15,ty+0.15);
    	glVertex2f(tx-0.15,ty+0.15);
    	glEnd();
    }
     
    void affichage(void) {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
     
    	tracerpoly();
    	glutSwapBuffers();
    }
     
     
    void redim(int width, int height){
    	glViewport(0,0,width,height);
    	glOrtho(0,800,0,600,0.1,1000);
    }
     
    void clavier(unsigned char key, int x, int y){
    	switch(key) {
    		case 27:
    		case 'q':
    		case 'Q': exit(0);
    		break;
    		case 'r' : glClearColor(1., 0., 0., 1.); /* rouge */
    		break;
    		case 'v' : glClearColor(0., 1., 0., 1.); /* vert */
    		break;
    		case 'b' : glClearColor(0., 0., 1., 1.); /* bleu */
    	}
    	glutPostRedisplay();
    }
     
    void ChoixMenuPrincipal(int value) {
    switch (value) {
    	case 10 : exit(0);
    break;
    }
    }
     
     
    void ChoixSousMenu(int value) {
    	printf("Choix sous menu numero %d\n", value);
    	switch (value) {
    		case 1 : glClearColor(1., 0., 0., 1.); /* rouge */
    		break;
    		case 2 : glClearColor(0., 1., 0., 1.); /* vert */
    		break;
    		case 3 : glClearColor(0., 0., 1., 1.); /* bleu */
    		break;
    		case 4 : glPolygonMode( GL_FRONT, GL_FILL );
    		break;
    		case 5 : glPolygonMode( GL_FRONT, GL_LINE );
    		break;
    	} glutPostRedisplay();
    }
     
    void CreerMenu(void) {
    	int sousMenu;
    	sousMenu = glutCreateMenu(ChoixSousMenu);
    	glutAddMenuEntry("Rouge",1);
    	glutAddMenuEntry("Vert",2);
    	glutAddMenuEntry("Bleu",3);
    	glutAddMenuEntry("Rempli",4);
    	glutAddMenuEntry("Aretes",5);
    	glutCreateMenu(ChoixMenuPrincipal);
    	glutAddSubMenu("Mon carré",sousMenu);
    	glutAddMenuEntry("Quitter",10);
    	glutAttachMenu(GLUT_RIGHT_BUTTON);
     
    }
     
    void souris(int button, int state, int x, int y)
    {
     
      if (button == GLUT_LEFT_BUTTON)
        {
    		if(state==GLUT_DOWN){
          px = x;
          py = y;
    	  glutPostRedisplay();
    	 }
     
        }
    }
     
    int main ( int argc, char** argv){
     
     
    	glutInit(&argc, argv);
    	glutInitWindowSize(800,600);
    	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
     
    	glutCreateWindow("Ma fenêtre");
    	glClearColor(0,0,0,0);
    	glutDisplayFunc(affichage);
    	glutReshapeFunc(redim);
    	glutKeyboardFunc(clavier);
    	glutMouseFunc(souris);
    	CreerMenu();
    	glutMainLoop();
     
    	return 0;
    }
    Tu as oublié un "glLoadIdentity();" dans affichage.
    Apres le glutPostRedisplay(); permet de rappeler affichage donc obliger de passer par les variable globales (donc utilise freeglut qui permet éviter ce problème).

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 27
    Par défaut
    Merci beaucoup !

    Cependant comment as-tu trouvé les 2 lignes ci-dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tx = (float)(px-400)/400.0;
    y -= (float)(py-300)/300.0;
    Et le glOrtho devient alors inutile non ?

  7. #7
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    le glOrtho est inutile ici effectivement.

    Pour les 2 lignes c'est simples.

    La position de px et py est en pixel par rapport en haut a gauche.
    Ta fenetre fait 800x600.

    Sur opengl quand tu affiche une position -1 se trouve a gauche , 1 a droite
    pareil pour la hauteur et le bas.

    voila une image pour exemple :
    http://img15.hostingpics.net/pics/552339Sanstitre.png

    du coup il faut juste faire une conversion intelligente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tx = (float)(px-400)/400.0;
    ty -= (float)(py-300)/300.0;
    prenons tx en exemple , je fais px-400, si px = 800
    ben j'aurais tx = (800-400)/400.0 donc tx = 1
    si px = 0
    ben j'aurais tx = (0-400)/400.0 donc tx = -1

    sachant que le centre c'est 0 (avec opengl)donc 400 pixel.
    Avec la redimensionnement de la fenetre faudra juste récupérer les nouvelles dimensions.

Discussions similaires

  1. [Chemfig] Problème pour dessiner une liaison
    Par DozerSux dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 4
    Dernier message: 11/10/2010, 16h41
  2. [MySQL] Problème pour insérer des données au clique d'un lien
    Par Bizoo dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/03/2009, 18h34
  3. Problème pour dessiner.
    Par Clydopathe dans le forum C#
    Réponses: 3
    Dernier message: 05/02/2009, 09h45
  4. [Débutant] Problème pour dessiner une courbe
    Par torNAdE dans le forum MATLAB
    Réponses: 6
    Dernier message: 16/07/2007, 23h25
  5. Réponses: 7
    Dernier message: 04/06/2006, 18h00

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