分享

更多

   

OpenGL的 glOrtho() glFrustum() 直观解释

2014-06-23  wang16500

 

 OpenGL的 <wbr>glOrtho() <wbr> <wbr>glFrustum() <wbr>直观解释

      

  glOrtho : 正交投影,摄像机可以位于裁剪体内,所以near 和 far 可以取两个正值或者一正一负。

glFrustum : 透视投影,摄像机不可以位于裁剪体内,所以near 和 far 都必须取正值,它的参数矩阵定义了裁剪体以及投影的类型,但是未定义摄像机的方位。GL 中的摄像机位于原点,并指向了Z轴的负方向。函数 glFrustum 只是修改了摄像机的 透镜,并非位置,为了改变位置或者朝向可以借助于 模型视图矩阵 相对于 摄像机移动场景 中的对象,或者通过 GL 变换,或者用函数gluLookAt(). 因为 glFrustum 对参数 far 和near 非常敏感,修改 near 和 far 则远景可能就影响很大,所以常用于观察近景。

 glPerspective : 也是用于透视投影,功能和glFrustum非常相似,参数不一样。相对于glFrustum来说不常用。


 OpenGL的 <wbr>glOrtho() <wbr> <wbr>glFrustum() <wbr>直观解释

         void glPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far)

         fov是依据 y方向 的视角,aspect是近裁剪面的纵横比,当然远裁剪面也取这个值,near 和far 的意义和上面的一样。

        透视投影的一个问题就是深度精度的损失,在显示设备中该问题很明显。问题出在深度缓存中深度的限制以及由透视投影引起的非线性比例变换。当近裁剪面非常靠近投影中心的时候,误差就非常大。

 

 OpenGL的 <wbr>glOrtho() <wbr> <wbr>glFrustum() <wbr>直观解释

 

OpenGL 关于视景台gluPerpectiveglFrustum的理解

作者:华文广  -----感谢高手花时间给我们讲解!

  OpenGL的 <wbr>glOrtho() <wbr> <wbr>glFrustum() <wbr>直观解释


很多刚学OpenGL的朋友,都会对视景台的定义有很大的迷惑,这里以我的经验来解释一下,希望对大家有所帮助,
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
在这个函数中,有六下参数,这六个参数,都不是真实的世界坐标(虽然有些书上说它们是坐标),而指的是到眼睛的平面距离,left, right 分别指的是左右截面到眼睛( 在XY平面上 )的距离,这两个数不必一定要对称,甚至两个都可以大于或小于0;


           对称
    |-------------|
                    |
       eye        |
                   |
    |-------------|
   left(-1.0)      right(1.0)

====================================================
             
 不对称
           |-------------|
                           |
   eye                   |
                           |
           |-------------|
        left(1.0)      right(2.0)



视景体默认情况下,眼睛位置是在坐标原点(0.0f,0.0f,0.0f),视线指向Z轴的负向。
如果是这种情况,上图中的left,right的值,就刚好是与它们的世界坐标一一对应的。topbottom也同样理解。
一种理解方式是这样:
眼睛是位于坐标原点,是逆着Z轴向屏幕里看的;
gluPerpective
glFrustum函数的zNear, zFar都是相对眼睛的距离,
其各自的负值为相对于坐标系原点的坐标值;
每个画的物体,其中心最开始都是位于坐标系的原点的,
通过glTranslate, glRotate函数,把物体移动到视景中,这样物体才可以被看得见;

但是事实上,眼睛可以是任何位置,视线也可以不平行于Z轴,这种情况情下,left,right,top,bottom,near,far,
它们指的就只是到眼睛的平面距离,与坐标没有一一对应的关系。

===============================================
你可以这样想:在眼睛前面有一个视景台,这个台体并不是固定的,而是随着你视线的转动而转动,
也就是说,视景台的正面和底面始终与视线垂直。那么,当你的眼睛是在(000)处,视线是指向Z的负向时,
视景台的近面(0.3)和远面(0.7)所对应的坐标,就是(-0.3-0.7
[code]
|Y                (0.3)                 (0.7)
                                            |
|0.0                    | -0.3           |-0.7
*eye-------------|--------------|-------> -Z
                        |                   |
                                            |
|[/code]
再举个例子,如下图,眼睛在0.1处,视线指向X轴正向,
那么视景台也在X轴正向上,近面对应的坐标是0.4,远面对应的坐标是0.8
[code]
|Y                   (0.3)            (0.7)
                                           |
|0.0      0.1       | 0.4            |0.8
-------eye *-----|--------------|------->X
                        |                  |
                                           |
|[/code]
另外一种理解方式是这样的:
物体在空间中者有着其固定的位置。物体不被移动,
我们可以通过调整眼睛的位置,和视线的方向,来观看空间中的所有物体。

================================================
其实这是一个非常主观性的问题,
主要是看你如何去看待。
也就是说,我们可以设想眼睛不动,只移动空间中的物体。
但是我们也可以设想坐标系中的物体不动,我们只移动眼睛,
动作是相对的,但效果是一样的

对于3DMAX这样的绘图软件就是一种眼睛不动的做法。
但对于游戏,地形漫游之类的软件,则是采用,物体不动,只移动眼睛位置的方法。来模拟一个人在地形上走动

=====================================

前面我们说过,视景台是可以不对称的(这个特性有一些高级应用),
但大多的情况下我们还是会定义一下与视线对称的视景台。于是我们可以使用gluPerpective这个函数。
gluPerpective
 函数的 zNear, zFar 都是相对眼睛的(YZ平面)距离,fovy是视野角度。

 OpenGL的 <wbr>glOrtho() <wbr> <wbr>glFrustum() <wbr>直观解释

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    来自: wang16500 > 《OSG》

    猜你喜欢

    0条评论

    发表

    类似文章 更多
    喜欢该文的人也喜欢 更多