上节谈到投影变换分为透视投影(perspective projection)和正射投影(orthographic projection)两种.

透视投影我们已经介绍过了, 现在谈谈正视投影.

正射投影,又叫平行投影.这种投影是一个矩形长方体的平行管道. 它最大的特点是, 无论物体距离相机多远投影后的物体大小尺寸不变.

正视投影函数有两个, 一个是Ortho, 原形如下:

Ortho(double left, double right, double bottom, double top, double near, double far)

其参数 left,right,bottom, top的意义见下图所示.

near, far 可以认为是Z轴方向上的近裁剪平面和远裁剪平面.

下面这张示意图是把三维体放置在视景体中, 看上去更形象些.

笔者为了理解什么是正射投影以及Ortho函数的效果, 在网上翻遍了资料, 都是笼统的文字叙述, 或者是表达有误. 甚至找不到一个直观示意效果图.

后来还是在3dsmax的摄像机属性中看到了"正交投影" 这个属性.  在3dsmax和autoCAD中, Ortho这个单词都被翻译为"正交". 因此"正交"和"正射"表达的是一个东西.

事实证明, 有了3dsmax这样的工具, 可以有效的实践一些原理上的东西, 确实对学习OpenGL很有帮助.

请看下面的实验, 它帮助笔者理解了什么是正射投影? 它的效果是怎么样的? 这样的疑惑.

下图是在3dsmax创建的一个场景:
 注意其Camera01视图,  它显示的是摄像机在透视投影下看到一个立方体(线框显示)

同样的场景, 把摄像机改为"正交投影", 可以看到现在的立方体完全没有了透视效果. 这是因为这立方体相当于放置在一个矩形长方体管道中, 投影完全平行, 没有了像透视投影那样的角度发散的效果.

这就是正射投影的最大特点: 无论物体距离相机有多远投影后的物体大小尺寸不变.

下面我们用代码来继续讨论一下Ortho() 函数.

先上个透视投影的效果图, 如下:

这个三角形是画在Z为0的世界坐标系平面上的, 因此LookAt的前三个参数设置0,0,1, 表示摄像机xy指向世界坐标系原点, 摄像机的Z向世界坐标系统的Z正方向走1个单位, 即远离了三角形一个单位, 因此我们能看到三角形了.

现在我们把Perspective改为Ortho.

gl.Ortho(-, , -,, -, -);
gl.LookAt(, , , , , -, , , );

跑起来, 屏幕上什么都没有.

这是因为LookAt的第三个参数eyez, 没有位于Ortho参数near和far(即-2, -5)之间的原因.

gl.LookAt(, , -, , , -, , , );

eyez改为-3就可以看到三角形了.

我来总结一下:

经过 gl.Ortho(-2, 2, -3,3, -2, -5) 正射投影之后, 三角形就被置于这个矩形长方体(-2, 2, -3,3, -2, -5)的视景体中了, 以后LooAt 就是在看这个视影体中的内容, 如果摄像机的视点设置有超出这视景体的部分将看不到, 相当于被剪切了.

另外一个函数是 Ortho2D(), 它和Ortho不同的是缺少最后两上参数Near, Far, 这个Ortho2D()实际上是默认near为-1, far为1的Ortho()函数.

笔者并不清楚它有什么作用, 如果以后遇到好的例子, 我会在这里续写这个知识点.

本节源代码直接使用上节的源码

原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/

SharpGL学习笔记(四) 正射投影的更多相关文章

  1. SharpGL学习笔记(七) OpenGL的变换总结

    笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...

  2. SharpGL学习笔记(十一) 光源创建的综合例子:光源参数可调节的测试场景

    灯光的测试例子:光源参数可以调节的测试场景 先看一下测试场景和效果. 场景中可以切换视图, 以方便观察三维体和灯光的位置.环境光,漫射光,镜面反射光都可以在四种颜色间切换. 灯光位置和摄像机位置(Lo ...

  3. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  4. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  5. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  9. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

随机推荐

  1. Erlang Trace机制

    从FTP模块学习先进的诊断技术(Erlang Trace机制) http://blog.yufeng.info/archives/466

  2. CentOS系统基础优化16条知识汇总

    1.不用root管理,以普通用户的名义通过sudo授权管理: 2.更改默认的远程连接服务端,禁止root用户远程连接,甚至要更改只监听内网ip: 3.定时自动更新服务器时间,使其和互联网时间同步: 4 ...

  3. js Jquery字符UrlEncode 编码 C#(asp.net)解码 Server HttpUtility 区别 cookies存中文

    一.Js asp.net 交互Url编码解码 C#(asp.net)编码:HttpUtility.UrlEncode(url) Jquery解码:decodeURIComponent(url); Jq ...

  4. oracle装载表是什么?

    oracle装载表即通过sqlloader的方式导入数据. Oracle 的SQL*LOADER可以将外部数据加载到数据库表中.下面是SQL*LOADER的基本特点: 1)能装入不同数据类型文件及多个 ...

  5. Centos yum安装java jdk1.8

    yum -y install java-1.8.0-openjdk* 安装后 java -version查看版本 检验是否安装成功. 其安装位置 /usr/lib/jvm/java-1.8.0-ope ...

  6. Thinkphp5笔记七:设置错误页面①

    设置网站的错误提示页面,也是一个很重要的环节. 一.空操作 在当前控制器里面增加E_empty操作 public function _empty(){ $this->error('方法不存在') ...

  7. Objective-C语法之可变参数

    可变参数的方法在Objective-C中不罕见,像Cocoa中的很多常见的方法都是可变参数的,如: NSLog(NSString *format, ...) + (id)arrayWithObject ...

  8. electron demo项目npm install安装失败解决办法

    electron官网提供的demo项目,在npm install 的时候总是报错显示安装失败, 解决办法:FQ即可成功安装.

  9. Ubuntu下PHP动态编译出现Cannot find autoconf的解决方法

    执行phpize时出现Cannot find autoconf 错误 Ubuntu下解决方法 sudo apt-get install autoconf

  10. 使用springmvc,jsp,结合网页文本编辑器kindEditor实现基本博客编辑功能

    kindEditor官网:http://kindeditor.net/demo.php 个人实践: 为了在自己的项目中引入一个类似用户写博客的功能,在网上找到了kindeditor,真心又好又易用. ...