OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理【转帖】
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这些函数干了什么就容易多了。这些函数就是对这个堆栈的操作:
该讲的讲完了,下面出几道题目练习下吧。 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原理【转帖】相关推荐
- 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法
单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素 ...
- 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法 .(转)
单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素 ...
- OpenGL中摄像机矩阵的计算原理
OpenGL中摄像机矩阵的计算原理 熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可.下面先介绍下摄 ...
- OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理
单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上 ...
- OpenGL中glPushMatrix和glPopMatrix的原理
glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...
- OpenGL中平移函数glTranslatef()、旋转函数glRotatef()的理解
https://blog.csdn.net/tan_handsome/article/details/50614146 void glTranslatef(GLfloat x,GLfloat y,GL ...
- OpenGL中平移函数glTranslatef()、旋转函数glRotatef()的理解(非常好的文章)
void glTranslatef(GLfloat x,GLfloat y,GLfloat z); 函数功能:沿X轴正方向平移x个单位(x是有符号数) 沿Y轴正方向平移y个单位(y是有符号数) ...
- OpenGL 函数 gluLookAt() glScalef() glTranslatef() glRotatef() glFrustum() glPerspective() 的使用
1.gluLookAt()--视图变换函数 把自己的眼睛当成是照相机,前三个参数表示眼睛的坐标,中间三个参数表示要拍照的物体的中心位置,可以理解成焦点吧, 后三个参数表示头顶的朝向,比如说头可以歪着( ...
- 《高效学习OpenGL》之模型变换 glTranslatef(), glRotatef(),glScalef()
1.移动 glTranslatef (GLfloat x, GLfloat y, GLfloat z);//把当前矩阵与一个表示移动物体的矩阵相乘.这个矩阵有x, y, z指定 2.旋转 glRota ...
最新文章
- 关于python的一些好的书籍推荐-如果只能推荐3本关于python的书,你会推荐哪3本?...
- CLOUD 04:zookeeper,kafka,hadoop高可用
- 博客作业02---线性表
- floor--朝负无穷大方向取整
- python pack属性_python tkinter基本属性详解
- 你活在一个计算机模拟中吗,一麻省理工教授认为,我们更有可能生活在计算机模拟宇宙中...
- 前端学习(338):堆栈
- 2.1 物理层的基本概念
- WORD开发工具的控件功能?
- oracle运行产生的日志在哪里,运行临时表,是否有日志产生
- 2018-2019-1 20189208《Linux内核原理与分析》第九周作业
- ActiveMQ下载与安装(Linux环境下进行)
- esp_wifi_repeater, 全功能WiFi中继器
- EXE4J 错误提醒 Pleasedefine EXE4J_JAVA_HOME to point to an installes 64-bit JDK or JRE
- python爬虫开发 urlparse、parse_qs、urlencode、quote、unquote、urljoin 用法总结
- apache beam入门之编码Coder相关
- chromecast 协议_Chromecast和Android TV有什么区别?
- 【转载】英语动词过去式ed的发音规则
- 将活跃天数转化为等级,输入等级查询活跃天数
- 带领大家进入win+r(运行)