【问题标题】:OpenGL glPushMatrix() and glPopMatrix in for loopfor循环中的OpenGL glPushMatrix()和glPopMatrix
【发布时间】:2019-12-27 06:12:06
【问题描述】:

我是 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);

【问题讨论】:

  • 这里的期望是什么?
  • 您已经用不同颜色显示了旋转箭头的图片,我同意显示的代码有点出乎意料。但是你期待什么?也许是一个随时间改变颜色的箭头?
  • angle+(360/n) 每次都一样。

标签: c for-loop opengl opengl-compat


【解决方案1】:

问题是所有箭头都以相同的方向绘制。 您要做的是将箭头的旋转向前推进一个角度。

每个箭头的角度必须取决于循环的控制变量 (i)。两个箭头的夹角是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();

【讨论】:

  • “箭头的角度是 360.0*i/n”是什么意思?我没有看到 - 不在一对 push/pop 中,我希望在每个循环迭代中重置 glRotatef() 的效果。
  • 请详细说明。我在你的措辞中没有得到“那个”。您的解释与图片相符,但与OP显示的代码不符。
  • 啊,我明白了,所以你猜 OP 显示的图片是所需的输出,而不是不想要的输出。不是一个不合理的猜测——但在我看来仍然是一个猜测。谢谢你的解释。然而我读到“我不知道为什么它变成了。”作为“为什么我会看到这个意想不到的结果?”。阅读“我怎样才能达到预期的效果?”对我来说似乎有些牵强。我希望 OP 能回答....
【解决方案2】:
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();
}

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2015-02-25
    • 2011-10-18
    相关资源
    最近更新 更多