for循环中的OpenGL glPushMatrix()和glPopMatrix

时间:2019-12-27 06:12:06

标签: c for-loop opengl opengl-compat

我是OpenGL的新手,我将要做类似的事情。问题是,循环似乎只被调用了一次,但是我不知道为什么循环变得像that

glDisable(GL_CULL_FACE);
int n = 32;
float angle = 0.0f;
float green = 0.0f;
float blue = 1.0f;
float color = 1.0/n;
glColor3f(0.0, 0.0, 1.0);
glTranslatef(0.0, 5.0, 0.0);
drawArrow();

for(int i = 0; i < n; i++){
    green = green + color;
    blue = blue - color;
    glPushMatrix();
        glRotatef(angle+(360/n), 0.0f, 0.0f, 1.0f);
        glColor3f(0.0, green, blue);
        drawArrow();
    glPopMatrix();
}

glEnable(GL_CULL_FACE);

2 个答案:

答案 0 :(得分:0)

问题在于所有箭头的绘制方向都相同。 您想要做的是使箭头旋转一定角度。

每个箭头的角度必须取决于循环(i)的控制变量。 2个箭头之间的角度为360.0/n,箭头的角度为360.0*i/n

glRotatef(angle+(360/n), 0.0f, 0.0f, 1.0f);

float partAngle = 360.0f * (float)i/(float)n;
glRotatef(angle + partAngle, 0.0f, 0.0f, 1.0f);

另一种选择是使用glPushMatrix / glPopMatrix。设置旋转角度后,推动矩阵,使旋转在循环中增加360.0f/n

glPushMatrix();
for(int i = 0; i < n; i++){
    green = green + color;
    blue = blue - color;

    glRotatef(angle+(360.0f/n), 0.0f, 0.0f, 1.0f);

    glPushMatrix();
        glColor3f(0.0, green, blue);
        drawArrow();
    glPopMatrix();
}
glPopMatrix();

答案 1 :(得分:0)

for (int i = 0; i < n; i++)
{
    green += color;
    blue -= color;
    angle += 360 / n;

    glPushMatrix();
        glRotatef(angle, 0.0f, 0.0f, 1.0f);
        glColor3f(0.0, green, blue);
        drawArrow();
    glPopMatrix();
}