1

我正在使用GL_QUAD_STRIP图元绘制一个 3d 球体,它可以工作,但我不知道如何设置纹理坐标。

我有一定数量的division将我的球体分成相等数量的纬度和经度。因此,球体的顶点使用如下划分来近似

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

    }
4

3 回答 3

1

如果您使用标准扭曲的球体纹理(如通常的地球地图),则应使用纹理坐标(如(lat/180, lon/360)),即范围 [0..1] 内的归一化值。

于 2012-04-24T08:55:09.020 回答
0

添加新变量:

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

然后将 then 添加到循环中: 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() ;

}
于 2012-04-24T09:30:28.737 回答
0

好的,问题是我只绘制了 2 个顶点并且GL_QUAD_STRIP需要 4 个。下面的代码现在已经正确设置了两个顶点并且纹理工作

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

    }

希望被卡住的人可能会发现这很有用。

于 2012-05-01T08:07:06.643 回答