fenetre openGL qui se ferme pas ...

fenetre openGL qui se ferme pas ... - C++ - Programmation

Marsh Posté le 11-02-2005 à 13:40:16    

Bojour, moi j'ais un ptit problème : ma fenêtre en openGL elle se ferme pas... Plus précisément je clique sur 'x' et là pas de problème ca ce ferme. Mais quand j'utilise l'ordinateur il se passe comme un truc : il rame!!!. Je lance le gestionnaire des taches et là rien de spécial mais quand je vais voir la liste des processus et bien je retrouve mon programme qui continue a tourner... Avez vous une idée de ce qui se passe ?
Sinon une autre petite question : voilà j'aimerais bien faires des niveaux comme dans les jeux : aurriez vous une idée où je peut trouver un logiciel qui puisse faire des niveau 3D. ily aurrait bien la solution de definir chaque mur, chaque sol, ... par ses coordonnées en 3D mais... Vous avez rien de moin laborieux surtout si tu veut faire quelque chose de joli (et je te parle pas des personnages vous vous imaginer definir chaques personnages point par point...)
merci.[cpp][/cpp]

Reply

Marsh Posté le 11-02-2005 à 13:40:16   

Reply

Marsh Posté le 11-02-2005 à 16:19:46    

OpenGL...  unix, win32, glut ??
et poste un peu ton code de fin, pour voir comment tu fermes ton programme.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 11-02-2005 à 16:58:27    

tu as dû mal associé ta fermeture de fenêtre...mais c'est en quoi? GLUT, SDL???

Reply

Marsh Posté le 12-02-2005 à 10:45:36    

j'ais crée ma fenêtre avec glut pour le code voilà :

Citation :


#include<windows.h>
#include<GL/gl.h>
#include<GL/glut.h>
#include<math.h>  
 
void Display();
void Reshape(int, int);
void Init();
void creer_cube();
void Special(int key, int x, int y);
void Idle();
int id_cube;
double angle;  
double angX = 45, angZ = 45;
int xCam, yCam, zCam;
 
int main(int argc, char** argv){
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
  glutInitWindowSize(640, 480);
  glutInitWindowPosition(50, 50);
  glutCreateWindow("Cube 3D en openGL" );
  Init();
 
  glutDisplayFunc(Display);
  glutReshapeFunc(Reshape);
  glutIdleFunc(Idle);
  glutSpecialFunc(Special);
  glutMainLoop();
  return 0;
}
 
void Display(){
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(10 * cos(angX)*sin(angZ),10 * cos(angZ),10 * sin(angZ)*sin(posX),0,0,0,0,1,0);
glCallList(id_cube);
 
glPushMatrix();
glPopMatrix();
glPushMatrix();
glRotated(angle,0,1,0);
glTranslatef(0,0,-5);
glRotated(angle,1,0,0);
glScaled(0.5,0.5,0.5);
 
glCallList(id_cube);
glPopMatrix();
glPushMatrix();
glRotated(angle,0,1,0);
glTranslatef(0,0,5);
glRotated(angle,0,1,0);
glScaled(0.5,0.5,0.5);
 
glCallList(id_cube);
glPopMatrix();
glPushMatrix();
glRotated(angle,0,1,0);
glutSwapBuffers();
}
 
void Reshape(int h, int w){      
     glViewport(0,0,w,h);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     gluPerspective(100.0,(float) w/h,1.0,15.0);
}
 
void Init(){
     glEnable(GL_DEPTH_TEST);
     creer_cube();
}
 
