IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Sphère texturée et rotation


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Par défaut Sphère texturée et rotation
    Bjr tout le monde,
    je débute en openGL, et je voulais faire un globe terrestre texturé.
    J'utilise une glutSolidSphere() et une texture2D chargée à partir d'un TIFF,
    et des coordonnées sphériques de mapping générées par
    glTexGenf(_,_,GL_SPHERE_MAP). jusque là tout se passe bien, la sphère
    s'affiche bien texturée. Si je la bouge avec une translation par exemple,
    tout se passe bien également. Au contraire, si je la fais tourner (glRotate sur la MODEL_VIEW dans la routine d'affichage), la sphère tourne bien (on le voit
    aux imperfections du contour) mais la texture reste toujours au même
    endroit, en gros, je vois toujours la même face, comme la Lune mais je
    comprend pas parce qu'a priori les coordonnées de texture sont relatives à
    l'objet donc elles devraient tourner en même temps..
    Est-ce que j'ai oublié de modifier un état qque part ou est-ce que je fais qque chose pas dans le bon ordre ?

    Merci d'avance pour votre aide !

  2. #2
    Membre éprouvé Avatar de ken_le_videur
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 129
    Par défaut
    Il faut utiliser GL_EYE_PLANE ou GL_OBJECT_LINEAR à la place de GL_SPHERE_MAP je crois

  3. #3
    Membre expérimenté Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Par défaut
    OBJECT_LINEAR me donne bien une texture qui suit la rotation de la sphère, mais pas EYE_LINEAR. le problème est que dans les deux cas, ma texture n'est pas wrappée autour de ma sphère correctement (en gros, j'ai un planisphère et je veux un mapping sphérique traditionnel, avec écrasement de la texture au pôle). C'est GL_SPHERE_MAP qui me donne le correct mapping mais il ne suit pas automatiquement les rotations de la sphère. Peut être ce comportement est normal en openGL (c'est pas le cas en DX) mais ca m'étonne quand même. Le cas échéant, savez vous comment déplacer 'à la main' les coordonnées de texture générées ?

  4. #4
    Membre expérimenté Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Par défaut
    bon je m'en suis sorti en la faisant à la main (merci les longues heures passées il y a qques années à faire des maths en coordonnées sphériques )
    alors je poste ici une fonction qui crée des sphères au cas où ca serve un jour à qqun (elle peut même faire des parties de sphère en la modifiant juste un peu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    /*
       Crée une sphère centrée en (x,y,z), de rayon r, de précision n
       Les faces doivent être orientées CounterClockwise, n doit être pair
       method est pour choisir si les patchs sont quad (0) ou tri (1)
       Crée des coordonnées de texture pour une texture 2d plane
       Nécessite <math.h>
    */
    void createSphere(double x, double y, double z, double r,int n,int method)
    {
       int i,j;
       double t1,t2,t3;
       double e[3],p[3];
     
       if (r < 0)
          r = -r;
       if (n < 0)
          n = -n;
       if (n < 4 || r <= 0) {
          glBegin(GL_POINTS);
          glVertex3f(x,y,z);
          glEnd();
          return;
       }
     
       for (j=0;j<n/2;j++) {
          t1 = j * 2 * M_PI / n - M_PI_2;
          t2 = (j + 1) * 2 * M_PI / n - M_PI_2;
     
          if (method == 0)
             glBegin(GL_QUAD_STRIP);
          else
             glBegin(GL_TRIANGLE_STRIP);
     
          for (i=0;i<=n;i++) {
             t3 = i * 2 * M_PI / n;
     
             e[0] = cos(t1) * cos(t3);
             e[1] = sin(t1);
             e[2] = cos(t1) * sin(t3);
             p[0] = x + r * e[0];
             p[1] = y + r * e[1];
             p[2] = z + r * e[2];
             glNormal3f(e[0],e[1],e[2]);
             glTexCoord2f(1-i/(double)n,2*j/(double)n);
             glVertex3f(p[0],p[1],p[2]);
     
             e[0] = cos(t2) * cos(t3);
             e[1] = sin(t2);
             e[2] = cos(t2) * sin(t3);
             p[0] = x + r * e[0];
             p[1] = y + r * e[1];
             p[2] = z + r * e[2];
             glNormal3f(e[0],e[1],e[2]);
             glTexCoord2f(1-i/(double)n,2*(j+1)/(double)n);
             glVertex3f(p[0],p[1],p[2]);
     
          }
          glEnd();
       }
    }
    voili voilou

  5. #5
    Membre éclairé Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Par défaut
    J'ai exactement le même problème. Je voudrais afficher une sphère à l'écran avec une texture de planète. J'ai créé ma sphère avec gluSphere qui permet de générer les coordonnées de texture et les normales.
    Le problème est que l'image n'est pas correctement "mappé" sur l'objet. La texture est complètement déformé et je n'arrive même pas a voir ce qu'OpenGl a fait pour obtenir ce résultat.



    Voici le code utilisé dans init :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
    			GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
    			GL_LINEAR);
    	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
     
    	QOsphere = gluNewQuadric();
     
    	if (QOsphere) {
    		gluQuadricNormals(QOsphere, GLU_SMOOTH);	/* default */
    		gluQuadricTexture(QOsphere, GL_TRUE);	/* default */
    		gluQuadricDrawStyle(QOsphere, GLU_FILL);
    	}
    Pour afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    static void display (void)
    {	
    	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glMatrixMode (GL_MODELVIEW);
    	glLoadIdentity ();
     
    	// Camera rotation
    	glTranslated (-eye._x, -eye._y, -eye._z);
    	glRotated (rot._x, 1.0f, 0.0f, 0.0f);
    	glRotated (rot._y, 0.0f, 1.0f, 0.0f);
    	glRotated (rot._z, 0.0f, 0.0f, 1.0f);
     
     
    	tex->bind (GL_TEXTURE0); // glActiveTexture + glBindTexture
     
    	gluSphere(QOsphere,0.4, 20, 16);
    	glutSwapBuffers ();
    }
    Il y a bien sûr la possibilité de faire le mapping soit même comme l'avait suggéré Steki-kun (http://local.wasp.uwa.edu.au/~pbourk...our/spheremap/) mais j'aimerais faire fonctionner la génération automatique de texture pour comparer les performances...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une sphère texturée
    Par isa21493 dans le forum OpenGL
    Réponses: 2
    Dernier message: 09/01/2006, 16h41
  2. Texture sur d'une sphère
    Par Yellowmat dans le forum OpenGL
    Réponses: 1
    Dernier message: 16/12/2004, 10h59
  3. Texture sur un cube en rotation sous Delphi !!!
    Par Cosmo dans le forum DirectX
    Réponses: 1
    Dernier message: 06/01/2004, 21h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo