breizhbugs | En fait on utilise une fonction idle qui est appelée quand il n'y a aucun autre message à traiter. Ci dessous est une partie d'un programme utilisant la glut montrant le principe: lorsque le programme n'a pas de message à traiter, motion() est appelée et recalcule l'angle de la caméra en fonction de la position de la souris. A la fin on demande une mise à jour de l'affichage (et donc appel indirect a display() ). Le curseur de la souris (visible) saute une peu mais l'animation est fluide.
Par contre, le repositionnement souris est fait par les fonctions de l'api windows directement. Et toi es tu sous windows, linux? fais tu ton programme pour qu'il soit indépendant du système? Si non essai la gestion de la souris avec api native?
Code :
- // les variables globales
- int oldx, oldy;
- float anglexz = 270;
- float angleyz = 0;
- float ex=100.0, ey=120.0, ez=-100.0;
- float viewx=100.0, viewy=120.0, viewz=-110.0;
- int DISTANCE = 10;
- bool lighton = false;
- GLfloat nuit[] = {0.2, 0.2, 0.2, 1.0};
- GLfloat jour[] = {0.9, 0.9, 0.9, 1.0};
- GLfloat light_colambn[] = {0.6, 0.6, 0.6, 1.0};
- GLfloat light_colambj[] = {0.2, 0.2, 0.2, 1.0};
- POINT ptOld; // previous cursor location
- ...
- void display()
- // la fonction qui dessine la monde
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glPushMatrix();
- //pour la camera
- gluLookAt(ex, ey, ez, viewx, viewy, viewz, 0.0, 1.0, 0.0);
- // printf("(vx, vy, vz)=(%f, %f, %f)\n", viewx-ex, viewy-ey, viewz-ez);
- glDisable(GL_LIGHTING);
- glBegin(GL_LINES);
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(0.0, 0.0, 0.0);
- glVertex3f(5.0, 0.0, 0.0);
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, 0.0, 0.0);
- glVertex3f(0.0, 5.0, 0.0);
- glColor3f(0.0, 0.0, 1.0);
- glVertex3f(0.0, 0.0, 0.0);
- glVertex3f(0.0, 0.0, 5.0);
- glEnd();
- glEnable(GL_LIGHTING);
- if(lighton)
- {
- glEnable(GL_LIGHT0);
- }
- else
- {
- glDisable(GL_LIGHT0);
- }
- glPushMatrix();
- glTranslatef(90.0, 220.0, -180.0);
- glutWireCube(10.0);
- glPopMatrix();
- drawMur();
- glTranslatef(300.0, 0.0, 0.0);
- glRotatef(-90, 0.0, 1.0, 0.0);
- drawMur();
- glPopMatrix();
- glutSwapBuffers();
- }
- void motion()
- // cette fonction est appelée automatiquement quand il n'y a rien d'autre a faire
- {
- POINT pt;
- GetCursorPos(&pt); // on obtient la position du curseur
- float deltax=((float)(ptOld.x - pt.x))/2; // je sais plus pourquoi on divise par deux... pour que ca aille moins vite peut etre?
- float deltay=((float)(ptOld.y - pt.y))/2;
- float angleradiansx;
- float angleradiansy;
- //pour la translation
- anglexz=(anglexz-deltax);
- angleyz=(angleyz+deltay);
- // on regarde en haut ou en bas, mais on fait pas le "tour"
- if (angleyz<-89.9)
- angleyz=-89.9;
- else if (angleyz>89.9)
- angleyz=89.9;
- angleradiansx = anglexz * M_PI / 180;
- angleradiansy = angleyz * M_PI / 180;
- viewx=ex+cos(angleradiansx)*cos(angleradiansy)*DISTANCE;
- viewz=ez+sin(angleradiansx)*cos(angleradiansy)*DISTANCE;
- viewy=ey+sin(angleradiansy)*DISTANCE;
- SetCursorPos(ptOld.x, ptOld.y); // repositionnement du curseur - ptold est initialisé au milieu de la fenêtre
- glutPostRedisplay(); // on demande une mise a jour d l'affichage
- }
- void mouse(int button, int , int x, int y)
- //on detecte le clic de souris pour lancer/stopper la fonction de l'animation
- {
- //oldx=x;
- // oldy=y;
- //on positionne le curseur au milieu
- SetCursorPos(glutGet(GLUT_WINDOW_X)+(glutGet(GLUT_WINDOW_WIDTH)/2),glutGet(GLUT_WINDOW_Y)+(glutGet(GLUT_WINDOW_HEIGHT)/2));
- //on enregistre sa position (au milieu)
- GetCursorPos(&ptOld);
- if (button == GLUT_RIGHT_BUTTON)
- glutIdleFunc(motion); // on démarre la fonction idle
- else
- glutIdleFunc(NULL); // ou on l'arrête si c'est pas le bouton droit qui a cliquer
- }
- void reshape(int w, int h)
- // si on redimensionne la fenêtre, on corrige la camera
- {
- glViewport(0, 0, (GLsizei)w, (GLsizei)h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- //pour conserver l'aspect:
- if (w <= h)
- glFrustum(-1.0, 1.0,
- -1.0*(GLfloat)h/(GLfloat)w,1.0*(GLfloat)h/(GLfloat)w,
- 1.0, 5000.0);
- else
- glFrustum(-1.0*(GLfloat)w/(GLfloat)h,1.0*(GLfloat)w/(GLfloat)h,
- -1.0, 1.0,
- 1.0, 5000.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- glutInitWindowSize(500, 500);
- glutInitWindowPosition(100, 100);
- glutCreateWindow(argv[0]);
- init();
- glutDisplayFunc(display);
- glutReshapeFunc(reshape);
- ...
- glutMouseFunc(mouse); //pour détecter clic de souris
- glutMainLoop();
- return 0;
- }
|
Message édité par breizhbugs le 08-04-2010 à 16:11:15
|