begin process at 2012 05 29 03:39:31
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Compression, Split & Cryptage

 > 

Gestoin de souris en C++


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Gestoin de souris en C++

vendredi 2 juin 2006 à 14:18:58 | Gestoin de souris en C++

Wickedwolf

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);

}
vendredi 2 juin 2006 à 14:38:00 | Re : Gestoin de souris en C++

Wickedwolf

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);

}


Cette discussion est classée dans : int, void, elements, gl, vertices


Répondre à ce message

Sujets en rapport avec ce message

Pb de FRONT et BACK buffer avec texture [ par gastoudou ] Bonjour à tous,Je suis en train de faire un projet en OpenGL pour l'école sur un puzzle 2D. Il y a 16 cases mélangées et on doit les remettre à leur p labyrinthe en 3D sytle ecran veille windows [ par gastoudou ] Bonjour à tous,Et oui encore moi pour une question, que dis-je, une mission pour une âme charitable.Je suis en train de faire un labyrinthe en 3D styl Problème avec TGA Loader [ par psykocrash ] Bonjour, J'ai commencé depuis peut la programmation avec OpenGL/GLut et j'ai trouvé la classe TGA Loader de Funto66 mais je n'arrive pas à afficher le Errreur [ par RM50Man ] Mon code ne marche pas: Le compilateur devcpp me met build error 1 #include /* contient déjà et */ #include #include #include void reset PB POUR LA GESTION MULTIFENETRES [ par algeros ] Voici un code ://////////////////////////////////////////////////////////////////                                                          //   Name: Problème avec les polygones [ par nisaloncaje ] Bonjour, j'ai le code source suivant : #include #include double a=0,inca=0.1; /* Prototype des fonctions */void affichage();void clavier(unsigned probleme de selection dans opengl [ par oswa ] bonjour, svp j'ai besoin d'un aide urgent. en effet, j'ai realiser un programme en c++ qui utilise opengl. ce programme permet de dessiner plusieurs pikcing opengl [ par znb ] J 'ai fait un code et ça marche très bien; il détecte les couleurs des objets. Mais je veux que, pour une valeur particulière de la couleur, dessiner matrice et vecteur [ par memoireph ] salut tous le monde je sollicite votre aide sur un problème voilà,j'ai deux classe vecteur et Matrice que je doit faire avec des opération élémentai


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales