SharpGL学习笔记(四) 正射投影[转]
上节谈到投影变换分为透视投影(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(-2, 2, -3,3, -2, -5); gl.LookAt(0, 0, 1, 0, 0, -10, 0, 1, 0);
跑起来, 屏幕上什么都没有.
这是因为LookAt的第三个参数eyez, 没有位于Ortho参数near和far(即-2, -5)之间的原因.
gl.LookAt(0, 0, -3, 0, 0, -10, 0, 1, 0);
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/