OpenGL漫游的实现

    在用opengl学习和开发3d软件的时候,要是做出的模型能够随意地通过鼠标拖动转换视角,不用重复地调整参数重新编译,对程序开发来说会很省事。

 

    去年做了一个opengl的鼠标交互式的程序http://blog.pfan.cn/jiagleo/42301.html,可以随意通过鼠标拖动旋转物体,切换视角,不过那个程序只能让你从周围观察原点。下面我再做一个漫游的程序,使你能随意改变观察点的位置,并且能够调整方向。我将更进一步把它集成一个工具库,用起来就像gluLookAt一样方便。

 

一、要看懂本程序,我假定网友们已经懂得了基本的C/C++知识,并已经掌握opengl的基本绘图框架。

二、首先还是先声明一下工作环境,我们使用的是C++,用glut函数库,这样就可以与平台无关了,用VCDev,还是WinLinux等等都可以。

 

程序使用了GLUT库,需要下载库文件,执行时需要相应的动态链接库。在Windows平台下的下载地址:http://www.opengl.org/resources/libraries/glut/glut_downloads.php

Windows环境下安装GLUT的步骤:  

将下载的压缩包解开,将得到5个文件

1glut.h 放在“include/GL”;

2glut.libglut32.lib放在“/lib”;

3glut.dllglut32.dll放到“C:/Windows/System32

三、原理:

我们要完成如下功能:

镜头上下转(沿红色线),左右转(沿绿色线)以及左右倾(沿蓝色线),如图:

 

 

还有前后左右上下平移。

 

一、     要实现这些,原理非常简单,分四步:

1.  我们先需要声明一个矩阵;

2.  变换的时候把矩阵加载到当前视口矩阵里;

3.  调用opengl内置的坐标变换函数,然后取出矩阵;

4.  用的时候,直接加载自定义的矩阵即可。

 

分别创建一个头文件和源文件:ramble.h  ramble.cpp

 

ramble.cpp文件里:

首先声明变量:

 

 

程序开始的时候,需要初始化一下:

下面就是我们需要完成的主要的函数,把它们放到头文件里:

然后,在源文件里实现:

只举两个例子:

 

其他的类似,把参数改一下就可以了。

为了更简洁地调用这些函数,而不用每次都传入一个参数,重载这些函数:

为此,我们还必须在头文件里声明两个变量,用于管理默认的变换幅度参数:

举其中一个例子:

其他的照搬就可以了

 

但是,这离我们的要求还有点距离,我们要把这些东西封装成一个工具库,也就是说,我们要做到,用户一拿到这两个文件就可以直接使用,而无需管内部过程。

那么我们需要下面函数,用来响应相应的消息:

 

    你可以看到,其实不要这些也可以,但这是一种非常好的思想习惯,你不可能每次写个程序,都把一大堆让别人觉得莫名奇妙的函数往主程序里放,这样会给人阅读造成困难。并且当你以后修改的时候也会很方便。

 

    最后是怎么在主程序里用了。很简单:

1.  opengl初始化完成后调用RambleInitial();

2.  在相应的消息相应函数里加入对应的调用函数,就是上面的12个函数;

3.  在绘图函数的开头使用Ramble();

 

源代码:

main.cpp:

ramble.h:

ramble.cpp:

 

    运行程序后,使用wsad实现前后左右转动,qe实现左右倾,方向键控制前后左右运动,rf上下运动。

    如果你离远点很远的话,视图投影会有些不正常,这和AutoDesk 3DS MAX的渲染效果图里的漫游出现的情况有点类似,我猜他们会不会是按照这种方法设计的?

    每次你做视图变换的时候,OpenGL都会重新一些其它的参数,因此,这种方法有可能很不安全,而且会浪费一些运算时间。下次再做个程序来改进吧。

 

 

代码纯属原创,转载请注明,有意见请发email到jianglve@live.cn

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值