2010-07-18 11 views
5

ho bisogno di avere un emisfero in OpenGL. Ho trovato una funzione drawSphere, che ho modificato per disegnare la metà dei lats (che finisce per disegnare la metà della sfera), che è quello che volevo. Lo fa correttamente.OpenGL emisfero Texture Mapping

Tuttavia, non so cosa dovrei fare con glTexCoordf per ottenere il corretto posizionamento delle trame su questa mezza sfera. Io non sono davvero grande con OpenGL, e ho provato innumerevoli varianti, ma non riesco proprio a trovare le texture per visualizzare correttamente su di esso.

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

Qualcuno ha idea di quali valori dovrei inserire? O cosa devo calcolare per questo?

Grazie!

+0

In generale, una trama quadrata non può essere direttamente mappata su una sfera (emi); ci sono diverse possibilità. Com'è la tua texture? – Thomas

+0

È per un semplice gioco di pacman, quindi anche la consistenza di un solido giallo va bene, forse una cosa gialla con gli occhi puntati su di esso. Non è niente di speciale. – Paul

risposta

0

In sostanza, non dovrebbe essere necessario qualcosa di fantasia lì. coordinata della texture intervalli spaziali da zero a uno. Quindi scegli alcuni valori intermedi per i vertici in mezzo. Non posso spiegarlo più a fondo senza immagine, quindi il meglio che posso fare è indicarti questo articolo: UV mapping, è un buon punto di partenza. Spero che questo aiuti come antipasto.

Ecco la mia ipotesi:

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

Ricordati di impostare correttamente texture in OpenGL. Una chiamata ad esempio con trama:

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

ho usato Java + JOGL di provarlo, quindi non è uno-a-uno soluzione C++, ma concettualmente dovrebbe essere lo stesso. Almeno hai corretto glTexCoord2d() chiamate.

Problemi correlati