首先,我使用以下资源生成我的圈子。
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();
}
我尝试了一些不同的东西,但在正确更新tx
和ty
方面似乎都失败了。
答案 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并上传它。