begin process at 2010 03 20 15:01:23
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

OpenGL

 > 

Texture d'une glutSphere


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Texture d'une glutSphere

mercredi 6 octobre 2004 à 20:22:19 | Texture d'une glutSphere

Dante41

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

jeudi 7 octobre 2004 à 14:30:47 | Re : Texture d'une glutSphere

steve_clamage

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();
}
jeudi 7 octobre 2004 à 14:34:14 | Re : Texture d'une glutSphere

steve_clamage

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.
jeudi 7 octobre 2004 à 18:41:19 | Re : Texture d'une glutSphere

Dante41

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

jeudi 7 octobre 2004 à 19:32:06 | Re : Texture d'une glutSphere

steve_clamage

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.

jeudi 7 octobre 2004 à 20:09:17 | Re : Texture d'une glutSphere

Dante41

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

vendredi 8 octobre 2004 à 14:15:49 | Re : Texture d'une glutSphere

steve_clamage

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



vendredi 8 octobre 2004 à 18:02:56 | Re : Texture d'une glutSphere

Dante41

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

vendredi 8 octobre 2004 à 18:58:35 | Re : Texture d'une glutSphere

steve_clamage

Montre moi donc le code complet, je te la ferais tourner !
vendredi 8 octobre 2004 à 19:03:29 | Re : Texture d'une glutSphere

Dante41

--------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


1 2

Cette discussion est classée dans : gl, texture, 0f, terre, glutsphere


Répondre à ce message

Sujets en rapport avec ce message

Probleme d'alpha avec SDL_ttf [ par vladisback ] Je suis entrain de m'arracher les cheuveux avec SDL_ttf, j'essai simplement d'afficher du texte de n'importe quelle couleur opaque sur un fond transpa PB POUR LA GESTION MULTIFENETRES [ par algeros ] Voici un code ://////////////////////////////////////////////////////////////////                                                          //   Name: Texture transparente [ par F0ra ] Bonjour,Je voudrais aff transparence en OpenGl [ par F0ra ] Bonjour, J'ai un problème en OpenGl Je voudrais rendre uniquement la couleur rose< Problème de placage de texture [ par unrealgun ] Bonjour,Je suis en train de développer uGUI en C++ sous linux avec SDL et OpenGL.Voila mon probleme : je charge une image PNG transparente avec SDL_Im [OpenGL] rotation [ par F0ra ] Bonjour,J'ai un problème pour réaliser une rotation en OpenGL au centre du rectangle.J'ai esayé avec glRotatef(ang,0.0,0.0,1.0);  le problème l'origni Texture avec OpenGl [ par Zakata ] Bonjour,Voila j'ai un petit soucis avec les textures et OpenGl. J'ai dans l'espoir de réussir à mettre une image de fond sur une fenetre OpenGl. J'ai OpenGL et textures [ par Jackyzgood ] Bonjour à tous ! Maintenant que je commence à être à l'aise en SDL, je me suis dis : ça pourrait être bien de passer à l'OpenGL. J'ai suivis un tuto [Débutant][OpenGL ES] Problème affichage textures [ par Niicoo ] Bonjour tout le monde,Je dois faire un jeu en OpenGL ES (Objective-c) pour IPhone.Je dois afficher une texture sur un carré (2D). Ça pas de soucis, j' Probleme sur une forme simple [ par faucheuse ] Tout d'abord je ne travaille pas sous Linux mais sous WindowsXP mais je n'ai pas trouver de sous-forum correspondant dsl.Alors voila, j'essaye de fair


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,466 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales