OpenGL学习三——矩阵堆栈

      在计算机图形学中,所有的变换都是通过矩阵相乘实现的,即物体定点构成的齐次坐标矩阵乘以三维变换矩阵就可得到变换后的物体齐次坐标矩阵。同样,在OpenGL中图远的坐标变换(移动、旋转、缩放)也是通过矩阵乘法实现的。OpenGL中比较重要的矩阵有投影矩阵和模型视图矩阵,外加纹理矩阵。矩阵堆栈基于矩阵引入,它可以以栈的形式保存相应的矩阵,压入和弹出操作同普通的栈,三种矩阵对应了三个矩阵堆栈。

      实际上在创建、装入、相乘模型视图变换和投影变换矩阵时都已经用到了矩阵堆栈。拿模型视图变换来说,在绘制复杂的场景时,会涉及到复杂的模型矩阵变换,常常我们需要保存这些变换的中间状态,以便在进行一些变换后快速恢复,而无需对当前模型矩阵进行反变换以进行恢复(费时)。比如,当前模型视图矩阵状态为矩阵A,场景绘制需要模型视图矩阵从A->B,然后从A->C......。利用矩阵堆栈,程序只需要保存矩阵A(glPushMatrix),执行完A->B后,恢复模式视图矩阵为A(glPopMatrix),执行变换A->C。很显然,使用矩阵堆栈比仅使用单个矩阵效率高很多。

      函数glPushMatrix用于将当前矩阵压入矩阵堆栈(由函数glMatrixMode指定堆栈类型),即:该函数复制栈顶矩阵(比如矩阵A),并放置在栈顶(A‘),这样矩阵堆栈顶部有两个相同的矩阵,栈顶矩阵作为当前矩阵进行后续变换。函数glPushMatrix弹出栈顶矩阵(A‘),下面一个元素变为栈顶(A),即恢复之前的模型视图状态。切记:当前矩阵永远位于堆栈顶部。矩阵堆栈是有深度的,如果压入过多矩阵或者堆栈只有一个矩阵而调用glPopMatrix将导致错误。

      代码示例:

glMatrixMode(GL_MODEVIEW); // set cur matrix mode
glPushMatrix(); // push cur matrix
    glTranslatef(*);
    glRotatef(*);
    glScalef(*);
    drawObject();
glPopMatrix();

你可能感兴趣的:(OpenGL)