与OpenGL中的martix堆栈混淆?

Posted

技术标签:

【中文标题】与OpenGL中的martix堆栈混淆?【英文标题】:Confusion with martix stack in OpenGL? 【发布时间】:2014-01-02 07:26:40 【问题描述】:

我正在使用Lazy Foo's tutorials。我发现 glPushMatrix() 和 glPopMatrix() 函数非常混乱。我需要有人解释矩阵是如何存储的,如何使其中一个处于活动状态(如果这是您所说的)以及来自 Lazy Foo 网站的这段代码:

void render() 
 
//Clear color buffer 
glClear( GL_COLOR_BUFFER_BIT ); 

//Pop default matrix onto current matrix 
glMatrixMode( GL_MODELVIEW ); 
glPopMatrix(); 

//Save default matrix again 
glPushMatrix();

“打开”然后恢复矩阵的目的是什么?

【问题讨论】:

仅作记录,矩阵堆栈已被弃用,您不应再使用它。 【参考方案1】:

矩阵以堆栈形式存储。 glPushMatrix 推送(复制顶部并推送副本)到此堆栈。 glPopMatrix 在顶部弹出矩阵。在您的示例中,它们应该被切换,您首先按下然后弹出一个矩阵。

您使用 GL_MODELVIEW 矩阵来改变您想要绘制的内容。如果模型以 0,0,0 为中心,您可以在绘图时使用矩阵平移操作将其移动到 x,y,z。

假设您要绘制两个对象。一个在 x, y, z 另一个在 a, b, c

translate x, y, z
draw first object
translate a, b, c
draw second object

如果你这样做,你会看到第二个对象在 x+a、y+b、z+c 处绘制,因为第二个平移被添加到第一个。您需要使用 push/pop 矩阵来保存和恢复状态

push matrix //no translation at this point
translate x, y, z
draw first object
pop matrix 
translate a, b, c
draw second object

当你推送矩阵时,它会保存矩阵的当前状态,假设在原点。之后,您通过 x、y、z 翻译此矩阵,当您再次弹出时,此翻译被“还原”,并且您弹出回上次推送矩阵时的状态。当你翻译成 a、b、c 这一次它可以工作,因为我们弹出了最后一个翻译操作

【讨论】:

以上是关于与OpenGL中的martix堆栈混淆?的主要内容,如果未能解决你的问题,请参考以下文章

openGL中的多个计时器[关闭]

OpenGL 与 OpenCV 相结合的计算机视觉教程 [关闭]

如何使用 OpenGL 监控 Java 中的 GPU 使用情况?

优化流媒体vbo openg

opengl vbo建议[关闭]

OpenGL应用程序导致d3d11.dll中的堆栈溢出[关闭]