OpenGL学习三——矩阵堆栈
来源:互联网 发布:矩阵特征值和秩的关系 编辑:程序博客网 时间:2024/05/18 17:57
在计算机图形学中,所有的变换都是通过矩阵相乘实现的,即物体定点构成的齐次坐标矩阵乘以三维变换矩阵就可得到变换后的物体齐次坐标矩阵。同样,在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 modeglPushMatrix(); // push cur matrix glTranslatef(*); glRotatef(*); glScalef(*); drawObject();glPopMatrix();
- OpenGL学习三——矩阵堆栈
- OpenGL的矩阵堆栈
- OpenGL的矩阵堆栈
- OpenGL(三)图形变换之矩阵堆栈
- 《高效学习OpenGL》之 操作矩阵堆栈 glPushMatrix(),glPopMatrix()
- opengl矩阵堆栈的常识
- SCARA——OpenGL入门学习三
- OpenGL使用矩阵堆栈glpushMatrix的原因
- 《高效学习OpenGL》 之 点块纹理 纹理矩阵堆栈 q坐标
- OpenGL超级宝典学习笔记——操作矩阵
- 【OpenGL】OpenGL系列——03堆栈操作
- OpenGl 学习——三种变换的理解
- OpenGL ES学习之三——贴图
- 学习OpenGL总结三
- OpenGL入门学习[三]
- OpenGL学习笔记(三)
- OpenGL入门学习[三]
- OpenGL入门学习[三]
- 深入理解HTTP消息头
- 19. 3. 2. 获取百度主页内容 Chain the InputStream to a Reader
- Web前端开发规范文档
- Android自定义控件——TabButton
- Cover flow基本原理及Tapku实现方法
- OpenGL学习三——矩阵堆栈
- Ruby中,ActiveRecord 初次使用心得(三)
- vs下qt工程设置exe图标
- NoSQL
- 【Android编程之旅】有奖征集活动开始啦!
- DES With Perl
- 显示当前行号、文件名和函数名(二)
- target runtime apache tomcat v6.0 is not defined
- HTML弹出对话框页面