在用opengl学习和开发3d软件的时候,要是做出的模型能够随意地通过鼠标拖动转换视角,不用重复地调整参数重新编译,对程序开发来说会很省事。
去年做了一个opengl的鼠标交互式的程序http://blog.pfan.cn/jiagleo/42301.html,可以随意通过鼠标拖动旋转物体,切换视角,不过那个程序只能让你从周围观察原点。下面我再做一个漫游的程序,使你能随意改变观察点的位置,并且能够调整方向。我将更进一步把它集成一个工具库,用起来就像gluLookAt一样方便。
一、要看懂本程序,我假定网友们已经懂得了基本的C/C++知识,并已经掌握opengl的基本绘图框架。
二、首先还是先声明一下工作环境,我们使用的是C++,用glut函数库,这样就可以与平台无关了,用VC或Dev,还是Win或Linux等等都可以。
程序使用了GLUT库,需要下载库文件,执行时需要相应的动态链接库。在Windows平台下的下载地址:http://www.opengl.org/resources/libraries/glut/glut_downloads.php。
Windows环境下安装GLUT的步骤:
将下载的压缩包解开,将得到5个文件
(1)glut.h 放在“include/GL”;
(2)glut.lib和glut32.lib放在“/lib”;
(3)glut.dll和glut32.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