与OpenGL中的martix堆栈混淆?

0ct*_*gon 0 c++ opengl matrix

我正在使用Lazy Foo的教程.我发现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();
Run Code Online (Sandbox Code Playgroud)

"打开"然后恢复矩阵服务的目的是什么?

小智 7

矩阵以堆栈形式存储.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
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你会看到第二个对象是在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
Run Code Online (Sandbox Code Playgroud)

当你推动矩阵时,它会保存矩阵的当前状态,假定它位于原点.之后你用x,y,z翻译这个矩阵,当你再次弹出时,这个翻译被"恢复",当你上次推送一个矩阵时,你会弹出回状态.当你翻译成a,b,c这次它起作用,因为我们弹出了最后的翻译操作