OpenGL之几何、投影、裁剪、视口变换以及全局变换与局部变换

一、变换的概念

1.1 图形流水线
在这里插入图片描述
1.2 变换(Transformation)

变换主要分为四个步骤,主要就是在Vertex operations阶段操作顶点信息,会在流水线中依次进行。

  • 几何变换
  • 投影变换
  • 裁剪
  • 视口变换

三维模型到二维图形的主要变换过程,注意各种窗口的区别。
在这里插入图片描述

  • 投影窗口:是一个虚拟的窗口,与具体的硬件设备无关。
  • 视口变换:视口与相关的硬件设备有关。

1.3 OpenGL中变换相关的函数

  • 几何变换:glTranslate、glRotate、glScale,这些函数只是计算一个变换矩阵,然后作为参数设置到图形流水线中。
  • 投影:glFrustum()、gluPerspective()、glOrtho();
  • 视口变换:glFrustum()、gluPerspective()、glOrtho(),glViewport();

1.4 几何变换

1.4.1 平移
点P(x,y,z)平移到 P’(x’,y’,z’),平移向量为T(∆x,∆y,∆z)
在这里插入图片描述

x’ = x + ∆x;
y’ = y + ∆y;
z’ = z + ∆z;

表达为向量形式为:P’ = P + T;

表达为矩阵形式:
在这里插入图片描述
但是上述矩阵表达并不完美,因此可以将其进行齐次化,使得矩阵的表达结构都变得统一,OpenGL中采用4 x 4 的矩阵来表示。
在这里插入图片描述
OpenGL中,在调用平移函数glTranslatef(∆x,∆y,∆z)时,就构造了一个平移矩阵。

1.4.2 缩放

点P(x,y,z)经过缩放得到点P’( x’,y’,z’) ,即乘以一个缩放因子:

x’ = x * SxS_xSx
y’ = y * SyS_ySy
z’ = z * SzS_zSz

表达为向量形式:P’ = P * S,表达为矩阵形式,并齐次化。
在这里插入图片描述
OpenGL中,在调用平移函数glScalef(SxS_xSxSyS_ySySzS_zSz)时,就构造了一个缩放矩阵。
在这里插入图片描述
缩放中心在原点(0,0,0),若仅缩放图形的大小,不改变图形的位置,即:
在这里插入图片描述
可以采用组合的方式来实现,即先平移到缩放中心,在缩放,再平移到原来的位置。
glTranslatef(- xpx_pxp,- ypy_pyp,- zpz_pzp)
glScalef(SxS_xSxSyS_ySySzS_zSz)
glTranslatef(xpx_pxpypy_pypzpz_pzp)

1.4.3 旋转

点P绕z轴逆时针选旋转 α 角:
在这里插入图片描述
P(x,y)、P(x’,y’)点的极坐标形式为:
在这里插入图片描述
则可以把x’,y’,z’表示出来:
在这里插入图片描述
将其表达为矩阵形式:
在这里插入图片描述
同理,可以推导出沿y轴和沿x轴的旋转:
在这里插入图片描述

实现沿任意向量(AxA_xAxAyA_yAyAzA_zAz)的旋转:
在这里插入图片描述
在OpenGL中,构建了一个新的坐标系统Oxyz‾\overline{xyz}xyz,该坐标系以向量(AxA_xAxAyA_yAyAzA_zAz)为z轴,让后将顶点从Oxyz坐标中变换到Oxyz‾\overline{xyz}xyz中,直观理解为点的位置不变,但在不同坐标系中的坐标不一样,再绕z轴旋转,最后将旋转后的顶点从Oxyz‾\overline{xyz}xyz坐标系变换到Oxyz坐标系中。

  • 坐标系Oxyz →\rightarrow Oxyz‾\overline{xyz}xyz :矩阵A;
  • 旋转;
  • 坐标系Oxyz‾\overline{xyz}xyz →\rightarrow Oxyz :矩阵ATA^TAT(转置矩阵),实际上应该为A−1A^{-1}A1(逆矩阵),因为A是一个正交矩阵,因此A−1A^{-1}A1 == ATA^TAT
    在这里插入图片描述
    glRotate(angle,x,y,z);

1.5 采用矩阵形式来表达几何变换,可以方便把各种变换组合起来,也可以减少计算量,最终只需要一个矩阵作用与顶点数据。

在OpenGL中,当前模型的变换矩阵为:M,调用glTranslatef()函数时,会生成一个矩阵T,让后将矩阵T右乘于矩阵M,即:

M’ = M * T;

当在调用glRotatef()函数时,会生成一个R矩阵,右乘于矩阵 M’:

M’’ = M’ * R;

当最终将矩阵作用于顶点P(x,y,z)时,为:

M’’ * P = (M * T * R ) * P;
在这里插入图片描述

1.6 在1.5中,我们注意到,顶点P位于矩阵 M’'的右边,可以看出,P点是先旋转,再平移,再进行M变换,为什么矩阵是写在原矩阵的右边,而最终的矩阵要写在顶点P的左边呢?后面我们将进行解答。

1.7 矩阵的应用
图元P1、P2经过了变换T1、T2、… 、Tn,OpenGL中是先进行一系列的变换矩阵的处理,最后再作用于图元(点,三角形,三角形带,四边形等都称为Primitive)。

glLoadIdentity();			//初始化矩阵M为单位矩阵,M = I;Tranformation T1;...Tranformation Tn;       //变换,M = I * T1 * ... * Tn;Primitive P1;Primitive P2;

P1经过变换T1、T2;P2经过变换T3、T4;OpenGL中基本的逻辑顺序为:

glLoadIdentity();			//初始化矩阵M为单位矩阵,M = I;Tranformation T1;Tranformation T2;       //变换,M = I * T1 *T2;Primitive P1;
glLoadIdentity();			//初始化矩阵M为单位矩阵,M = ITranformation T3;Tranformation T4;       //变换,M = I * T3 *T4;Primitive P2;

二、矩阵的管理

2.1 OpenGL中采用堆栈来管理矩阵,主要采用** glPushMatrix() 和 glPopMatrix() **函数。

  • 假设P1、P2有相同的变换TcT_cTc;P1有经过了变换T1、T2;P2经过了变换T3、T4,则伪码为:
glLoadIdentity();Transformation Tc;
glPushMatrix();Transformation T1;Transformation T2;Primitive P1;
glPopMatrix();
glPushMatrix();Transformation T3;Transformation T4;Primitive P2;
glPopMatrix();

glPushMatrix()起到了保护环境的作用;glPopMatrix()起到了恢复环境的作用,两者一般配合起来使用,起到了隔离的作用,中间的部分不会对 glPushMatrix()和glPopMatrix()之外的操作产生影响。

glPushMatrix();glTranslatef(-1.0, 0.0, 0.0);glRotatef((GLfloat)shoulder,0.0,0.0,1.0);glTranslatef(1.0, 0.0, 0.0);glPushMatrix();glScalef(2.0,0.4,1.0);glutWireCube(1.0);glPopMatrix();glPushMatrix();glScalef(1.0,0.4,1.0);glRotatef((GLfloat)elbow,0.0,0.0,1.0);glTranslatef(1.0, 0.0, 0.0);glScalef(2.0,0.4,1.0);glutWireCube(1.0);glPopMatrix();
glPopMatrix();

2.2 相关操作对栈中矩阵的影响

  • glLoadIdentity(): 使栈顶矩阵为单位矩阵;
    在这里插入图片描述

  • glTranslate*(),glRotate*(),glScale*():栈顶矩阵左乘于变换矩阵;
    在这里插入图片描述

  • glPushMatrix():将栈顶矩阵复制一份,入栈。
    在这里插入图片描述

  • glPopMatrix() : 退栈,恢复到Push之前的状态;
    在这里插入图片描述

三、模型变换与视点变换

3.1 Model-View Transformation

视点不变。变换模型位置;OpenGL默认的视点位置在原点,视线方向为z轴负方向

3.2 View transformation

物体不变,变换视点位置,如漫游功能。

两种变换是可以统一的,也可以相互转化。在OpenGL中有各种堆栈,有的用来管理模型变换与视点变换,有的用来管理投影变换,有的用来管理纹理变换。 glMatrixMode(GL_MODELVIEW)用来设置操作的堆栈,即管理模型与视点变换的堆栈。因为模型变换与视点变换是相对的,在OpenGL中,我们可以认为视点总是不变的,所有的变换都是模型变换。

3.3 gluLookAt()函数

void glutLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz),可以用来实现漫游功能,即视点变换,通过指定摄像机的视线方向,中心点和上方向,就可以实现漫游功能。

在这里插入图片描述

glTranslate()、glRotate()、glScale()都可以理解为视点不动,变换模型,而gluLookAt()是模拟物体不动,变换视点的控制效果。本质上两者都一样,gluLookAt()函数也是计算了一个变换矩阵。

四、全局变换与局部变换

4.1 Global transformation:全局坐标系变换模式,固定坐标系模型,图形模式;如下变换,物体的局部坐标也随着物体改变;
在这里插入图片描述

4.2 Local transformation : 局部坐标系变换模式,活动坐标系模式,空间模式。如下变换模式,物体在局部坐标系中变换。第一种采用与全局变换顺序一样的矩阵进行局部变换;第二种与全局坐标相反的矩阵进行局部变换。
在这里插入图片描述

4.3 两种变换方式产生的效果完全不一样,但是两种方法之间又具有联系,将局部变换的顺序调整一下,即可产生与全局变换完全一样的效果

4.4 局部坐标系的变换顺序的逆变换即为全局坐标系的变换,全局坐标系的变换顺序的逆变换即为局部坐标系变换

  • 如果只有依次变换(旋转、平移、缩放),那么全局变换和局部变换效果一样
  • 多种变换的组合时,全局变换与局部变换效果一般不同
  • 局部变换正好相当于组合顺序相反的全局变换

4.5 局部变换

局部变换在子模型相对于父模型的变换中很有用,可以很方便的进行变换,而全局变换则比较复杂;在OpenGL中,单次的变换是全局变换,而组合的多次变换则是局部变换。

4.6 例子

glLoadIdentity();
glTranslatef(10.0f,0.0f,0.0f);
glRotatef(45.0f,0.0f,0.0f,1.0f);glBegin(GL_QUADS);
...
glEnd();

生成的矩阵:
在这里插入图片描述

最终作用于顶点:
在这里插入图片描述
通过变换的过程可以理解:代码里面是先平移、再旋转、而实际作用于顶点时,将矩阵放在了点的左边,是先旋转,再平移,这就是局部变换的逆变换就是全局变换的含义。

注意:上述矩阵采用的都是行优先,矩阵都是乘再原矩阵的右边,而再OpenGL中采用的是列矩阵,因此新产生的矩阵总是乘再原矩阵的左边

附录:中国大学Mooc,图形编程技术,北京林业大学,杨刚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinForm中DataGridView的TextBoxColumm换行

一、内容超过显示宽度自动换行: 在需要自动换行的列中设置 二、换行符换行: 一开始在需要换行的文本添加"\r\n"并不能直接换行,DGV直接把\r\n显示出来了,后换成 System.Environment.NewLine 解决问题转载于:https://www…

刷脸背后,卷积神经网络的数学原理原来是这样的

来源:深度学习这件小事计算机视觉技术在日常生活中有着非常普遍的应用:发朋友圈之前自动修图、网上购物时刷脸支付……在这一系列成功的应用背后,卷积神经网络功不可没。本文将介绍卷积神经网络背后的数学原理。在自动驾驶、医疗以及零售这些…

OpenGL之坐标系以及单位

1.1 OpenGL中默认的坐标系为右手坐标系,默认视点位置为原点,原点正好投影在投影窗口的中心,也正好投影在视口的中心。 1.2 在OpenGL中无绝对单位,只有相对的大小,相对于视锥体的大小来设定物体的大小。 1.3 通过估算…

人工智能设计芯片,比你想象的更大胆

来源:ZDNet作者:Tiernan Ray编译:科技行者AI(人工智能)技术正在越来越多地被应用于半导体设计之中,这种做法的优势之一是,人工智能技术会尝试人类想都不敢想的设计方案。例如,对边际…

OpenGL之相关库介绍及基本语法、The OpenGL Machine

1.1 OpenGL Library核心库 包括115个函数,前缀为 :gl,主要在gl.h、openGL32.lib,openGL32.dll中; 1.2 OpenGL utility library 实用程序库 包含43个函数,前缀:glu;主要为核心库的…

JavaWeb从开发环境搭建,到第一个servlet程序(图文)

## 开学到今天,已经是第三周了~ 然而这门课的教材还没发~ 滋滋滋 表示很“蓝瘦”~~~ Java Web开发环境搭建 1、 下载安装Tomcat 官网地址:http://tomcat.apache.org/ 选择Tomcat 8 -- (如图所示) --选择 zip 文件 --下载后,将压缩包中的…

远望智库未来产业研究院与资本实验室联合发布《2021全球区块链应用市场报告》...

来源:远望智库预见未来从以比特币为代表的区块链1.0时代;到以智能合约为媒介,以金融应用为核心的区块链2.0时代;再到区块链应用于政务服务和更广泛的各行业,并开始推动信息互联网向价值互联网靠拢,短短10余…

因特网的硬件组成

终端系统 主机、服务器、PDA 通信介质 有线介质:双绞线、同轴电缆、光纤无线介质:无线电波、卫星 中间设备 路由器、交换机等 路由器 路由器的产生 由思科公司创始人伯塞克发明 路由器的特性和作用 存储转发机制连接异构的网络 交换机 交换机的…

OpenGL之光照明模型、Phong光照模型与Blinn-Phong光照模型

1.1 光照效果 通过光照,能反映模型的空间几何形态,通过光照明模型,计算模型表面任一点被光照后投射到观察者眼中的光亮度的大小。光照的计算就是计算投射到观察者眼中的光,这部分光与物体与光源的位置、物体与视点、物体表面的材质…

谈人工智能:深度学习对老牌AI

来源:李晓榕科学网博客链接地址:http://blog.sciencenet.cn/blog-687793-1300748.html学:学生,教:教师,李:李晓榕李:三代人工智能都各有所本、各有所倚,也就各有所偏&…

OpenGL之Phong光照模型和Blinn-Phong光照模型的局限性、OpenGL光照参数设置与光照模式

一、相关概念 1.1 Phong、Blinn-Phong光照模型是一种简单光照模型,它仅考虑了光源直接照射的效果,没有考虑非直接光照的效果。如下直接光照与间接光照。 1.2 上述模型在考虑间接光照(环境光)时,采用的是一个常数来表…

OpenGL之图形流水线中的光照计算、明暗处理

1.1 光照计算发生在图形流水线的Vertex Operations中,只计算每个顶点的颜色,而三角形内部的点的颜色在Fragment Operations阶段通计算,这样效率高,因为像素的数量远远大于顶点的数量。 1.2 计算三角形内每个像素的颜色的过程&am…

教学5层网络体系结构——分层之后数据的发送和接收

协议分层后数据发送过程 发送方层层封装 接收方层层解封装 唯一加尾部的是数据链路层 思考 发送方某层封装完如何知道该交给哪个下层封装? 应用层选择传输层由应用程序决定,传输层选择网络层由固定的搭配,例如因特网只有IP协议&#x…

从视觉系统的原理入手 破解VR眩晕症

来源:EETimes编译:科技行者虚拟现实技术近年来迎来一波快速发展,适用范围也扩展到更多领域,引得众多老牌巨头纷纷参与。然而,VR技术自身仍存在一些极难解决的缺陷,如果无法攻克,技术的进一步普及…

小组会谈(2019.3.14)

一:会议主题 1.确定项目的立题 2.讨论需要实现的功能 3.确定小组成员之间的分工和完成各自任务的期限 二:会议地点 逸夫楼C座一楼 三:会议时间 2018年3月14日10:00--11:20 四:会议内容 1.项目的立题&#x…

应用层相关概念

一、应用层概述 1、应用层协议基本概念 应用层的功能 应用层协议定义了应用程序需交换的报文、所需采取的动作和最终通信数据的应用应用层位于协议栈的最高层次应用层协议提供不同主机之间进程与进程之间的通信用户代理实现应用层协议 套接字 IP端口号,唯一确定…

迎来智能数据分析的新时代

来源:知乎(ID:熊墨淼)最近两星期(7月15日,7月22日),《自然》杂志连续发表两篇DeepMind写的用人工智能的方法预测蛋白质三维结构的文章和NIH Director Francis Collins 写的博客 "Artificial Intelligence Accurately P…

2019春季第三周作业

2019年春季学期第三周作业基础作业 本周没上课,但是请大家不要忘记学习。 本周请大家完成上周挑战作业的第一部分:给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。 例如:[1, -2, 3…

DNS域名系统详解

一、分层次的域名结构 顶级域名、 二级域名、 三级域名、 四级域名 二、因特网的域名结构 因特网采用了层次树状结构的命名方法,称为域名,如:www.jxnu.edu.cn 三级域名:如www表示万维网 二级域名:如jxnu表示江西师…

侯世达:让机器学习思考的人

图源:GREG RUFFING来源:利维坦文:James Somers原文:www.theatlantic.com/magazine/archive/2013/11/the-man-who-would-teach-machines-to-think/309529/译文原载:《新知》杂志侯世达(Douglas Hofstadter&a…