OpenGL学习08-透视投影&照相机

        透视投影执行透视除法,对观察者较远的物体进行缩短和收缩。投影到屏幕之后,可视区域后端和前端的宽度度量方式并不相同。因此,如果两个逻辑大小相同的物体分别位于可是区域前面和后面,前者看上去要比后者大一些。

        如图1所示,该图形被称为平截头体(frustum),它的观察方向是从狭窄端到宽阔端,另外还显示了观察则的位置。

 

图1,来至OpenGL超级宝典

        可以使用glFrustum函数来定义一个平截头体。它的参数是前后裁剪平面的坐标和他们相互之间的距离,如下所示:

                void glFrustum(GLdouble left,GLdouble right ,GLdouble bottom,GLdouble top,GLdouble zNear,GLdouble zFar);

        glFrustum函数接受6个参数,left、right是相对于垂直平面左右坐标的位置; bottom、top是相对水平平面上下位置;zNear、zFar是远近平面相对于观察者的距离(必须为正值)。

        但是,在设置投影以以获得自己所需的效果时,glFrustum使用起来并不是很直观。工具函数gluPerspective更容易使用,在大多场合,它看上去更直观。

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

        gluPerspective函数接受4个参数。fovy为垂直方向的视野角度;aspect是视口宽度与高度的比例w/h;zNear近平面距离观察者的距离;zFar远平面距离观察者的距离。代码如下:

void changeSize(GLsizei w, GLsizei h)//窗口大小被改变是调用
{
GLfloat aspectRatio;
if(h == 0)
h = 1;
glViewport(0, 0, w, h);//设置视口区域为整个窗口
//重置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
aspectRatio = (GLfloat)w/(GLfloat)h;
gluPerspective(45.0f, aspectRatio, 1.0, 450.0);
//重置坐标系统
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}


        OpenGL中其实并不存在像照相机这样的东西。我们只有用照相机作为一种有用的比喻,帮助我们在某种宽广的3D环境中管理观察点。如果我们把照相机想象为一种物体,它在空间具有某个位置和特定的方向,就会发现当前的参考帧系统在3D环境中既可以用角色来表示,也可以用照相机来表示。

        为了应用照相机变换,我们要使用照相机的角色变换并对它进行反正,这样向后移动照相机就相当于向前移动整个场景。类似地,向左旋转相当于把整个场景向右旋转。

OpenGL工具库中包含一个函数,他所使用与我们存储在帧中的帧数据结果相同,可以用它来创建我们的照相机变换,如下:

                void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

        这个函数接受几个参数,eyex、eyey、eyez观察点的位置;centerx、 centery、centerz观察点前面直接位置上的一个点;upx、upy、upz向上向量的方向。不是特别好理解,网络上有这种所发:“你把相机想象成为你自己的脑袋:第一组数据就是脑袋的位置,第二组数据就是眼睛看的物体的位置第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)”,这样就很好理解了。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值