void creer_cube(){
     id_cube = glGenLists(1);
     glNewList(id_cube, GL_COMPILE);
 
glBegin(GL_QUADS);
glColor3d(1,0,0);
glVertex3i(1,1,1);
glVertex3i(1,-1,1);
glVertex3i(-1,-1,1);
glVertex3i(-1,1,1);
 
glColor3d(0,1,0);
glVertex3i(1,1,-1);
glVertex3i(1,-1,-1);
glVertex3i(-1,-1,-1);
glVertex3i(-1,1,-1);
 
glColor3d(0,0,1);
glVertex3i(1,1,1);
glVertex3i(1,-1,1);
glVertex3i(1,-1,-1);
glVertex3i(1,1,-1);
 
glColor3d(1,1,0);
glVertex3i(-1,1,-1);
glVertex3i(-1,1,1);
glVertex3i(1,1,1);
glVertex3i(1,1,-1);
 
glColor3d(0,1,1);
glVertex3i(-1,-1,-1);
glVertex3i(-1,-1,1);
glVertex3i(1,-1,1);
glVertex3i(1,-1,-1);
 
glColor3d(1,0,1);
glVertex3i(-1,1,1);
glVertex3i(-1,-1,1);
glVertex3i(-1,-1,-1);
glVertex3i(-1,1,-1);
glEnd();
 
glEndList();
}
 
void Idle(){
     angle += 1;
     if(angle > 360) angle = 0;
     glutPostRedisplay();
}
 
void Special(int key, int x, int y){
     switch(key){
                 case GLUT_KEY_UP : angZ +=0.1; break;
                 case GLUT_KEY_DOWN : angZ -= 0.1; break;
                 case GLUT_KEY_RIGHT : angX += 0.1; break;
                 case GLUT_KEY_LEFT : angX -= 0.1; break;
     }
}


 
et mon problème c'est lors de la fermeture ...
et Merci d'avoir répondu

Reply

Marsh Posté le 12-02-2005 à 11:36:35    

peut-être détruire la display list ?

Reply

Marsh Posté le 12-02-2005 à 12:09:56    

amonchakai a écrit :


gluLookAt(10 * cos(angX)*sin(angZ),10 * cos(angZ),10 * sin(angZ)*sin(posX),0,0,0,0,1,0);  


 
Ca ne serait pas plutôt :
gluLookAt(10 * cos(angX)*sin(angZ),10 * cos(angZ),10 * sin(angZ)*sin(angX),0,0,0,0,1,0);  
 
Sinon chez moi ça s'arrête.

Reply

Marsh Posté le 12-02-2005 à 13:48:53    

Sur ça :  

Citation :

gluLookAt(10 * cos(angX)*sin(angZ),10 * cos(angZ),10 * sin(angZ)*sin(posX),0,0,0,0,1,0);  


moi j'ais aucun problème et ça fonctionne exactement comme je le veut.
 
sinon je débute l'openGL donc est ce que on pourrait m'expliquer ce que vous voulez dire par :

Citation :

détruire la display list

. Parce que ce que je comptrend pas c'est que mon programme est sencé être arrété : on ne le voit plus dans le gestionnaire des taches et même quand on regarde l'exécutions des taches dans les informations systèmes. il ne devrait ne devrait plus faire parti des processus non ? :pt1cable:
parce que pour moi programme arrété qu'il soit foireux ou pas il est plus censé être exécuté donc donc le code n'a plus aucunne importance non ? j'avoue être un peut perplexe...

Reply

Marsh Posté le 12-02-2005 à 13:53:07    

oups... pardon sur ça :

Citation :

gluLookAt(10 * cos(angX)*sin(angZ),10 * cos(angZ),10 * sin(angZ)*sin(posX),0,0,0,0,1,0);


vous avez raison c'est bien :

Citation :

gluLookAt(10 * cos(angX)*sin(angZ),10 * cos(angZ),10 * sin(angZ)*sin(angX),0,0,0,0,1,0);  


 
érreur de recopiage ...  :D

Reply

Marsh Posté le 12-02-2005 à 14:37:45    

Tu devrais quand même ralentir un peu ton programme avec un petit Sleep par exemple.
 
Sinon tu utilises quel compilateur et quelle version de glut ?

Reply

Marsh Posté le 12-02-2005 à 14:53:29    

