OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理

单位矩阵  对角线上都是1,其余元素皆为0的矩阵。
在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵.
它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0.

OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空间中的点(2,3,4),在OpenGL中将表示成(2,3,4,1). 齐次坐标表示方式适合于矩阵运算,也很方便地表示了无穷远的点,比如(1,0,0,0)就表示x轴上无穷远的点,因为1/0是无穷大,这里约定0/0=0.

接着要说点矩阵(线性代数)的知识。OpenGL里面的平移、旋转、缩放等变换均是线性变换,用矩阵相乘来表示。以平移变换为例,请见官方对glTranslatef函数的说明。假设有点(3,3,3),如果把该点沿x轴移动2单位,沿y轴移动3单位,沿z轴移动4单位,那么该点会是(3+2, 3+3, 4+4) = (5,6,7). 用矩阵表示是:

左边的矩阵称为平移变换矩阵,若把2、3、4换成x、y、z,则用它乘以一个齐次坐标表示的向量,就可以将该向量平移(x,y,z). 旋转变换和缩放变换都像平移变换一样可用一个矩阵来表示。这里可以不用理会这些矩阵长什么样,只需清楚它们乘以一个齐次坐标表示的向量,就可以使该向量发生需要的变换。

把平移变换矩阵记为T(x,y,z),旋转变换矩阵记为R(x,y,z,s),表示绕向量(x,y,z)旋转s角度;把向量记为X。这里只需要知道它们是矩阵就行了,现在要把一个点X,如(3,3,3,1),移动(2,2,2)单位,再绕y轴旋转30度角,用矩阵表示即R(0,1,0,30)*T(2,2,2)*X,可以理解为离X最近的矩阵最先作用。理解这个顺序很重要,这样,所有变换都可以用一串矩阵的相乘来表示,计算机里面也确实是这么做的。

介绍完基本的数学知识,下面说OpenGL的作用机制。OpenGL有个变换矩阵堆栈,堆栈就像子弹夹一样,先进的后出。OpenGL中的每个向量,在被定义之后进入到OpenGL世界中,都必须先乘以这个变换矩阵堆栈的栈顶变换矩阵。如下图所示:

理解完上面的知识,再来理解glLoadIdentity、glTranslatef、glRotatef这些函数干了什么就容易多了。这些函数就是对这个堆栈的操作:

  • glTranslatef:将T(x,y,z)右乘与堆栈的栈顶变换矩阵。右乘的解释,假设目前栈顶变换矩阵为M,那么就相当于把M修改为M*T.
  • glRotatef :将R(x,y,z,s)右乘与堆栈的栈顶变换矩阵。
  • glLoadIdentity:将堆栈的栈顶变换矩阵设置成单位矩阵。
  • glPushMatrix:将堆栈的栈顶变换矩阵复制一份,然后Push到堆栈中。所谓Push,就像塞子弹一样把一个矩阵压入到堆栈中,此时,栈顶就是这个新的矩阵了,注意定义的向量都是和栈顶变换矩阵作用的。
  • glPopMatrix:将堆栈的栈顶变换矩阵Pop出来。

该讲的讲完了,下面出几道题目练习下吧。

1、OpenGL代码是:glLoadIdentity(); glTranslate3f(4,5,1); glRotate3f(0,1,0,90); glVertex3f(1,1,1); 请问此时栈顶变换矩阵是什么?(1,1,1)这个点到了OpenGL世界中的点是什么?

答:栈顶变换矩阵是T(4,5,1)*R(0,1,0,90),(1,1,1)到OpenGL世界中的坐标是T(4,5,1)*R(0,1,0,90)*(1,1,1).

2、解释为什么使用glPushMatrix和glPopMatrix的组合可以隔离这两个函数中的变换,使之不影响后面的点?

答:glPushMatrix新压入的变换矩阵是复制了原来的栈顶变换矩阵,所以它继承了之前的变换,此后执行glTranslatef、glRotatef这些函数时,修改的是栈顶变换矩阵,在glPopMatrix之前的点都将受到栈顶变换矩阵的作用,之后用glPopMatrix,把栈顶变换矩阵Pop掉,此时的栈顶变换矩阵又还原成原来的那个栈顶变换矩阵。

