我想在C + GL游戏中制作一些效果。到目前为止,我将所有精灵都画成四边形,并且它可以工作。
然而,我试图制作一个大环,有一个纹理跟随该环,因为它比内部环形纹理的四边形占用更少的内存。 我想制作的戒指类型不是圆形GL网眼环(“管”型),而是“纸”2D环。这样我就可以修改环的“宽度”,获得比简单的四环+纹理更多的效果。 到目前为止,我所有的尝试都是......有点荒谬,因为我不太了解GL的坐标(我无法理解可用的文档......我只是一个没有编码器帮助或背景的设计师。一个n00b,基本上。)
glBegin(GL_POLYGON);
for(i = 0;i < 360; i += 10){
glTexCoord2f(0, 0);
glVertex2f(Cos(i)*(H-10),Sin(i)*H);
glTexCoord2f(0, HP);
glVertex2f(Sin(i)*(H-10),Cos(i)*(H-10));
glTexCoord2f(WP, HP);
glVertex2f(Cos(i)*H,Sin(i)*(H-10));
glTexCoord2f(WP, 0);
glVertex2f(Sin(i)*H,Cos(i)*H);
}
glEnd();
这是我的最后一次尝试,它似乎从圆圈的右边缘而不是圆圈产生“旭日”。这是一个有趣的效果,但绝对不是我想要的。其他结果包括圆形看起来与四边形纹理完全相同(也就是画字母精灵)或看起来像一个流行艺术滤镜的东西,通过这个思路。
似乎我的逻辑在这里完全有缺陷,那么,获得这样一个戒指最简单的方法是什么?无需回复代码,只需为非数学技能的用户提供一些指导......
编辑:一种不同的方式来表达我想要的东西,将是一系列相互连接的旋转矩形,形成一个低分辨率的环。
答案 0 :(得分:2)
所以你想要一个环?也就是说,两个圆之间的区域具有相同的中心但半径不同?我试试这样的四边形条:
glBegin(GL_QUAD_STRIP);
for(i = 0; i <= 360; i += 10){
glTexCoord2f(WP*i/360, 0);
glVertex2f(Cos(i)*(H-10),Sin(i)*(H-10));
glTexCoord2f(WP*i/360, HP);
glVertex2f(Cos(i)*H,Sin(i)*H);
}
glEnd();
每个四边形是环的10度扇区。请注意,如果要在条带中绘制N个四边形,则需要2 *(N + 1)个点,因此我们总共绘制2 *(36 + 1)= 74个点。
答案 1 :(得分:0)
OpenGL论坛上的帖子here似乎可以满足您的需求。方法概述:
如果你想要一个圆圈提交 纹理,你可以使用三角扇。 首先,在中心绘制顶点 圈子。然后绘制顶点 使用圆圈的轮廓 cos(角度)* x和x的半径 sin(角度)* y的半径。自纹理 坐标s和t在范围内 [0 1] =&gt; s =(cos(角度)+1.0)* 0.5和 t =(sin(角度)+1.0)* 0.5。纹理 坐标的顶点坐标 圆心是(0.5,0.5)。
GLvoid draw_circle(const GLfloat radius,const GLuint num_vertex)
{
GLfloat vertex[4];
GLfloat texcoord[2];
const GLfloat delta_angle = 2.0*M_PI/num_vertex;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texID);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
glBegin(GL_TRIANGLE_FAN);
//draw the vertex at the center of the circle
texcoord[0] = 0.5;
texcoord[1] = 0.5;
glTexCoord2fv(texcoord);
vertex[0] = vertex[1] = vertex[2] = 0.0;
vertex[3] = 1.0;
glVertex4fv(vertex);
for(int i = 0; i < num_vertex ; i++)
{
texcoord[0] = (std::cos(delta_angle*i) + 1.0)*0.5;
texcoord[1] = (std::sin(delta_angle*i) + 1.0)*0.5;
glTexCoord2fv(texcoord);
vertex[0] = std::cos(delta_angle*i) * radius;
vertex[1] = std::sin(delta_angle*i) * radius;
vertex[2] = 0.0;
vertex[3] = 1.0;
glVertex4fv(vertex);
}
texcoord[0] = (1.0 + 1.0)*0.5;
texcoord[1] = (0.0 + 1.0)*0.5;
glTexCoord2fv(texcoord);
vertex[0] = 1.0 * radius;
vertex[1] = 0.0 * radius;
vertex[2] = 0.0;
vertex[3] = 1.0;
glVertex4fv(vertex);
glEnd();
glDisable(GL_TEXTURE_2D);
}