Opengl glPush和glPop功能

时间:2018-03-14 04:55:49

标签: opengl

我已经阅读过glPushMatrix和glPopMatrix函数以及它们如何作为保存点的形式。我正在尝试使用缩放操作绘制基本多维数据集的简单代码,我注意到了一些事情:如果绘图代码中的所有内容都是缩放然后绘制立方体,那么如果我使用Push和Pop矩阵则会有所不同功能。也就是说,如果我使用的话会有所不同:

glPushMatrix(); 
    glScalef (2.0, 0.4, 1.0); 
    glutWireCube (1.0);
glPopMatrix(); 

vs只使用:

 glScalef (2.0, 0.4, 1.0);         
 glutWireCube (1.0);

没有推和弹。

第一个将正确绘制立方体,而第二个代码(没有推动和弹出)在x轴上非常宽 - 再次,这之前和之后没有任何其他转换函数。为什么这样做?

1 个答案:

答案 0 :(得分:2)

在您的第一个示例中,正在发生的事情是

// initial transform stack: [identity]

// copies last stack item and adds to the stack: [identity][identity]
glPushMatrix();

    // multiply top of stack by scalar matrix: [identity][scale matrix]
    glScalef (2.0, 0.4, 1.0);

    // draw cube with top of stack: [identity][scale matrix]
    glutWireCube (1.0);

// pop the last item off the stack: [identity]
glPopMatrix();

// at this point, on the next loop, the stack will be [identity]

您会注意到,堆栈的结束状态与开始状态相同。

这是第二个示例中发生的事情:

第1圈

// initial transform stack: [identity]

// multiply top of stack by scalar matrix: [scale matrix]
glScalef (2.0, 0.4, 1.0);
glutWireCube (1.0);

// at this point, on the next loop, the stack will be [scale matrix]

第2圈

// current transform stack: [scale matrix]

// multiply top of stack by scalar matrix: [scale matrix * scale matrix]
glScalef (2.0, 0.4, 1.0);
glutWireCube (1.0);

// at this point, on the next loop, the stack will be [scale matrix * scale matrix]

如您所见,由于您没有清除转换,因此它会在每次迭代时累积上一个转换。

如果有帮助,您可以查看glPushMatrix以获得更多信息。