Texture coordinates for rendering a 3d sphere

狂风中的少年 提交于 2019-12-11 16:53:02

问题


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

    }

回答1:


If you used standardly distortioned sphere texture (like usual earth map) you should use texture coordinates like (lat/180, lon/360), i.e. normalized values in range [0..1].




回答2:


Add new variables :

float texX = 0.0;
float texy = 0.0;
float dTex = 1/ divisions;

then add then to the loop : float x, y, z, dTheta=180/divisions, dLon=360/divisions, degToRad=3.14/180 ;

for(float lat =0 ; lat <=180 ; lat+=dTheta, texX += dTex)
{
    texY = 0.0;
    glBegin( GL_QUAD_STRIP ) ;
    for(float lon = 0 ; lon <=360; lon+=dLon, texY += dTex )
    {  

        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) ;
        glTexCoord2f( texX, texY );
        glVertex3f( x, y, z ) ;
    }
    glEnd() ;

}



回答3:


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.



来源:https://stackoverflow.com/questions/10294345/texture-coordinates-for-rendering-a-3d-sphere

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!