与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 与 OpenCV 相结合的计算机视觉教程 [关闭]