我已经阅读过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轴上非常宽 - 再次,这之前和之后没有任何其他转换函数。为什么这样做?
答案 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以获得更多信息。