Texture d'une glutSphere

Dante41 Messages postés 103 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 15 juillet 2009 - 6 oct. 2004 à 20:22
Dante41 Messages postés 103 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 15 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

10 réponses

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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.

void draw()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity ();
gluLookAt(0,4,-13,1,0,0,0,1,0);

/* la valeur de angle doit changer au cours du temps */
glRotatef(angle,0.0f,1.0f,0.0f);

glBindTexture(GL_TEXTURE_2D,texture_terre);
glutSolidSphere(1.20, 40, 20);

SDL_GL_SwapBuffers();
}
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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.
0
Dante41 Messages postés 103 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 15 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
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Dante41 Messages postés 103 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 15 juillet 2009
7 oct. 2004 à 20:09
La texture reste immobile cependant y'a =quelques pixels qui bougent : les contours de la sphere....

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
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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.

Qu'est ce que cela donne avec cette commande ?

glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
0
Dante41 Messages postés 103 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 15 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
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
8 oct. 2004 à 18:58
Montre moi donc le code complet, je te la ferais tourner !
0
Dante41 Messages postés 103 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 15 juillet 2009
8 oct. 2004 à 19:03
--------main.cpp-----------
#include <windows.h>
#include <SDL/SDL.h>
#include <stdlib.h>
#include <stdarg.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include "util.h"
#include "init.h"

//Surface Ecran
SDL_Surface *Screen;
//variable pour gerer le quit
bool noquit=true;
//Concerne les textures
GLuint texture_terre;
//Rotation
float r;
//Fonction principale
int main( int narg,char *arg[] )
{
SDL_Init(SDL_INIT_VIDEO);
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY+100, SDL_DEFAULT_REPEAT_INTERVAL+50);
Screen = SDL_SetVideoMode(800,600,32,SDL_OPENGL);
SDL_WM_SetCaption("Systeme Solaire [Vengeur/Dante41]", NULL);
perspective();
initall();
loadtexture();
//Boucle du programme
while (noquit)
{
draw();
events();
}
SDL_Quit();
}

void draw()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity ();
gluLookAt(0,4,-13,1,0,0,0,1,0);

/* la valeur de angle doit changer au cours du temps */
glRotatef(r,0.0f,1.0f,0.0f);

glBindTexture(GL_TEXTURE_2D,texture_terre);
glutSolidSphere(2.5, 40, 20);

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

glGenTextures(1, &idTexture);

glBindTexture(GL_TEXTURE_2D, idTexture);
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);

glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);

glTexImage2D(GL_TEXTURE_2D, 0, 3, surfaceTexture->w, surfaceTexture->h, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, surfaceTexture->pixels);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, surfaceTexture->w, surfaceTexture->h,
GL_BGR_EXT, GL_UNSIGNED_BYTE, surfaceTexture->pixels);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);

if (surfaceTexture)
SDL_FreeSurface(surfaceTexture);

return true;
}
------------init.h-----------
//Init.h Fonctions d'initialisation et déclaration des prototypes
//Récupère les id de textures
extern GLuint texture_terre;
//Prototypes des fonctions
void perspective();
void draw();
void events();
bool loadBMP(char* nomFichier, GLuint& idTexture);
void loadtexture();
//Fonction d'initialisation de la perspective
void perspective()
{
glViewport(0,0,800,600);
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL);
glEnable (GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
gluPerspective (45.0f,(GLfloat)800/(GLfloat)600,0.1f,100.0f);
glMatrixMode (GL_MODELVIEW);
//Plus joli avec ca
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,1);
//Correction de perspective sur les textures
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
//Fonction de chargement des textures
void loadtexture()
{
loadBMP("terre.bmp", texture_terre);
}

----
Compilé sous Dev-C++ 4.9.8.0 avec SDL 1.2 et OpenGL sans problèmes...

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
0
Dante41 Messages postés 103 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 15 juillet 2009
21 oct. 2004 à 18:50
Pourquoi personne ne m'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
0
Rejoignez-nous