计算机图形学OpenGL中的glLoadIdentity、glTranslatef
文章推薦指數: 80 %
glRotatef :将R(x,y,z,s)右乘与堆栈的栈顶变换矩阵。
glLoadIdentity:将堆栈的栈顶变换矩阵设置成单位矩阵。
glPushMatrix:将堆栈的栈顶变换矩阵复制一份,然后 ...
开发者社区>
范大脚脚>
正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开
计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法
2017-11-14
1833
简介:
+关注继续查看
单位矩阵 对角线上都是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中,函数glTranslatef的作用就是移动坐标原点。
对应的3个参数对应着3个坐标轴。
如果你调用一次glTranslatef(1.0f,0.0f,0.0f)然后画一个小球,接着再调用次glTranslatef(0.0f,1.0f,0.0f)再画一个小球。
此时,两个小球中,一个在另外一个正右方。
所以,如果要使两个小球分别处于x、y轴,则需要在第二次画之前调用glLoadIdentity()函数,使坐标原点归位。
另外,此处的坐标系为右手坐标系。
切记切记。
2、glPushMatrix、glPopMatrix操作其实就相当于栈里的入栈和出栈。
许多人不明白的可能是入的是什么,出的又是什么。
我也是自己反复做了下测试才懂的(利用无聊的web上机时间)。
例如你当前的坐标系原点在你电脑屏幕的左上方。
现在你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再画图。
那些平移和旋转都是基于坐上角为原点进行变化的。
而且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。
那如果想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。
就如很多opengl的书上所讲:调用glPushMatrix其实就是把当前状态做一个副本放入堆栈之中。
glLoadIdentity()
将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
3.中心左面的坐标值是负值,右面是正值。
移向屏幕顶端是正值,移向屏幕底端是负值。
移入屏幕深处是负值,移出屏幕则是正值。
glTranslatef(x,y,z)
沿着X,Y和Z轴移动。
注意在glTranslatef(x,y,z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。
其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
/////////////////////////////////////////////////////////////////////////////////////
程序的运行结果如下:
左边的三角形是第一步绘制的,可以看到该三角形绘制的坐标系,实际上是以(-1.5f,0.0f,-6.0f)为原点的。
第二个三角形绘制的时候,由于使用glLoadIdentity()使原点重新回到屏幕中心来,因此其原点位于屏幕的中心。
glRotatef(angle,x,y,z)
与glTranslatef(x,y,z)类似,glRotatef(angle,x,y,z)也是对坐标系进行操作。
旋转轴经过原点,方向为(x,y,z),旋转角度为angle,方向满足右手定则。
////////////////////////////////////////////////////////////////
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
////////////////////////////////////////////////////////////////
在未旋转的情况下如图所示:
////////////////////////////////////////////////////////////////
glLoadIdentity();
glRotatef(45,0.0f,0.0f,1.0f);
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
////////////////////////////////////////////////////////////////
绕Z轴正向旋转45度角,因为Z轴正方向由屏幕内指向屏幕外,由右手定则可知方向为逆时针转动。
由于直角顶点即为原点,因此将围绕直角逆时针旋转。
////////////////////////////////////////////////////////////////
glLoadIdentity();
glRotatef(45,0.0f,0.0f,1.0f);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/5782555.html,如需转载请自行联系原作者
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。
具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。
如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
图形学
应用图形学
图形图表
图形乱码
图形问题
图形配置
开发者社区>
人工智能
>
文章
作者高分内容
更多
【译】初识SSRS----通向报表服务的阶梯系列(一)
2801
【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
7132
光影中的十大非常学校
1534
最新历史版本:Android修改system只读权限:remount
2553
android文件关联之mimetype
2503
相关文章
一个处女座的程序猿
ML之LassoR&RidgeR:基于datasets糖尿病数据集利用LassoR和RidgeR算法(alpha调参)进行(9→1)回归预测
ML之LassoR&RidgeR:基于datasets糖尿病数据集利用LassoR和RidgeR算法(alpha调参)进行(9→1)回归预测
19
0
士别三日wyx
BUUCTFWeb[极客大挑战2019]Havefun
大挑战2019]Havefun
一、题目简介
88
0
c位出道
deleteinST05trace-deletionwillalsoleadtomanyDBaccessfirst
deleteinST05trace-deletionwillalsoleadtomanyDBaccessfirst
34
0
lilongthinker
ZerotoJupyterHubwithKubernetes@aliyun
##序言
JupyterHub是一个可以支持多个客户同时在线的Jypter管理平台
###JupyterHub的目标
•AcloudprovidersuchasGoogleCloud,MicrosoftAzure,AmazonEC2,IBMCloud,AlibabaCloud…
•Kubernetestomanageresourcesonthe
1508
0
技术小能手
独家对话AAAI、ACM、ACL三会会士RaymondJ.Mooney|香侬专栏
德克萨斯大学奥斯汀分校计算机系教授、人工智能实验室主任RaymondJ.Mooney带领他的人工智能小组研究了多个领域,目前他的主要研究方向是自然语言处理和计算语言学。
其本人曾在2008-2011年间担任国际机器学习协会(ICML主办方)主席,曾多次担任ICML、ACL、AAAI、EMNLP、NAACL等会议主席或领域主席,现在为美国计算机学会(ACM)、国际人工智能学会(AAAI)、国际计算语言学会(ACL)三会会士。
2200
0
技术小阿哥
RHCE学习<11>RHEL6打印服务、ISCSI存储、磁盘加密LUKS和grub引导
1351
0
余二五
Youshouldrebuildusinglibgmp>=5toavoidtimingattackvulnerability.
1225
0
吞吞吐吐的
IntroductiontoASP.NETWebProgrammingUsingtheRazorSyntax(C#)
898
0
李振良
RHCE学习<11>RHEL6打印服务、ISCSI存储、磁盘加密LUKS和grub引导
2103
0
杰克.陈
使用ASP.NETWebApi构建基于REST风格的服务实战系列教程【六】——实现资源间的关联
原文:使用ASP.NETWebApi构建基于REST风格的服务实战系列教程【六】——实现资源间的关联
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html前言这一篇文章主要介绍一下资源间的关联——例如在学生和课程之间就存在这样的关联:每一个...
929
0
+关注
范大脚脚
3656
文章
0
问答
作者高分内容
更多
【译】初识SSRS----通向报表服务的阶梯系列(一)
2801
【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
7132
光影中的十大非常学校
1534
最新历史版本:Android修改system只读权限:remount
2553
android文件关联之mimetype
2503
文章排行榜
最热
最新
1
业务中台之上的低代码应用开发平台
299158
2
挑战8天完成职场入门-进阶,速来抢占求职训练营名额
104536
3
阿里云云原生加速器企业硬之城携手阿里云Serverless应用引擎(SAE)打造低代码平台
88043
4
十分钟生成影视级室内设计效果,红星美凯龙设计云如何升级传统家居行业
127297
5
【AI征文】初识DeepRec
74323
6
一张图进阶RocketMQ-消费者这个大冤种!
27822
7
用ModelScope带你制作小动画
28188
8
ModelScope--人像卡通化、人像美肤
27412
9
揭秘!真假美猴王与如来的那起运维事故
51027
10
镜像站体验官新一期任务发布,完善镜像站配置信息拿天猫精灵音箱
52723
11
云上解锁Web3.0阿里云XR平台助力彼真科技呈现沉浸式演唱会
84876
12
“穿越”到虚拟世界笑风生,网易瑶台沉浸式活动平台创新云端活动体验
96432
13
[使用ModelScope]只要5分钟,快速实现中文情感分类模型
26350
14
阿里云联合平行云推出云XR平台,支持沉浸式体验应用快速落地|电子书免费下载
51521
15
用简历实体模型分析人力资源情况
25528
16
世界那么大,我想去看看——探索ModelScope之零样本分类
25304
17
ModelScope模型库体验之中文StructBERT系列预训练语言模型
22421
18
【AI征文】DeepRec初识
18236
19
【乘风伯乐奖】寻找百位乘风者伯乐,邀请新博主入驻即可获奖
20159
20
【AI征文】对DeepRec认识以及了解
102981
1
组装式应用在工作中的实践
64
2
【云原生|Docker篇】程序猿,千万别说你不知道Docker
581
3
记一次使用SpringCloudGateway的OOM错误
207
4
浅谈DDD中的聚合
175
5
纯前端实现「羊了个羊」小游戏🐏
333
6
单元测试如何确立规范
226
7
组装式交付-云巧知多少
87
8
【重磅】ServerlessDevs进入CNCF沙箱,成首个入选的Serverless工具项目!
55
9
一文让你彻底了解Spring框架中用到了哪些设计模式
91
10
FFmpeg处理音视频文件的常用方法
425
11
阐述“羊了个羊”游戏APP小程序系统开发逻辑方案(源码部署哦)
421
12
哈希算法(hash)加密解密
7319
13
阿里云容器服务ACK产品技术动态(202208)
185
14
阿里云LandingZone携手合作伙伴共建「上好云阵营」
54
15
Spring事务学习笔记(一)初遇篇
51
16
JavaScript代码优化之道
362
17
职场逆袭!阿里云推荐ACP认证特训营
289
18
理论与实践:如何写好一个方法
327
19
SpringBoot2整合ClickHouse数据库
53
20
组装式应用对工作提升的效率
208
推荐文章
参与ACR评测得机械键盘及定制礼品
寻找百位乘风者伯乐,邀约新博主入驻可获乘风者定制周边及重力星球蓝牙音箱!
参与Grafana评测得多重好礼
乘风者计划邀您入驻社区,精彩权益即刻享
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载
延伸文章資訊
- 1计算机图形学OpenGL中的glLoadIdentity、glTranslatef
glRotatef :将R(x,y,z,s)右乘与堆栈的栈顶变换矩阵。 glLoadIdentity:将堆栈的栈顶变换矩阵设置成单位矩阵。 glPushMatrix:将堆栈的栈顶变换矩阵复制一份...
- 2OpenGL中平移函数glTranslatef()、旋转函数glRotatef()的理解
void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z);. 先解释一下旋转方向,做(0,0,0)到(x,y,z)的向量,用右手握住...
- 3glRotatef 函式(Gl.h) - Win32 apps - Microsoft Docs
void WINAPI glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z );. 參數. 角度. 旋轉角度,以度為單位。 x. ...
- 4glrotatef(3) - Linux man page - Die.net
- 5【c++】OpenGL:glRotatef旋轉什麼? - 程式人生
當我這樣呼叫 glRotatef 時: glRotatef(angle,0.0,1.0,0.0) //rotate about y-axis 我知道這是圍繞 angle 旋轉 y axis 度。...