OpenGL旋转,翻译,推/弹问题

时间:2011-06-18 00:49:39

标签: opengl

我对openGL很陌生,但我一直在努力解决为什么这不起作用(不是试图解决问题,而只是想了解基本面)

所以基本上这会绘制一个旋转的三角形网格。我想要了解的是推送和弹出操作是否/如何被删除。当我拿出它们时会有随机散射。我已经尝试在绘图完成后反转旋转,切换translate和rotate命令。我想我看到的方式是我应该能够避免推/弹,而是每次使用旋转比上一次增加几度,但我显然错过了一些东西。

3 个答案:

答案 0 :(得分:2)

推/弹矩阵正在保存/恢复前一个矩阵。你不能真的避免这样做,因为你会积累翻译和轮换。

请记住:glTranslate不会定位。它构建一个转换矩阵并将其应用于当前矩阵,无论它是什么。因此,如果您进行平移,然后旋转,然后平移,则最后一次平移将位于旋转空间中,而不是与旋转相同的空间。

答案 1 :(得分:2)

OpenGL保留了转换矩阵的内部堆栈。当你调用glPushMatrix()时,它会将所有矩阵向下推一个,复制列表顶部的那个矩阵。这使您可以将变换,旋转,缩放等应用到心灵内容中,并且如果您完成后调用glPopMatrix()来移除新调整的变换矩阵,则3D世界的其余部分将根本不会发生变化。

请注意,当我说3D世界的其余部分时,下一次主循环循环时会包含您的对象。如果你不调用glPushMatrix()然后调用glPopMatrix(),你就会永久地改变世界,它会对你的对象产生(不可预测的)影响。

总而言之,总是在转换的开始和结束时调用glPushMatrix()和glPopMatrix(),除非你知道自己在做什么并希望对其他3D世界产生影响。

答案 2 :(得分:1)

您需要反转translate和rotate命令(按相反顺序):

glTranslatef(xF, yF, 0);
glRotatef(angle, 0.0f, 0.0f, 1.0f);                        

// draw

glRotatef(-angle, 0.0f, 0.0f, 1.0f);                        
glTranslatef(-xF, -yF, 0);

正如@Nicol在下面指出的那样,使用glPushMatrix / glPopMatrix可能会更快,因为glRotatef需要建立一个带有正弦和余弦的旋转矩阵。

更重要的是,由于浮点舍入误差,旋转后跟其反向旋转可能不是完全标识。这意味着如果您在内部循环中依赖此技术(如上所述),则可能会在整个绘制调用过程中累积一些实质性的浮点错误。