Dante41
Messages postés103Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention15 juillet 2009
-
6 oct. 2004 à 20:22
Dante41
Messages postés103Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention15 juillet 2009
-
21 oct. 2004 à 18:50
Salut à tous,
J'ai besoin de votre aide.
j'essaie de recréer le système solaire en OpenGL par conséquent , il faut que je fasse toutes les planètes avec leurs textures... Voici mon bout de code qui marche pas je vous explique le problème après :
----------------------
void draw()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity ();
gluLookAt(0,4,-13,1,0,0,0,1,0);
glRotatef(60,0.0f,1.0f,0.0f);
planete_terre();
SDL_GL_SwapBuffers();
}
void planete_terre()
{
glBegin(GL_QUADS);
glBindTexture(GL_TEXTURE_2D,texture_terre);
glutSolidSphere(1.20, 40, 20);
glEnd();
}
---------------------
La texture est correctement appliquée mais y'a un problème :
elle ne suit pas la sphere lors des rotations... Là j'ai vraiment besoin de vous pour savoir comment faire une sphere texturée qui suit tout...
Merci d'avance à vous !
Dante41 (ou Vengeur41 ca dépend de l'humeur)
"Un myope qui lit sur les lèvres entend mieux lorsqu'il porte des lunettes",Phillipe Geluck
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 7 oct. 2004 à 14:30
Bonjours,
D'abord il est tres important de comprendre que OpenGL fonctionne par "etat", chaque commande OpenGL permet de modifier/initialiser l'etat ou le sous etat (matrice) en cours.
Dans la fonction de rendu (draw), glLoadIdentity() initialise la matrice courante en chargeant la matrice identité, puis le glRotat effectue une transformation sur cette matrice, qui est une rotation de 60 degrés selon l'axe y du repere OpenGL. Il n'y a donc aucun changement a attendre d'un rendu à l'autre, aucune rotation relative.
Ce n'est pas que la texture ne tourne pas, c'est juste qu'il n'y a aucune rotation ! D'ailleur la texture ne peut pas rester fixe independamment de la sphere car ses coordonnées d'attache ont été générées en phase d'initialisation !
Pour observer une rotation de la sphere selon l'axe y, il faut la tourner differement à chaque rendu ou moins, à l'aide d'un timer par exemple, incrementer ou decrementer l'angle de rotation en fonction d'un temps donné lors de chaque appel de la fonction draw.
De plus dans la fonction planete_terre, les commandes glBegin et glEnd sont inutiles, glutSolidSphere se charge du rendu de la sphere de maniere tres optimisé. On peut dans ce cas se passer de cette fonction qui allourdie le code inutilement.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 7 oct. 2004 à 14:34
J'ajoute que l'appel de glBindTexture lors de chaque rendu est inutile et affecte les performances si il n'y a qu'une seule texture selectionnée au cours du rendu.
Dante41
Messages postés103Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention15 juillet 2009 7 oct. 2004 à 18:41
Sisi , la sphere tourne sans la texture j'ai fait un test avec l'appui du clavier, on voit les contours de la sphere bouger mais pas la texture...
Le code que tu m'as donné améliore donc les performances mais ne change rien à mon problème , dsl...
Dante41 (ou Vengeur41 ca dépend de l'humeur)
"Un myope qui lit sur les lèvres entend mieux lorsqu'il porte des lunettes",Phillipe Geluck
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 7 oct. 2004 à 19:32
Je ne sais pas ce qu'implique l'evenement "l'appui du clavier" sur le rendu, mais c'est impossible que la sphere tourne et pas la texture (ce que j'ai expliqué pour les coordonnées).
Le meilleur moyen de verifier est de passer en mode "fil de fer"
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
mais ca ne fais aucun doute
Le code que j'ai donné fonctionne tres bien à condition que la valeur de angle soit modifiée par un timer ou un autre evenement.
Vous n’avez pas trouvé la réponse que vous recherchez ?
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 8 oct. 2004 à 14:15
Je concois que c'est assez troublant, je vois d'ailleur pas à quoi cela pourrait etre du (à part une rotation, effectivement) mais ce code ne mais pas en rotation la sphere.
Dante41
Messages postés103Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention15 juillet 2009 8 oct. 2004 à 18:02
Bien sur, ce code ne la met pas en rotation mais j'ai une version modifiée non postée ici qui la fait tourner... Et ca ne marche pas non plus (merci de ton aide ;) )
Dante41 (ou Vengeur41 ca dépend de l'humeur)
"Un myope qui lit sur les lèvres entend mieux lorsqu'il porte des lunettes",Phillipe Geluck
SDL_GL_SwapBuffers();
}
//Fonction de gestion d'evenements
void events()
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
noquit=false;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
noquit=false;
break;
case SDLK_UP:
r-=10;
break;
case SDLK_DOWN:
r+=10;
break;
}
}
}
}
-------------util.h-------------
//Charge une texture a partir d'un bmp
bool loadBMP(char* nomFichier, GLuint& idTexture)
{
SDL_Surface* surfaceTexture = NULL;
surfaceTexture = SDL_LoadBMP(nomFichier);
if (!surfaceTexture) {
SDL_Quit();
::MessageBox(::GetForegroundWindow(),
"La texture n'a pas pu être chargée", "Erreur SDL_LoadBMP",
MB_ICONERROR | MB_OK);
exit(1);
}