OpenGL函数解析之glLoadIdentity()
函数原型:void glLoadIdentity(void)
函数说明:调用glLoadIdentity()函数可以恢复初始坐标系,用一个4x4的单位矩阵来代替当前矩阵,实际上就是对当前矩阵进行初始化。无论之前进行了多少次矩阵变换,在执行该函数后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换。
调用glLoadIdentity()函数之后,实际上将当前点移到了屏幕中心,类似于一个复位操作,状态如下:
- x轴从左至右,y轴从下至上,z轴从里至外。
- OpenGL屏幕中心的坐标值是x轴和y轴的0.0f点。
- 中心左面的坐标值是负值,右面是正值。
- 移向屏幕顶端是正值,移向屏幕底端是负值。
- 移向屏幕深处是负值,移出屏幕则是正值。
glLoadIdentity()函数在语义上等同于单位矩阵调用glLoadMatrix()函数,但是在一些情况下,glLoadIdentity()更有效率。
为什么要使用glLoadIdentity()函数?
由于某些原因可能使得当前矩阵中的元素有一些不确定的值,这将导致程序对图形对象进行几何变形时得到一个非预期的结果。因此有必要将当前矩阵初始化成一个单位矩阵,即对图形对象不做任何变换。这就是为什么在调用过glMatrixMode()命令后,总是要调用该命令的原因。由于glMatrixMode()命令本身也是一种矩阵变换,它将当前矩阵变成命令参数所规定的形式,若不用单位矩阵来替换它,在此矩阵下绘制出的图形将是难以预计的。
PS:用单位矩阵替换当前矩阵并不改变当前矩阵模式。
用一个单位矩阵来替换当前矩阵的做法并非在任何场合下都可以使用。例如,已经进行了3次矩阵变换,而现在打算将当前矩阵恢复到第二次变换后的状态时,该方法将失效。此时可用glPushMatrix()命令将每次变换前的矩阵压入矩阵堆栈,在进行完新矩阵中的各种操作后,再利用glPopMatrix()命令将栈顶的矩阵弹出矩阵堆栈,成为当前矩阵。
OpenGL函数解析之glLoadIdentity()的更多相关文章
- OpenGL函数解析之gluPerspective()
函数原型: void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar); 参数说明: fovy:指定 ...
- OpenGL函数解析之glMatrixMode(GLenum mode)
函数原型:void glMatrixMode(GLenum mode) 函数说明:glMatrixMode函数只有一个枚举类型的参数mode,用来指定哪一个矩阵堆栈式下一个矩阵操作的目标. mode有 ...
- OpenGL函数思考-glLoadIdentity
函数原型: void glLoadIdentity(void) 函数说明: OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()命令.该命令是一个无参 ...
- OpenGL函数思考-glColor
http://blog.csdn.net/shuaihj/article/details/7231980 OpenGL函数思考-glColor 函数原型: glColor3b,glColor ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- PHP json_decode 函数解析 json 结果为 NULL 的解决方法
在做网站 CMS 模块时,对于模块内容 content 字段,保存的是 json 格式的字符串,所以在后台进行模块内容的编辑操作 ( 取出保存的数据 ) 时,需要用到 json_decode() 函数 ...
- Matlab中bsxfun和unique函数解析
一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...
- opengl 函数
( 7 )光栅化.象素操作函数. 像素位置 glRasterPos*() .线型宽度 glLineWidth() .多边形绘制模式 glPolygonMode() ,读取象素 glReadPixel( ...
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
随机推荐
- You need to use a Theme.AppCompat theme
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dji.sdk.sample/com.dji.sdk.sa ...
- HUST 1010 The Minimum Length(KMP,最短循环节点,即i-Next[i])
题意: 有一个字符串A,假设A是“abcdefg”, 由A可以重复组成无线长度的AAAAAAA,即“abcdefgabcdefgabcdefg.....”. 从其中截取一段“abcdefgabcde ...
- HDU 3709 Balanced Number (数位DP)
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- Linux命令(15)查看系统版本信息
一,查看Linux内核版本命令(两种方法) 1.cat /proc/version [user@fgejjw7Z home]$ cat /proc/version Linux version -.el ...
- vim 学习日志(2):set的使用方法
一,打开或关闭行号(number) 如果希望每次进入vi 会话时都显示行号,那么在主目录中的.exrc 文件中添加 set number 行. 在命令模式下,使用如下命令 :set all ...
- Think in UML笔记第1章--为什么要UML
1.1 面向过程还是面向对象 面向过程和面向对象都是一种软件技术.例如把面向过程归纳为结构化程序设计.DFD图.ER模型.UC矩阵等,而面向对象则被归纳为继承.封装.多态.复用等具体的技术.事实上,上 ...
- http头信息
请求头:用于告诉服务器,客户机支持的数据类型accept-charset:用于告诉服务器,客户机采用的编码accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式Host:客户机通过这 ...
- ruby的optparse使用小记
#自定义转换器 1 opts.accept(Hash) do |string| hash = {} string.split(',').each do |pair| key,value = pair. ...
- javascript代码注意事项
1 代码行末要加分好.原因<<javascript高级程序设计第三版21页第三行>> 2 初始化变量应该加上默认值因为使用typeof时 未声明和声明为初始化的值都返回unde ...
- 在Windows驗證網站設定部分匿名存取
最近接連遇到幾次的需求:供內部使用的ASP.NET網站,全站使用Windows驗證,使用者以網域AD帳號登入,但網站包含少數API性質的ASHX.ASPX或MVC Action,提供其他系統呼叫整合. ...