OpenGL-矩阵压栈出栈浅析
2019-05-20 本文已影响0人
Tobesky
OpenGL绘制图形需要经过变化才能达到用户目的,而变换是通过矩阵进行操作的。
OpenGL一般通过视图变换、模型变换、投影变换等变换后会呈现新的状态(状态机)
而当我们在经过一系列变换后再想回到原来的状态就需要依赖OpenGL提供给我们的两个函数来实现
- 矩阵压栈 glPushMatrix()
- 矩阵出栈 glPopMatrix()
首先要明确一点,就是对于矩阵的操作都是针对矩阵的栈顶来操作的。
当前矩阵即为矩阵栈的栈顶元素
对当前矩阵进行平移、旋转等的变换操作也就是对栈顶矩阵的修改
当经过一系列的变换后,栈顶矩阵被修改,此时调用glPopMatrix()
时,栈顶矩阵被弹出,且又会恢复为原来的状态。
OpenGL对于多种矩阵变换操作,控制这些操作的命令主要用到glMatrixMode(GLenum mode);
,它的作用是指定用哪个矩阵作为当前矩阵,mode用于指定哪一种矩阵栈是其后矩阵操作的目标
mode的可选值
-
GL_MODELVIEW
: 把其后的矩阵操作施加于造型视图矩阵栈。(默认) -
GL_PROJECTION
: 把其后的矩阵操作施加于投影矩阵栈。 -
GL_TEXTURE
: 把其后的矩阵操作施加于纹理矩阵栈。
这三种模式分别对应了三种矩阵栈
在场景中存在多种矩阵变换时,glPushMatrix()
和glPopMatrix()
通常要结合glMatrixMode(GLenum mode)
运用,系统才知道具体操作的是哪个矩阵栈。
-
model
和view
矩阵里只能保存平移,旋转和缩放 -
project
矩阵里只能保存投影矩阵 -
viewport
矩阵里只能保存二维平移和缩放。