纹理映射一个圆圈

时间:2014-12-01 22:47:50

标签: c opengl textures

首先,我使用以下资源生成我的圈子。

http://slabode.exofire.net/circle_draw.shtml

现在我正在尝试使用以下方法将纹理应用于圆形,但我似乎无法使数学正确。

void drawCircle(float cx, float cy, float cz,
  float r, int points,
  float red, float green, float blue) 
{ 

  float theta;

  theta = 2 * PI / (float)points; 


  float c = cosf(theta);//precalculate the sine and cosine
  float s = sinf(theta);
  float t;
  int i;

  float x = r; //we start at angle = 0 
  float y = 0;

  float tx = c * 0.5 + 0.5;
  float ty = s * 0.5 + 0.5;

  glPushMatrix();
  glTranslatef(cx, cy, cz);

  glEnable(GL_TEXTURE_2D);
  glBindTexture(GL_TEXTURE_2D, newBelgTex);

  glBegin(GL_POLYGON); 
  // glColor3f(red/255.0, green/255.0, blue/255.0);
  for(i = 0; i < points; i++) 
  { 

    glTexCoord2f(tx, ty);
    glVertex2f(x, y);//output vertex 

    //apply the rotation matrix
    t = x;
    x = c * x - s * y;
    y = s * t + c * y;

   // Not sure how to update tx and ty
  }
  glVertex2f(-r, 0);


  glEnd();
  glPopMatrix(); 
}

我尝试了一些不同的东西,但在正确更新txty方面似乎都失败了。

1 个答案:

答案 0 :(得分:4)

无需从c和s计算tx和ty,从x和y计算它们。像这样:

float tx = (x/r + 1)*0.5;
float ty = (y/r + 1)*0.5;

在调用glTexCoord之前在内循环中执行此操作。

另外,GL_TRIANGLE_FAN对您的几何图形更有意义。为了简化拓扑,我将从位置0,0,0的中心顶点开始。这也消除了循环后的最后一个顶点,即

  glBegin(GL_TRIANGLE_FAN); 
  glTexCoord2f(0,0);
  glVertex2f(0,0);
  for(i = 0; i < points; i++) 
  { 
    float const tx = (x/r + 1)*0.5;
    float const ty = (y/r + 1)*0.5;

    glTexCoord2f(tx, ty);
    glVertex2f(x, y);

    //apply the rotation matrix
    t = x;
    x = c * x - s * y;
    y = s * t + c * y;
  }
  glEnd();

请注意,不推荐使用glBegin ... glEnd立即模式,您应该考虑构建一个VBO并上传它。