我对OpenGL推送/弹出矩阵的理解是否有误?

我对OpenGL推送/弹出矩阵的理解是否有误?,opengl,matrix,drawing,translation,Opengl,Matrix,Drawing,Translation,我在OpenGL中偶然发现了一个无法解释的问题,除非我不知何故误解了glPushMatrix()/glPopMatrix()的工作原理 下面的两段代码不应该有完全相同的效果吗 glPushMatrix(); glVertex3f(0,0,0); glTranslatef(c->e->coords[0], c->e->coords[1], c->e->coords[2]); glPopMatrix(); vs 在我的应用程序中,只有当我使用第二

我在OpenGL中偶然发现了一个无法解释的问题,除非我不知何故误解了
glPushMatrix()
/
glPopMatrix()
的工作原理

下面的两段代码不应该有完全相同的效果吗

  glPushMatrix();
  glVertex3f(0,0,0);
  glTranslatef(c->e->coords[0], c->e->coords[1], c->e->coords[2]);
  glPopMatrix();
vs


在我的应用程序中,只有当我使用第二个时,我才能看到任何东西。我尝试将两段代码放在代码中完全相同的位置,没有改变任何其他内容,而带有push/pop矩阵的代码在屏幕上没有绘制任何内容。

您很接近,但我认为您应该在第一段代码中交换glVertex/glTranslate的顺序


调用glVertex时,将使用堆栈顶部的当前矩阵绘制它。调用“平移”仅影响正在绘制的后续顶点;不能移动已提交的顶点。

不能在
glBegin()/glEnd()块内调用
glPushMatrix()/PopMatrix()

:

glBegin和glEnd之间只能使用GL命令的一个子集。 命令包括glVertex、glColor、glSecondaryColor、glIndex、, glNormal、glFogCoord、glTexCoord、glMultiTexCoord、glVertexAttrib、, glEvalCoord、glEvalPoint、glArrayElement、glMaterial和glEdgeFlag。 此外,可以使用glCallList或glCallList执行 显示仅包含前面命令的列表。如果有的话 GL命令在glBegin和glEnd之间执行,错误标志为 设置,则忽略该命令


建议:使用或替代经典立即模式
glBegin()/glEnd()
块。

这里有几个问题。首先,不能将矩阵运算与顶点运算混合使用——我假设这是一种简写,您跳过了glBegin()/glEnd()。但主要的问题是,在转换之前,已将顶点发送到原点。把这两行颠倒过来,你就会得到想要的结果。

是的,我考虑过这一点,我尝试了两种方法(一种是先翻译,另一种是再翻译)。问题是它位于glBegin()/glEnd()块中。谢谢
  glVertex3f(c->e->coords[0], c->e->coords[1], c->e->coords[2]);