OpenGL物体显示被截断:视景体与相机的运动与作用

         OpenGL中,成功显示了一个图形,然后图形不动,仅仅移动照相机,将照相机拉远,渐渐地会发现图形开始被某个平面截断了,显示不全。

         相应地,如果照相机不动,移动物体,随着物体朝某个方向一直持续移动,会发现物体也开始被某个平面截断。这种情况很好解释,这是因为物体平移出了视景体区域,视景体的边界就会把物体截断。虽然视景体没有移动,但是物体移动了

         实际上,平移相机造成的物体截断也是因为物体遇到了视景体区域边界。因为视景体始终都是跟随照相机的,视景体的投影函数的各个参数始终都与照相机相关。所以,照相机平移,会导致视景体同步平移,从而平移到一定程度会将物体截断。虽然物体没有移动,但是视景体平移了

         所以,要平移照相机或者物体依然能看清物体全貌,需要谨慎设置视景体的大小,也就是far这个参数。

        

         现在只考虑透视投影的情形

         透视投影函数:

         gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)

         摆好照相机,观察物体时,有的时候物体可以看全,有的时候却不可以。这不仅仅取决于视景体怎样取,还取决于相机放置的位置。

         默认地,相机与视景体都采用世界坐标,二者都位于(0,0,0)点。不妨设观察物体是个立方体。首先放置相机,放置于(0,0,0)点。然后放置立方体,其中心点也放置于(0,0,0)点。于是,相机就被立方体罩在中间,相机从立方体内部向外观察:

①  如果观察角度比较大,视景体的near离相机较近,那么相机是可以看到立方体正对相机的那个面的一整个面,外加上四条边的一部分

②  如果观察角度比较大,视景体的near离相机较远,导致立方体正对相机的那个面并没有位于near与far之间,那么相机看不到任何东西

③  如果观察角度比较小,视景体的near离相机较近,那么相机可以看到立方体正对相机的那个面的一部分

④  如果观察角度较大,视景体的near离相机较近,far离相机也较近,导致立方体正对相机的那个面位于比far更远的位置,于是near与far之间就只有四条边的一部分,所以相机就只能看到这一部分

 

         关于上述部分,有几个要点:

①  相机坐标系原点与绘图坐标系原点(未经过任何glTranslatef)之间是有距离的,这个距离取决于世界坐标系下的相机位置。相机在初始化时需要指定自身摆放位置,物体的绘图坐标系在初始化时(未经过任何glTranslatef)默认是世界坐标系原点。若平移相机,那么相机与默认绘图坐标系原点间的距离就会变化

②  投影函数的near指的是视景体离相机较近的一面距相机的距离。这个near与世界坐标系无关。near与far仅仅决定了视景体的范围,一个物体只要在视景体范围内,在观察角度理想情况下,是一定可以被相机看到的

③  观察角度与near和far其实是无关的,没有任何比例关系。观察角度仅仅决定了相机究竟能看到多大的范围。虽然有个视景体宽高比在限制,但实际上观察角度不用关心这个比例。观察角度是可以随意设置的,与其他任何条件无关

④  物体自身进行旋转,那么物体的某个角可能会旋转出视景体范围,若出了该范围,物体就会被截断。所以要把视景体范围设置的尽可能理想,足以容纳可能出现的任何物体操作。同时注意平移相机会导致视景体平移

⑤  视景体的范围,是一个封闭的平截头体。从相机位置发出的视线与far平面上的矩形观察区域四个角构成了一个金字塔,金字体被nearfar两个平面夹在中间的平截头区域就是视景体的范围。注意该范围是所能看到的最大范围,与视角无关。根据near、far以及far上面观察区域的宽高,可以求出一个角度θ,该角度θ是可以看到物体的最大角度。设置投影变换时,设置的角度是任意的。如果将设置的角度设为θ,那么该视景体内一切的物体都可以被看见,并且视景体边缘刚好在窗口显示区域边缘;如果将角度设为小于θ,那么该视景体内的物体仅有一部分被看见;如果将角度设为大于θ,那么该视景体内的物体都可以被看见,但是窗口显示区域边界部分永远都是黑色,因为那一部分不属于视景体,虽然也能被看见,但全是黑色。即:根据视景体所计算出的角度仅仅为可观察的最大角度,设置投影角度的时候可以设置成与此不同的角度

⑥  实际上,设置投影函数的时候,OpenGL是根据设置的投影变换角度以及near与far来计算far平面上的宽和高。于是,为了尽可能令看到的far平面区域大一些,需要令near尽可能小。由于near必然为正,故可以设near为0.1f

如图:距near平面越近,可看到的最大far平面区域就越大。


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值