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/