1

プリミティブを使用して3D球を描画してGL_QUAD_STRIPいますが、テクスチャ座標の設定方法がわからない場合を除いて機能します。

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;

次に、ループに追加します: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_STRIP4つ必要なことでした。次のコードでは、両方の頂点が適切に設定され、テクスチャが機能しています。

   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 に答える