Search code examples
c++openglgeometrytexture-mapping

Texture coordinates for rendering a 3d sphere


I am drawing a 3d sphere using GL_QUAD_STRIP primitive and it works except I don't know how to set up the texture coordinates.

I have a certain number of division that divide my sphere into equal number of latitudes and longitudes. Hence, the sphere's vertices are approximated using the divisions as follows

   float x, y, z, dTheta=180/divisions, dLon=360/divisions, degToRad=3.14/180 ;

    for(float lat =0 ; lat <=180 ; lat+=dTheta)
    {
        glBegin( GL_QUAD_STRIP ) ;
        for(float lon = 0 ; lon <=360; lon+=dLon)
        {  

            x = r*cosf(lat * degToRad) * sinf(lon * degToRad) ;
            y = r*sinf(lat * degToRad) * sinf(lon * degToRad) ;
            z = r*cosf(lon * degToRad) ;

            glNormal3f( x, y, z) ;
            glVertex3f( x, y, z ) ;

            x = r*cosf((lat + dTheta) * degToRad) * sinf(lon * degToRad) ;
            y = r*sinf((lat + dTheta) * degToRad) * sinf(lon * degToRad) ;
            z = r*cosf( lon * degToRad ) ;

            glNormal3f( x, y, z ) ;
            glVertex3f( x, y, z ) ;
        }
        glEnd() ;

    }

Solution

  • Okay the problem was that I was only drawing 2 vertices and GL_QUAD_STRIP requires 4. The following code now has both vertices set up properly and texture working

       double x, y, z, dTheta=180/divisions, dLon=360/divisions, degToRad=3.141592665885/180 ;
    
        for(double lat =0; lat <=180; lat+=dTheta)
        {
    
            glBegin( GL_QUAD_STRIP ) ;
            for(double lon =0 ; lon <=360 ; lon+=dLon)
            {  
    
    
                //Vertex 1
                x = r*cos(lon * degToRad) * sin(lat * degToRad) ;
                y = r*sin(lon * degToRad) * sin(lat * degToRad) ;
                z = r*cos(lat * degToRad) ;
                glNormal3d( x, y, z) ;
                glTexCoord2d(lon/360-0.25, lat/180);
                glVertex3d( x, y, z ) ;
    
    
                //Vetex 2
                x = r*cos(lon * degToRad) * sin( (lat + dTheta)* degToRad) ;
                y = r*sin(lon * degToRad) * sin((lat + dTheta) * degToRad) ;
                z = r*cos( (lat + dTheta) * degToRad ) ;
                glNormal3d( x, y, z ) ;
                glTexCoord2d(lon/360-0.25, (lat + dTheta-1)/(180)); 
                glVertex3d( x, y, z ) ;
    
    
                //Vertex 3
                x = r*cos((lon + dLon) * degToRad) * sin((lat) * degToRad) ;
                y = r*sin((lon + dLon) * degToRad) * sin((lat) * degToRad) ;
                z = r*cos((lat) * degToRad ) ;
                glNormal3d( x, y, z ) ;
               glTexCoord2d((lon + dLon)/(360)-0.25 ,(lat)/180);
                 glVertex3d( x, y, z ) ;
    
    
                //Vertex 4
                x = r*cos((lon + dLon) * degToRad) * sin((lat + dTheta)* degToRad) ;
                y = r*sin((lon + dLon)* degToRad) * sin((lat + dTheta)* degToRad) ;
                z = r*cos((lat + dTheta)* degToRad ) ;
                glNormal3d( x, y, z ) ;
                glTexCoord2d((lon + dLon)/360-0.25, (lat + dTheta)/(180));
                 glVertex3d( x, y, z ) ;
    
    
            }
            glEnd() ;
    
        }
    

    Hope people who get stuck may find this useful.