Accueil > Forum > > > > Gestoin de souris en C++
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
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|