在搭建好了应用程序框架之后,我们就可以在其中加入绘制场景的代码了。我们要在场景中绘制出天空、地面、植物和建筑物,从而逐步创造一个虚拟的三维环境,然后增加在其中漫游的功能,实现简单的交互。
4.1 绘制并显示地形
在 OpenOL框架初始化之后需要调用 InitTerrain()函数来生成地形数据数组,进行地形的初始化。编写一个函数来绘制地形,命名为 DrawTerrain(),在其中调用 glDrawgle.ments()函数,通过绘制三角形带的方式来绘制地形。如果地形有纹理,可以调用glBindTexture()函数给地面贴图。把DrawTerrain()增加到 DrawScene()函数中,这样在每次屏幕刷新时就能自动重新绘制地形了。
4.2 载入并显示 3ds格式的模型文件
天空、建筑物等虚拟对象都是采用预先建模的方式创建的,我们已经将其统一保存为“3ds”格式的文件。我们还需要在程序中包含一个名字为“3ds.h”的头文件,其对应的源文件叫做“3ds.cpp”,二者均可互联网上找到。对每一个3ds文件,可以先用 3ds.h文件中的载入函数将其调入程序,并为其分配各 自的编号,再调用显示模型函数在 OpenGL环境中显示相应的 3D模型。显示模型函数的参数同时定义了模型显示的位置、方向和比例。载入模型的工作可以在程序初始化时完成,而显示模型的函数应添加到 DrawScene()函数中。
4.3 载入并显示植物
按照前面提到的方法,在虚拟三维场景中显示一株植物实际上是显示一幅植物的图片(而不是 3D模型)。我们先在程序中载入图片,然后在屏幕上绘制四边形,把植物的图片作为贴图显示出来。在虚拟三维场景中漫游时,我们知道自己的视线方向,也可以计算出自己所处的位置坐标,那么,就可以编写一段代码,让具有植物纹理的四边形每次重绘时都始终与我们的视线方向垂直,从而形成一种三维模型的效果。
4.4 添加漫游功能
完成了虚拟三维场景的创建和绘制以后,还需要给程序添加漫游功能。有了漫游功能,我们不但能够看到虚拟三维场景,更能以第一人称参与其中,更加“真实”地体验这个虚拟世界。
在现实中人们看到的画面效果,主要取决于两个方面:观察点的位置和视线的方向。在 OpenGL中,也有类似于我们眼睛的东西,我们可以使用 函数 gluLookAt()来改变在OpenGL场景中的观察点的位置和视线方向,我们把这个函数添加到 DrawScene()函数中。在程序运行期间,通过使用键盘和鼠标等来改变观察点坐标和视线方向。屏幕每次刷新时,改变函数 gluLookAt()中的参数值 ,OpenGL就会用新的视角重新绘制屏幕上的画面,从而产生在场景中漫游的效果。
到目前为止,一个简单的交互式虚拟三维环境就建成了,它可以作为任何一个实用的虚拟三维环境的基础模块,我们可以在这个基础上继续丰富场景内容,添加其它功能,逐步完善程序。
5 程序的优化和其它功能的介绍
在虚拟三维环境的设计中,还有很多值得借鉴的方法。比如,用地形灰度图来生成高度数据,使用区域分块显示技术来提高渲染速度,采用 M0D(分级显示)技术加快贴图显示速度并产生较好的效果,用位图字体、轮廓字体等显示汉字,使用显示列表显示多个重复模型从而提高效率,使用粒子动画来模拟爆炸、烟雾等场面,在程序中添加碰撞检测的功能以符合物理原理,等等。
6 小结
计算机技术发展到今天,再也不能忽视虚拟世界与现实世界之间的密切联系,虚拟世界正在越来越真实地再现着现实世界中的一草一木。虚拟三维环境作为虚拟世界的主体,直接决定着虚拟世界的真实感。OpenGL等技术的应用使得三维图形技术在虚拟现实、三维仿真、模拟训练、电子娱乐等领域得到了越来越广泛的应用,一些平常无法实现或很难实现的自然环境和工作环境的模拟在虚拟世界中成了家常便饭。它在带给体验者更加逼真的感受的同时,也大大降低了各种成本,提高了工作效率,有着广阔的发展空间。