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/

posted @ 2022-08-09 09:56  春天又来了  阅读(560)  评论(0编辑  收藏  举报