Gestoin de souris en C++

Signaler
Messages postés
2
Date d'inscription
mercredi 10 mai 2006
Statut
Membre
Dernière intervention
2 juin 2006
-
Messages postés
2
Date d'inscription
mercredi 10 mai 2006
Statut
Membre
Dernière intervention
2 juin 2006
-
Bonjour,

je débute en C++ en suivant un cours d'infographie proposée dans mon cursus universitaire. Le projet de cette année consite en la création d'un visualiseur 3D en OpenGL. Pour l'instant je ne m'en sors pas trop mal, mais par contre je galère à mort pour la gestion de la souris. J'aimerais réaliser des action suivantes avec la dite souris:

-bouton gauche enfoncé& mouvement souris ==> translation
de l'objet
dans le plan de la fenêtre de vue
-bouton droit enfoncé& mouvement souris ==> rotation de l'objet

Je vous envoie ci-dessous mon programme (c'est une usine à gaz, certes...). Si quelq'un peut me dire ce qui cloche pour la souris, ça serait bien sympa.

Note: certaines fonctions sont  précédées d'un // qui les annule, mais c'est parceque j'ai compilé plusieures fois annulant certaines commandes pour trouver ce qui clochait. D'aute part, il y a pleins de commentaires persos...faites pas attention)

Cordialement,

Antoine.

/* cube */


#include <math.h>


#include <stdio.h>


#include <GL/glut.h>


#include <math.h>


void Init(void);


void DefineCube(void);


void Display(void);


void Reshape(int w, int h);


void Keyboard(unsigned char key, int x, int y);


void Motion(int button, int state, int x, int y);


float vertices[8][3], angleu, anglev; //taille du tableau - rééls [8sommets][3coordonnées]


int elements[12][3]; //nombre d'éléments - entiers [12segments][3coordonnées]


double view_plan;


void DefineCube(void)


{


//définition des sommets (centre cube=centre repère)


vertices[0][0] = 0.0-0.5; //[1er sommet][coordX]=valeur


vertices[0][1] = 0.0-0.5; //[1er sommet][coordY]=valeur


vertices[0][2] = 0.0-0.5; //[1er sommet][coordZ]=valeur


vertices[1][0] = 1.0-0.5; //etc...


vertices[1][1] = 0.0-0.5;


vertices[1][2] = 0.0-0.5;


vertices[2][0] = 1.0-0.5;


vertices[2][1] = 1.0-0.5;


vertices[2][2] = 0.0-0.5;


vertices[3][0] = 0.0-0.5;


vertices[3][1] = 1.0-0.5;


vertices[3][2] = 0.0-0.5;


vertices[4][0] = 1.0-0.5;


vertices[4][1] = 0.0-0.5;


vertices[4][2] = 1.0-0.5;


vertices[5][0] = 1.0-0.5;


vertices[5][1] = 1.0-0.5;


vertices[5][2] = 1.0-0.5;


vertices[6][0] = 0.0-0.5;


vertices[6][1] = 1.0-0.5;


vertices[6][2] = 1.0-0.5;


vertices[7][0] = 0.0-0.5;


vertices[7][1] = 0.0-0.5;


vertices[7][2] = 1.0-0.5;


//définition des triangles composant les faces


elements[0][0] = 3; //[1er triangle][1er sommet]


elements[0][1] = 2; //[1er triangle][2eme sommet]


elements[0][2] = 5; //[1er triangle][3eme sommet]


elements[1][0] = 3; //etc...


elements[1][1] = 6;


elements[1][2] = 5;


elements[2][0] = 6;


elements[2][1] = 3;


elements[2][2] = 4;


elements[3][0] = 6;


elements[3][1] = 7;


elements[3][2] = 4;


elements[4][0] = 1;


elements[4][1] = 7;


elements[4][2] = 4;


elements[5][0] = 7;


elements[5][1] = 8;


elements[5][2] = 1;


elements[6][0] = 5;


elements[6][1] = 8;


elements[6][2] = 2;


elements[7][0] = 2;


elements[7][1] = 8;


elements[7][2] = 1;


elements[8][0] = 3;


elements[8][1] = 4;


elements[8][2] = 2;


elements[9][0] = 5;


elements[9][1] = 6;


elements[9][2] = 8;


elements[10][0] = 2;


elements[10][1] = 4;


elements[10][2] = 3;


elements[11][0] = 2;


elements[11][1] = 1;


elements[11][2] = 4;


}


void Display(void)


