一、观察:正交投影

1.特性:保持平行线在投影后仍然是平行的

2.一个长方体,对处在只有深度不同的位置上的同一物体来说,它的大小不会改变。

3.透视投影:平行线在远处会相交(例如铁轨)

4.glOrtho()函数:这个函数描述了一个平行修剪空间。这种投影意味着离观察者较远的对象看上去不会变小(与透视投影相反)。在3D笛卡尔坐标中想象这个修剪空间,左边和右边是最小和最大的X值,上边和下边是最小和最大的Y值,近处和远处是最小和最大的Z值。 正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。

5.用途:这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确

6.glOrtho函数只是负责使用什么样的视景体来截取图像,glOrtho(left, right, bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。

假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是3的框框把这个球体整个都装了进来。  如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是1.5, 高是3的框框把整个球体的右面装进来;如果设定glOrtho(0.0, 1.5, 0.0, 1.5, -10, 10);就表示用一个宽和高都是1.5的框框把球体的右上角装了进来。

例题:

在何种情况下,我们需要用M来代替glOrtho?

矩阵中唯一改变的项是 (2,2)这一项。

我们把它从 −2f−n (glOrtho中) 变成了 2f−n。在glOrtho中,这一项是负的,因为我们把近裁剪面和远裁剪面定义为了正整数,但它们应该是负的,实际上它们代表了平面 z=−n 和 z=−f。

如果我们看向一条正的坐标轴时,则不需要把它变为负数。

二、透视投影

1.投影的中心是相机或是眼睛的位置

2.,中间竖线是屏幕,把后边的物体投影到屏幕上,求取x`的坐标?

利用小三角形和大三角形相似,d/x`=z/x,的x`=d*x/z,所以物体距离屏幕越远,所看到的越小

4.都除以-z/d,为什么是负号,同样道理,相机朝着−z⃗方向观察。

三、透视变换gluPerspective

1.gluLookAt函数详解:

在openGL中,视图变换是指保持模型坐标不变的情况下,从不同的方位观察模型,常用的设置观察者属性的函数为glLookAt 。

函数原型

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

函数定义一个视图矩阵,并与当前矩阵相乘。

第一组eyex, eyey,eyez 相机在世界坐标的位置

第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置

第三组upx,upy,upz 相机向上的方向在世界坐标中的方向

你把相机想象成为你自己的脑袋:

第一组数据就是脑袋的位置

第二组数据就是眼睛看的物体的位置

第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。

后面的三个参数(0.0,1.0,0.0),y轴为1,其余为0,表示脑袋朝上

如果没有调用glLookAt设置视图矩阵,默认情况下,相机会被设置为位置在世界坐标系原点,指向z轴负方向,朝上向量为(0,1,0)。

2.gluPersective函数详解:

如果说gluLookAt定义的是相机外在参数如相机所处位置、旋转角度等,那么gluPerspective定义的就是相机的内在镜头参数了。

四个参数:

gluPerspective ( fovy,aspect,zNear,zFar)

1>第一个参数flvy,定义可视角的大小,flvy值小,表示从相机(人眼)出发的光线的角度小,此时同等距离下,可观察到的视野范围较小,反之则大。

2>第二个参数aspect,定义物体显示在画板上的x和y方向上的比例。aspect小于1,则物体显示出来比实际更高,大于1,显示出来比实际看起来更宽,设为1,会按实际反应长宽比。

3>第三个参数zNear,定义距离相机(人眼)最近处物体截面相距的距离。这个值越大,表示观测点距离物体距离越远,看起来物体就比较小,反之则比较大。如果物体运动到距离观测点的距离小于了设定的zNear,则物体不会被绘制在画板上。

4>第四个参数zFar,定义可观测到的物体的最远处截面相距相机的距离。如果物体运动到距离观测点的距离大于了设定的zFar,则物体不会被绘制的画板上。

(在near和far中间的才会被观察到)

上图为屏幕的俯视图,可以得出两个值

3.近平面不可设置为0,远平面影响不大。

4.Z坐标靠近近裁剪面的位置拥有最高的深度分辨率(能够分辨的深度差最小),由于透视矩阵并需把 n 和 f 映射成 −1 和 1,于是应用了透视矩阵后,靠近 n 的物体比靠近 f 的物体分布在更宽广的空间里。

最新文章

  1. 编程中Foo, Bar 到底什么意思?
  2. AngularJS 源码分析1
  3. django的跨站请求访问
  4. Cubieboard2裸机开发之(三)C语言操作LED
  5. 消息通信库ZeroMQ 4.0.4安装指南
  6. C# 检测网络链接
  7. java基础知识回顾之---java String final类构造方法
  8. Linux学习笔记总结--memcached配置
  9. hdu1166 树状数组
  10. HashMap 数组应用面试题(Point)
  11. Metasploit Framework(5)弱点扫描
  12. Navicat软件安装
  13. Coursera, Deep Learning 4, Convolutional Neural Networks, week3, Object detection
  14. xamarin C# 安卓实现 ListView 放大缩小
  15. sql server2014企业版无人值守批处理脚本自动化安装
  16. IE6条件下的bug与常见的bug及其解决方法
  17. qt资源加载出错
  18. 1014 2018 使用FLAG counter
  19. elasticsearch安装ik分词器(极速版)
  20. 洛谷P1195口袋的天空

热门文章

  1. maven之assembly插件
  2. visual studio 编译报错:未能向文件“....csproj.FileListAbsolute.txt”写入命令行,对路径的访问被拒绝
  3. php array_combine()函数 语法
  4. [HG]奋斗赛G
  5. Activiti介绍(一)
  6. [WC2012]记忆中的水杉树
  7. LintCode之移动零
  8. womenzijide_jiafenxiang
  9. win7系统开机启动出现蓝屏,提示BAD_SYSTEM_CONFIG_INFO
  10. php面试专题---16、MySQL创建高性能索引考点