glPushMatrix()和glPopMatrix()

网上很多讲解上述两个函数原理的文章,但都是越描越黑,越讲越让人糊涂,针对这样的问题,我认为应该先把工程上的问题抽象成简单的数学模型,然后在数学的角度理解起来更为容易。

openGL是个状态机,每个状态变量的变化又是一个马尔科夫链,也就是说后一个变化是基于前一个的。

这里假设我们要处理的三维模型某个状态变量初值为M,这里M是矩阵(应该是单位矩阵),那假如说经过一系列的状态变化A1,A2,……,An。

也就是M乘上这n个矩阵——M*A1*A2*……*An,如果这时候我们需要对M进行线性变换,我们需要线性变换直接发生在M身上,假设该线性变换为B,如果直接做变换,就变成了M*A1*A2*……*An*B,看到这时候B并没有直接作用到M身上,这是因为矩阵的乘法不满足交换律。只有极个别的情况下,矩阵乘法可交换。

这时候就需要调用glPushMatrix函数,先把先前的变换入栈,M*A1*A2*……*An就变成了M,然后在做变换,则M*B,最后调用glPopMatrix,把先前的变换出栈,则M*B*A1*A2*……*An,达到了我们想要的结果。

时间: 2024-10-12 02:32:30

glPushMatrix()和glPopMatrix()的相关文章

OpenGL中glPushMatrix和glPopMatrix的原理

glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPushMatrix,然后再调用一堆平移.旋转代码等等,然后再绘图.那些平移和旋转都是基于左上角为原点进行变化的.并且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了. 那假设想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个"状态"了,这个状态就是你调用glPushMa

通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用

通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用 (2012-04-02 09:17:28) 转载▼ 对于glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用虽然网上有很多的帖子,而且都试图解释得很详细,但是效果总是越说越黑,模棱两可的.今天我就简单滴说几句,言简意赅,希望大家随便看看之余能把这些个问题搞清楚了.glLoadIdentity()的作用就是把矩阵堆栈中的在栈顶的那个矩阵置为单位矩阵,

三维图像技术与OpenGL基础理论

英文原文:3D Graphics with OpenGL Basic Theory 中文译文:三维图像技术与OpenGL基础理论 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于栅格的格式.一个栅格既是一张二维的像素直角坐标网.像素具有两个属性:颜色和位置.颜色通常使用RGB(红绿蓝)来表示,典型的有用8位或者24位二进制位(真彩色)表示一种颜色.位置则用坐标(x,

清华版CG 实验5 OpenGL模型视图变换

1.实验目的: 理解掌握OpenGL程序的模型视图变换. 2.实验内容: (1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换: (2)根据示范代码,尝试完成实验作业: 3.实验原理: 在OpenGL程序中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换. 1.在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵. 2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换.如果程序没有调用g

OpenGL-选择与拾取

转自:http://blog.sina.com.cn/s/blog_4a9aa55c0100vu57.html 以下内容主要整理<OpenGL编程指南>第13章的内容.主要解决以下问题: (1)如何允许用户选择屏幕上的一块区域或者挑选屏幕上所绘制的一个物体? 一. 选择 1. OpenGL的选择机制如何实现 当我们打算使用OpenGL的选择机制时: (1)首先把整个场景绘制到帧缓冲区中: (2)然后进入选择模式,并且对场景进行重绘,此时,帧缓冲区的内容将不会被修改: (3)退出选择模式时,Op

OpenGL入门学习

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的

OpenGL ES 简单教程

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. OpenGL ES 定义了一个在移动平台上可以支持OpenGL最基本功能的精简标准.以适应如手机.PDA或其他消费者移动终端的显示系统. Khronos Group 定义和管理了OpenGL ES标准. OpenGL 与 OpenGL ES的关系OpenGL ES 是基于桌面版本号OpenGL 的

初学DirectX11, 留个纪恋。

以前学的是openGL, 最近才开始学DirectX11,写了个很垃圾的代码,怀念以前的glPushMatrix(), glPopMatrix(), glBegin(), glEnd(), 多简单啊,可惜在openGL4后面的版本中放弃了这些经典的函数,改成了跟directX差不多的自定义管线, 我觉得openGL已经被改的面目全非了,可能是openGL慢的缘故吧.openGL4.3的VAO,VBO还是不能理解. 写了个垃圾的程序,许多个几何体,自己写函数实现了以前glPushMatrix(),

Assignment 2 使用OpenGL画安卓机器人

一. 实现简述 Assignment 2 Report 目标:画一个安卓机器人. 代码结构:在 glutDisplayFunc(drawRobot)中的参数 drawRobot 函数是实 现画机器人的最外层函数,其中包括画脸.画身体.画手和画脚.每个函数又继 续细分画的步骤和方法.如下图所示: 二. 心得体会 这次任务让我对 OpenGl 有了初步认识.通过阅读课本和网上的资料,掌握 使用 OpenGl 的基本功能,比如如何画基本的点.线和多边形.并理解了一些之 前没明白的重要概念,比如 glL