{


int i, j ;


float d, Ovx, Ovy, Ovz;


Ovx = 2.1;


Ovy = 1.7;


Ovz = 1.9;


d = sqrt(Ovx*Ovx+Ovy*Ovy+Ovz*Ovz);


glClear(GL_COLOR_BUFFER_BIT); //Couleur à utiliser lors du vidage des tampons chromatiques -> ici:écran noir


glMatrixMode(GL_MODELVIEW); //Transformation suivantes affectent la MATRICE DE MODELISATION-VISUALISATION


glLoadIdentity(); //Matrice vidée par matrice identité


glTranslatef(0.,0.,-d); //Transformation de modélisation - translation (0,0,-d)


glRotatef(angleu, 1., 0., 0.); //Transformation de modélisation - rotation (1,0,0)


glRotatef(anglev, 0., 1., 0.); //Transformation de modélisation - rotation (0,1,0)


glTranslatef(0.,0.,+d); //Transformation de modélisation - translation (0,0,+d)


gluLookAt(Ovx,Ovy,Ovz,0.0,0.0,0.0,0.0,1.0,0.0); //(Coord.Ov,Pt focal F,G)


glMatrixMode(GL_PROJECTION); //Transformation suivantes affectent la MATRICE DE PROJECTION


glLoadIdentity(); //Matrice vidée par matrice identité


//glOrtho(-4.0,4.0,-4.0,-4.0,4.0,-4.0,4.0); //Volume qui va être visionné en perspective cavalière


glFrustum(-0.5,0.5,-0.5,0.5,view_plan,20.0); //Volume qui va être visionné en perspective conique


//On active qu'un seul mode de perspective sinon beugz!


for (i=0;i<12;i++)


{


glBegin(GL_TRIANGLE_STRIP); //Marque le début d'une liste de sommets décrivant une primitive géométrique


//GL_POINTS: points isolés


//GL_LINES: paires de sommets interpretés en tant que segments de lignes isolés


//GL_LINE_STRIP: série de segments de lignes joints


//GL_LINE LOOP: idem, avec ajout d'un segment entre le dernier et le premier sommet


//GL_TRIANGLES: regroupe par trois les sommets interpretés comme des triangles


//GL_TRIANGLE_STRIP: bande liée de triangles


//GL_TRIANGLE_FAN: éventail lié de triangles


//GL_QUADS: regroupe par 4 les sommets interpretés comme des polygones à 4 côtés


//GL_QUADS_STRIP: bande liée de quads


//GL_POLYGON: contour externe d'un polygone convexe simple


for ( j=0 ; j<3 ; j++ ) //De j=0 à J=2, J=J+1, J=0->x, J=1->y, J=2->z


{


glVertex3fv(vertices[elements[i][j]-1]); //Boucle définissant la liste des sommets


}


glColor3f(cos(i),sin(i),1-tan(i)); //Définition couleur aléatoire


//glColor3f(0.0,0.0,0.0): noir


//glColor3f(1.0,0.0,0.0): rouge


//glColor3f(0.0,1.0,0.0): vert


//glColor3f(1.0,1.0,0.0): jaune


//glColor3f(0.0,0.0,1.0): bleu


//glColor3f(1.0,0.0,1.0): magenta


//glColor3f(0.0,1.0,1.0): cyan


//glColor3f(1.0,1.0,1.0): blanc


glVertex3fv(vertices[elements[i][0]-1]);


glEnd(); //Marque la fin d'une liste de sommets décrivant une primitive géométrique


}


glFlush();


}


void Init(void)


{


view_plan = 1.8;


glClearColor(1.0,1.0,1.0,1.0);


glColor3f(0.0,0.0,0.0);


}


void Reshape(int w, int h)


{


if(w>h)


glViewport((w-h)/2, 0, h, h);


else


glViewport(0, (h-w)/2, w, w);


}


void Keyboard(unsigned char key, int x, int y)


{


switch(key)


{


case 'q':


exit(0);


case 'Q':


exit(0);


case '27':


exit(0);


case 'z':


view_plan += 0.02;//glScalef(1.02, 1.02, 1.02);


glutPostRedisplay(); // permet de redessiner le cube


break;


case 'Z':


view_plan -= 0.02;


glutPostRedisplay();


break;


case 'u' :


angleu += 1;


if (angleu > 360)


angleu -= 360;


glutPostRedisplay();


break;


case 'U' :


angleu -= 1;


if (angleu < 0)


angleu += 360;


glutPostRedisplay();


break;


case 'v' :


anglev += 1;


if (anglev > 360)


anglev -= 360;


glutPostRedisplay();


break;



case 'V' :


anglev -= 1;


if (anglev < 0)


anglev += 360;


glutPostRedisplay();


break;


}


}


int main(int argc, char **argv)


{


glutInit(&argc,argv);


glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);


glutInitWindowPosition(100,100);


glutInitWindowSize(800,800);


glutCreateWindow("Cube");


glutDisplayFunc(Display);


glutReshapeFunc(Reshape);


glutKeyboardFunc(Keyboard);


glutMotionFunc( mouseMotion );


glutMotionFunc(Motion);


Init();


DefineCube();


glutMainLoop();


return(0);


}

1 réponse

Messages postés
2
Date d'inscription
mercredi 10 mai 2006
Statut
Membre
Dernière intervention
2 juin 2006

OUps...il manquait une partie du programme entre Keyboard et Main :

void Keyboard(unsigned char key, int x, int y)

(...)

void mouse(int button, int state,int x,int y)
{
  /* si on appuie sur le bouton gauche */  if (button GLUT_LEFT_BUTTON && state GLUT_DOWN)
  {
    presse = 1; // 'presse' passe a 1 (vrai)
    xold = x; // sauvegarde de la position de la souris
    yold=y;
  }
  /* si on relache le bouton gauche */  if (button GLUT_LEFT_BUTTON && state GLUT_UP)
    presse=0; // 'presse' passe a 0 (faux)
}

void mousemotion(int x,int y)
  {

    
    if (presse) /* si le bouton gauche est presse */
    {
      /* modification des angles de rotation de l'objet
     en fonction de la position actuelle de la souris et de la derniere
     position sauvegardee */
      anglex=anglex+(x-xold);
      angley=angley+(y-yold);
      glutPostRedisplay(); // rafraichissement de l'affichage
    }
    
    xold=x; // sauvegarde des valeurs courante de le position de la souris
    yold=y;
  }

void Reshape(int w, int h)
{
    if(w>h)
        glViewport((w-h)/2, 0, h, h);
    else
        glViewport(0, (h-w)/2, w, w);
}

int main(int argc, char **argv)

{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(600,600);
    glutCreateWindow("Cube");
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    glutKeyboardFunc(Keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(mousemotion);
    Init();
    DefineCube();
    glutMainLoop();
    return(0);

}