2010-07-18 7 views
5

J'ai besoin d'avoir un hémisphère en opengl. J'ai trouvé une fonction drawSphere que j'ai modifiée pour dessiner la moitié du lats (ce qui finit par dessiner la moitié de la sphère) ce qui est ce que je voulais. Il le fait correctement.OpenGL Hémisphère Texture Mapping

Cependant, je ne sais pas ce que je devrais faire avec glTexCoordf pour que les textures soient correctement mappées sur cette demi-sphère. Je ne suis vraiment pas génial avec opengl, et j'ai essayé d'innombrables variations, mais je n'arrive pas à faire apparaître les textures correctement.

void drawHemisphere(double r, int lats, int longs) 
{ 
    int i, j; 
    int halfLats = lats/2; 
    for(i = 0; i <= halfLats; i++) 
    { 
     double lat0 = M_PI * (-0.5 + (double) (i - 1)/lats); 
     double z0 = sin(lat0); 
     double zr0 = cos(lat0); 

     double lat1 = M_PI * (-0.5 + (double) i/lats); 
     double z1 = sin(lat1); 
     double zr1 = cos(lat1); 

     glBegin(GL_QUAD_STRIP); 
     for(j = 0; j <= longs; j++) 
     { 
      double lng = 2 * M_PI * (double) (j - 1)/longs; 
      double x = cos(lng); 
      double y = sin(lng); 

      // glTexCoordf() 
      glNormal3f(x * zr0, y * zr0, z0); 
      glVertex3f(x * zr0, y * zr0, z0);  

      // glTexCoordf() 
      glNormal3f(x * zr1, y * zr1, z1); 
      glVertex3f(x * zr1, y * zr1, z1); 
     } 
     glEnd(); 
    } 
} 

Quelqu'un at-il une idée des valeurs que je devrais mettre? Ou ce que j'ai besoin de calculer pour cela?

Merci!

+0

En général, une texture carrée ne peut pas être directement mappée sur une (hémi) sphère; il y a différentes possibilités. À quoi ressemble votre texture? – Thomas

+0

Son pour un jeu pacman simple, si honnêtement même la texture jaune solide serait bien, peut-être une chose jaune avec des yeux là-dessus. Ce n'est rien d'extraordinaire. – Paul

Répondre

0

Fondamentalement, vous ne devriez pas avoir besoin de quelque chose de fantaisie là-bas. L'espace de coordonnées de texture s'étend de zéro à un. Donc, choisissez quelques valeurs intermédiaires pour les sommets entre. Je ne peux pas l'expliquer plus complètement sans image, donc le mieux que je peux faire est de vous pointer vers cet article: UV mapping, c'est un bon point de départ. J'espère que cela aidera en tant que starter.

Voici mon hypothèse:

{ 
    double lng = 2 * M_PI * (double) (j - 1)/longs; 
    double x = cos(lng); 
    double y = sin(lng); 

    double s1, s2, t; 
    s1 = ((double) i)/halfLats; 
    s2 = ((double) i + 1)/halfLats; 
    t = ((double) j)/longs; 

    glTexCoord2d(s1, t); 
    glNormal3d(x * zr0, y * zr0, z0); 
    glVertex3d(x * zr0, y * zr0, z0); 

    glTexCoord2d(s2, t); 
    glNormal3d(x * zr1, y * zr1, z1); 
    glVertex3d(x * zr1, y * zr1, z1); 
} 

Souvenez-vous de définir correctement la texture dans OpenGL. Un appel exemple avec la texture:

glActiveTexture(GL_TEXTURE0); 
    glMatrixMode(GL_TEXTURE); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 

    // texture must be bound & enabled 
    texture.bind(); 
    texture.enable(); 
    drawHemisphere(1, 40, 40); 
    texture.disable(); 

J'utilise Java + JOGL pour le tester, il est donc pas un à une solution C++, mais sur le plan conceptuel, il devrait être le même. Au moins, vous avez des appels glTexCoord2d() appropriés.