2010-07-18 23 views
5

Necesito tener un hemisferio en OpenGL. Encontré una función drawSphere que modifiqué para dibujar la mitad de los lats (que termina dibujando la mitad de la esfera) que es lo que quería. Lo hace correctamenteAsignación de textura de hemisferio OpenGL

Sin embargo, no sé qué debería hacer con glTexCoordf para obtener las texturas para mapear correctamente en esta media esfera. Realmente no soy genial con OpenGL, y he probado innumerables variaciones, pero no puedo conseguir que las texturas aparezcan correctamente en él.

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

¿Alguien tiene alguna idea de qué valores debería poner? O lo que necesito calcular para eso?

Gracias!

+0

En general, una textura cuadrada no se puede mapear directamente en una (hemi) esfera; hay diferentes posibilidades ¿Cómo se ve tu textura? – Thomas

+0

Es para un simple juego de pacman, honestamente incluso una sólida textura amarilla estaría bien, tal vez una cosa amarilla con ojos en ella. No es nada lujoso. – Paul

Respuesta

0

Básicamente, no debería necesitar nada sofisticado allí. El espacio de coordenadas de la textura varía de cero a uno. Así que elige algunos valores intermedios para los vértices intermedios. No puedo explicarlo más a fondo sin imagen, así que lo mejor que puedo hacer es señalarte este artículo: UV mapping, es un buen punto de partida. Espero que esto ayude como titular.

Aquí es mi suposición:

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

Recuerde que debe configurar correctamente la textura en OpenGL. Un ejemplo de llamada con textura:

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

que utiliza Java + JOGL para probarlo, así que no es uno-a-uno solución de C++, pero conceptualmente debe ser el mismo. Al menos Tiene llamadas glTexCoord2d() correctas.