【问题标题】:Texture coordinates for rendering a 3d sphere用于渲染 3d 球体的纹理坐标
【发布时间】:2012-05-04 21:06:07
【问题描述】:

我正在使用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() ;

    }

【问题讨论】:

    标签: c++ opengl geometry texture-mapping


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      添加新变量:

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

      【讨论】:

      • 那没用。它把整个球体都画成了棕色。它根本没有包装我的示例图像,它是一个跳棋(棋盘布局)图片
      • @ladiesMan217 您是否创建并启用了纹理?
      【解决方案3】:

      好的,问题是我只绘制了 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() ;
      
          }
      

      希望遇到困难的人会发现这很有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多