Bon pour le ralentir c'est pas compliqué : faut toucher à l'incrémentation de la variable angle dans la fonction Idle() (moi je le ralentit pas car sur mon pc : un athlon 900 + geforce 2 MX ca tourne pas trop vite ...) pour un P4 essaye de mettre 0.05. (rem angle est déjà en double)
 
Sinon je programme avec dev-c++ version 4.9.9.1
et ma version de glut je l'ais eu avec openGL 1.2 et quand j'ouvre glut.h il me donne :

Citation :

GLUT_API_VERSION=4

Reply

Marsh Posté le 12-02-2005 à 14:53:29   

Reply

Marsh Posté le 12-02-2005 à 15:05:41    

amonchakai a écrit :

Bon pour le ralentir c'est pas compliqué : faut toucher à l'incrémentation de la variable angle dans la fonction Idle() (moi je le ralentit pas car sur mon pc : un athlon 900 + geforce 2 MX ca tourne pas trop vite ...) pour un P4 essaye de mettre 0.05. (rem angle est déjà en double)


 
Je disait ça pour éviter que ça te prenne 100% du processeur c'est tout.
 

amonchakai a écrit :


Sinon je programme avec dev-c++ version 4.9.9.1
et ma version de glut je l'ais eu avec openGL 1.2 et quand j'ouvre glut.h il me donne :

Citation :

GLUT_API_VERSION=4



 
Hum c'est une vielle version tu devrais la mettre à jour.

Reply

Marsh Posté le 12-02-2005 à 17:54:29    

j'ais téléchargé openGL 2.0 Mais j'ais Win98 donc je peut pas vois les processus j'aurrais la réponce si sa marche demain...
Je voudrais juste poser une question : sleep(); d'après mes souvenir (je suis sûrement pas à jour) ça travaille à la seconde près. pas terrible pour une fonction qui travaille sur le rafraichissement de l'image non ?
 
remarque : comment on fait pour avoir le nombre d'image affichée par seconde ?

Reply

Marsh Posté le 12-02-2005 à 19:27:33    

tu mesures, mais après je sais pas si Glut expose quelque chose d'indépendant de l'os.
 
sinon sous windows tu le fais avec QueryPerformanceTimer / QueryPerformanceFrequency.

Reply

Marsh Posté le 12-02-2005 à 19:28:39    

et si tu veux réguler ton framerate, tu le fais avec un timer, où c'est un message qui te permet de savoir quand tu dois rafraichir.

Reply

Marsh Posté le 12-02-2005 à 20:16:37    

sleep est à la seconde mais pas Sleep qui est à la milliseconde (uniquement sous windows) :
http://msdn.microsoft.com/library/ [...] /sleep.asp


Message édité par Tarabiscote le 12-02-2005 à 20:17:45
Reply

Marsh Posté le 12-02-2005 à 20:52:33    

OK, merci pour ces renseignement !!!  :bounce:

Reply

Marsh Posté le 13-02-2005 à 13:56:50    

bon j'ais pu essayer avec openGL 2.0 et ... ça change rien mes programmes continuent a se partager gaiment toute la charge processeur malgré qu'il soient tous arrétés!! :fou:

Reply

Marsh Posté le 13-02-2005 à 18:36:44    

J'aimerais savoir ce que tu appelles OpenGL2 au juste ;)
Non parce qu'OpenGL ne fonctionne pas du tout comme DirectX et on ne télécharge pas OpenGL 2 comme ça. OpenGL 2 tout ce que ça apporte par rapport au 1.5 c'est un ensemble d'extensions et jusqu'à preuve du contraire aucun IHV n'a pour l'instant des drivers OpenGL 2

Reply

Marsh Posté le 14-02-2005 à 23:48:51    

C'est clair que la moindre pause d'une milliseconde tombe direct l'occupation CPU en laissant un peu bosser l'ordonnanceur :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed