模型变换、视图变换、投影变换、视口变换介绍

opengl中存在四种变换,分别是模型变换,视图变换,投影变换,视口变换。这四种变换是图形渲染的基本操作,实质上这四种变换都是由矩阵乘法表示(这些操作都是由一个4*4的矩阵来完成的),通过变换,我们可以看到各种通的显示效果,最简单的效果就是让图元沿着某个方向变换(放大,缩小,翻转等)或者对所要显示的图元进行裁剪。接下来我们就详细介绍这四种变换以及相互之间的联系。

我们要在屏幕上显示一个具有三维坐标的物体,大致需要以下步骤:

1.     进行模型,视图变换(变换并不是都需要的,根据自己所绘制的图形情况来确定使用哪种变换),效果为:旋转,平移,缩放等。一般情况下,绘制一个场景时需要组合使用几种变换。

2.     位于窗口(即视景体,暂时理解为窗口)之外的物体(或者一部分)需要裁减掉,等于最后所显示的图形中并没有窗口之外的物体。即:“投影变换”。

3.     经过变换后的坐标和屏幕的像素建立对应关系。该过程称为“视口变换”。

我们现在用“摄像师照毕业照”所涉及的动作来解释下产生目标场景视图变换中四种变换的作用。

1.     视图变换:照相时我们需要把照相机固定在三脚架上,并让镜头对准所照物体(图形学叫:场景,我们以后使用“场景”来代表所照物体)。

2.     模型变换:我们需要对场景中的物体进行安排,类似于我们的毕业照,摄像师总要对照相的人进行规划(:这个高个子人往后站,那个人往左边一点,那个往右一点)。这样做的目的是让场景中的物体位置是我们所期望的。

3.     投影变换:当镜头的人看着很小(也就是距离照相机很远),摄像师要推镜头,让场景(照片)中的人变大,当场景(照片)中人很多,没有覆盖全,我们需要拉镜头,把所有人放到场景(照片)中。

注:照片可以理解为我们所绘制的场景。

4.     视口变换:当摄像师给我们照好毕业照时,需要进行洗印相片,此时我们可能根据需要放大照片(PS:12寸变32寸)或者缩小照片,这个过程称为视口变换

注:视口变换后,洗印出的照片就相当于我们在屏幕上绘制的场景的最后效果。

注:以上的场景变换顺序比一定严格一致,但是,视图变换必须出现在模型变换前,投影和视口变换可以放在程序(绘制)结束之前的任何地方。

四种场景视图变换的原理(PS:这些原理了解即可,写程序时我们只需要调用opengl中相对应的函数来实现以上功能):为了进行场景中各种视图的变换,我们需要创建一个4*4的矩阵M,然后把它与场景中的每个顶点V的坐标相乘,来实现坐标的变换,即V`=M*V。M矩阵中的参数就表示我们进行何种变换。顶点中的物体的坐标与M相乘变成V`,然后经过绘制,就变成我们想要看到的结果了。

注:物体的顶点有四个坐标(x,y,z,w),其中W默认为1,所以我们编写程序时只编写前三个坐标,即X,Y,Z。

注:当我们使用四种变换来改变场景中的物体时,其物体表面的法线也随之变换(使得变换后的物体的顶点坐标与其所在平面的法线之间具有正确的对应关系)。PS:法线在我们绘制场景中很重要。

四种场景视图变换后产生的效果

[1] 其中视图和模型变换共同形成了【模型视图矩阵】,这个矩阵与物体世界坐标相乘,产生对应的视觉坐标。

[2] 若程序中定义了投影矩阵,投影矩阵将产生“裁剪坐标”,这些裁剪坐标共同定义了“视景体”(PS:暂时理解为一个框框,在这个框框里的物体,才能被显示出来),作用于这个视景体之外的物体将会被裁剪掉,不会在最终的场景(理解为:冲洗出来的照片)中出现。

[3] 随后,opengl程序中发生的是“透视除法”,它把物体的坐标值分别除以W(W默认为1),产生“设备坐标”(opengl自动进行此步)。

[4] 接下来该“视口变换”,作用是把上一步的坐标变成“窗口坐标”,我们可以通过控制视口的大小来让场景中的物体变大或者变小。

以上的绘制场景步骤我们概括为一段话:

程序中指定了必要的变换后,我们就可以绘制场景了(理解为:准备拍照),

(1)opengl通过模型、视图变换,对场景中的物体的每个顶点进行变换。(2)然后根据我们自己指定的投影变换对每个顶点再次进行变换,如果顶点位视景体之外,它就被裁剪掉。(3)最后经过变换的剩余顶点除以W(透视除法),然后映射到视口。

注:有人一定要问了?在我们电脑屏幕上显示出的物体只需要具备X,Y坐标即可(屏幕是二维的),为什么还有Z坐标?

Z坐标的作用是反应物体顶点的深度(即从顶点到屏幕的距离),由于我们生活中看到的景象是“近大远小”,当两个物体前后放在我们面前时,由于前一个物体的遮挡,我们只能看到后一个物体的局部(很明显的道理嘛),Z坐标就是要实现以上的效果,当场景中两个物体的X,Y坐标一致,而Z坐标不同,opengl就可以使用此信息判断哪个表面被另一个表面遮挡了,从而避免绘制那个被遮挡的表面(让程序渲染效率更高),此技术称为“隐藏表面消除技术”。

本节简单介绍了opengl中的四种场景变换的概念,下一章我们分章节详细介绍各变换是如何使用的。

OpenGl学习笔记3之模型变换、视图变换、投影变换、视口变换介绍的更多相关文章

  1. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  2. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  3. 学习笔记:APP切图那点事儿–详细介绍android和ios平台

    学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html   版权归原作者所有 作者:亚茹有李 原文地址 ...

  4. opengl学习笔记

    准备: 1.准备资源:从GLEW1.13.0下载GLEW,并且解压出glew-1.13.0目录.从FreeGLUT官网下载3.0.0版本.直接从这里下的编译后的FreeGLUT,选for MSVC,下 ...

  5. OpenGL 学习笔记 01 环境配置

    以下教程仅适用于Mac下的Xcode编程环境!其他的我也不会搞. 推荐教程:opengl-tutorial  本项目Github网址       OpenGL太可怕了...必需得把学的记下来,不然绝壁 ...

  6. OpenGL学习笔记(六)坐标系统

    目录 一.衔接 二.概述 三.各个坐标系统 局部空间 世界空间 观察空间 裁剪空间 四.两种投影矩阵 正射投影 透视投影 五.把它们都组合到一起 六.编码实现 1. 实现卡片旋转 2. 实现正方体旋转 ...

  7. ASP.NET Core 2 学习笔记(十)视图

    ASP.NET Core MVC中的Views是负责网页显示,将数据一并渲染至UI包含HTML.CSS等.并能痛过Razor语法在*.cshtml中写渲染画面的程序逻辑.本篇将介绍ASP.NET Co ...

  8. OpenGL学习笔记2017/8/29

    OpenGL学习日志: 感谢doing5552 的OpenGL入门学习:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 相 ...

  9. Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

随机推荐

  1. global.autoindex dede:global.itemindex 获取子栏目自动排序序号

    {dede:channel  row='6' typeid=7 }                  [field:global.autoindex runphp='yes']             ...

  2. 获取Spring的上下文环境ApplicationContext的方式

    摘自: http://blog.csdn.net/yang123111/article/details/32099329 获取Spring的上下文环境ApplicationContext的方式 Web ...

  3. 如何查找Mac上的USB存储设备使用痕迹

    最近刚好有个案子的证物主机是MBP, OS X版本为El Capitan,案况与营业秘密外泄有关,当中要找有关USB存储设备的使用痕迹. 要提醒大家的是,不同版本的OS X,各种迹证的存放文件名称及路 ...

  4. iOS 层层推进实现代理模式

    1.代理模式核心思想:A类委托B类做某件事,然后A类获取B类的执行的返回结果! 举例:女孩想去买电影票,但是自己不亲自去而是委托男孩了解电影电影票信息,同时女孩获得男孩买票的结果,代码模拟实现: /* ...

  5. zookeeper学习记录

    ZooKeeper:是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.他主要用来解决分布式应用中的数据管理的一致性问题 ...

  6. sublime text2支持ng

    这里面记录了sublime text3的一些破解和sublime text2支持ng的方法. http://weblogs.asp.net/dwahlin/archive/2013/08/30/usi ...

  7. Windows和Linux下Mysql 重置root 密码

    Windows系统下一:进入Windows窗口cmd命令行下,停止mysql服务: net stop mysql二:进入mysql的安装目录下,进去bin目录mysqld-nt.exe --skip- ...

  8. css半透明

    filter:alpha(opacity=80); /*支持 IE 浏览器*/-moz-opacity:0.80; /*支持 FireFox 浏览器*/opacity:0.80; /*支持 Chrom ...

  9. 启动hadoop报ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile

    不知道怎么回事,今天在启动集群时通过jps查看进程时始终有一个standby namenode进程无法启动.查看日志时报的是不能加载fsimage文件.日志截图如下: 日志报的很明显了是不能加载元数据 ...

  10. shell脚本入门

    什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...