计算机图形学OpenGL中的glLoadIdentity、glTranslatef

文章推薦指數: 80 %
投票人數:10人

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数据库进阶实战 立即下载



請為這篇文章評分?