3、为什么有时候glTranslate3f和glRotate3f能颠倒有时候又不能?

答:矩阵A乘以矩阵B未必等于矩阵B乘以矩阵A,当它们相等时,很多只是巧合。

OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理【转帖】相关推荐

  1. 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法

    单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素 ...

  2. 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法 .(转)

    单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素 ...

  3. OpenGL中摄像机矩阵的计算原理

    OpenGL中摄像机矩阵的计算原理 熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可.下面先介绍下摄 ...

  4. OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理

     单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上 ...

  5. OpenGL中glPushMatrix和glPopMatrix的原理

    glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...

  6. OpenGL中平移函数glTranslatef()、旋转函数glRotatef()的理解

    https://blog.csdn.net/tan_handsome/article/details/50614146 void glTranslatef(GLfloat x,GLfloat y,GL ...

  7. OpenGL中平移函数glTranslatef()、旋转函数glRotatef()的理解(非常好的文章)

    void glTranslatef(GLfloat x,GLfloat y,GLfloat z); 函数功能:沿X轴正方向平移x个单位(x是有符号数)   沿Y轴正方向平移y个单位(y是有符号数)   ...

  8. OpenGL 函数 gluLookAt() glScalef() glTranslatef() glRotatef() glFrustum() glPerspective() 的使用

    1.gluLookAt()--视图变换函数 把自己的眼睛当成是照相机,前三个参数表示眼睛的坐标,中间三个参数表示要拍照的物体的中心位置,可以理解成焦点吧, 后三个参数表示头顶的朝向,比如说头可以歪着( ...

  9. 《高效学习OpenGL》之模型变换 glTranslatef(), glRotatef(),glScalef()

    1.移动 glTranslatef (GLfloat x, GLfloat y, GLfloat z);//把当前矩阵与一个表示移动物体的矩阵相乘.这个矩阵有x, y, z指定 2.旋转 glRota ...

最新文章

  1. 关于python的一些好的书籍推荐-如果只能推荐3本关于python的书,你会推荐哪3本?...
  2. CLOUD 04:zookeeper,kafka,hadoop高可用
  3. 博客作业02---线性表
  4. floor--朝负无穷大方向取整
  5. python pack属性_python tkinter基本属性详解
  6. 你活在一个计算机模拟中吗,一麻省理工教授认为,我们更有可能生活在计算机模拟宇宙中...
  7. 前端学习(338):堆栈
  8. 2.1 物理层的基本概念
  9. WORD开发工具的控件功能?
  10. oracle运行产生的日志在哪里,运行临时表,是否有日志产生
  11. 2018-2019-1 20189208《Linux内核原理与分析》第九周作业
  12. ActiveMQ下载与安装(Linux环境下进行)
  13. esp_wifi_repeater, 全功能WiFi中继器
  14. EXE4J 错误提醒 Pleasedefine EXE4J_JAVA_HOME to point to an installes 64-bit JDK or JRE
  15. python爬虫开发 urlparse、parse_qs、urlencode、quote、unquote、urljoin 用法总结
  16. apache beam入门之编码Coder相关
  17. chromecast 协议_Chromecast和Android TV有什么区别?
  18. 【转载】英语动词过去式ed的发音规则
  19. 将活跃天数转化为等级,输入等级查询活跃天数
  20. 带领大家进入win+r(运行)

热门文章

  1. CM阿里云安装Cloudera Mananger
  2. 阿里云服务器升级node版本
  3. 北邮信通复试题c语言,『转贴』北邮信通院跑调剂的经历
  4. Java-万年历的设计与实现
  5. uniapp部分安卓字体加粗问题
  6. VS 2019报错无法打开源文件
  7. windows7笔记本怎么开热点
  8. 心理学上说:拖延——是最厉害的拒绝
  9. 全国各地出现巨坑,2012世界末日大预言
  10. Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)