
摘要:本文首先概括介绍了虚拟现实技术和OpenGL技术,然后给出了在Visual C++ 2019平台下运用OpenGL实现三维虚拟现实系统的基本过程和方法,探讨了构建过程中的一些技术问题。
关键词:虚拟现实;OpenGL;三维建模
1 引言
随着计算机技术的迅速发展,虚拟现实与我们的生活日益密切。它已成为当今计算机界广泛关注的一个热点,意指“计算机产生的三维交互环境,在使用中用户是投入到这个环境中去并能体验到‘身临其境’的感觉,人与计算机之间的交互极为自然”,虚拟现实的出现改变了人们传统的思维方式,使人、计算机和现实环境紧密的结合起来,现已延伸到娱乐、医疗、军事、建筑、机械等各个领域[1]。
目前,对虚拟现实技术的研究越来越广泛,越来越深入。本文使用OpenGL和VC++工具,开发出一个虚拟现实系统。该系统实现的基本过程为:首先进行素材收集和处理,用数码相机进行实景拍照、再利用Photoshop图像处理软件对其进行加工处理,然后在3dsMax中建模并进行优化处理,最后利用OpenGL和VC++进行三维编程实现虚拟现实。
2OpenGL技术
OpenGL是近几年发展起来的一个性能卓越的三维图形库标准,是一个高性能的图形开发软件包。它是在SGI等多家世界闻名的计算机公司的倡导下,以SGI的GI三位图形库为基础的制定的一个通用共享的开方式三维图形标准。
OpenGL灵活方便地实现了二维和三维的高级图形技术,在性能上表现的异常优越。它具有建模、变换、光线处理、色彩处理、动画以及更先进的能力,如纹理映射、物体运动模糊效果和雾化效果等。OpenGL为实现逼真的三维绘制效果,建立交互的三维场景提供了优秀的软件工具。
OpenGL为应用程序员提供了程序和图形输入输出设备之间的功能接口,定义了一个独立于语言的图形核心系统。因此OpenGL可以与Visual C++紧密接口,该接口由几百个函数组成,利用这些函数,把OpenGL嵌入Visual C++之中,用户可创建出高质量的三维图形。
3模型构建与优化
在实际的三维图形程序中,需要构建的三维模型一般比较复杂,但OpenGL的建模功能并不是很强大,所以需与其它功能强大的三维建模软件结合。3dsMax正是制作复杂三维建筑模型的理想工具。
下面介绍一下建筑物实例的实现过程:
(1)资料收集与准备
建筑物数据一般是利用现有的地图等空间数据,主要包括地形图和最新的规划图。建筑物纹理是建筑物三维模型的重要组成部分,纹理数据主要通过拍摄的数码相片获取,它直接影响着三维场景的显示效果。
(2)在AutoCAD里进行二维平面建模
把收集到的规划图导入到AutoCAD软件中,描出建筑物和道路等的平面位置,进行二维平面建模。
(3)在PhotoShop里制作材质贴图
为了增强场景的真实感,要采用大量的纹理贴图。模型的纹理来自建筑效果图和使用数码相机获得的纹理照片,对纹理数据的采集,一般是数码相机拍摄出各个面的正摄影像。当然,获得的纹理照片需要经过PhotoShop软件的进一步地修整和校正。
(4)在3DSMAX里进行几何建模和场景材质贴图[2]
在3DSMAX里导入CAD平面图,对其进行几何建模,在此过程中用到的命令有描边、挤出、拉伸、位移等。在建好简单的三维立体模型之后,对其进行材质贴图,以使模型具有较强的真实感。对于某些细节可以不必建模,直接用图来模仿,比如花坛里植被的建模就是直接在一個矩形上贴上对应的图片来近似生成的。在赋材质时候,可利用UV编辑器和透明贴图通道的调节,来使模型达到更为真实的感觉。
(5) 把模型导出为3ds格式文件
整个场景模型完成后,在3DSMAX 中将模型用 Export命令导出为 3DS 文件格式。这样,因为系统提供了可以导入3ds文件的接口,所以可以很方便地打开建好的模型。
下面为在3D Studio Max建立的模型效果图:
4系统组成与功能模块
本系统是在Windows XP 操作系统下,基于Visual C++6.0平台,调用OpenGL 函数库的函数设计实现的,在建立模型时采用了3dmax软件。
系统可以导入3ds格式的三维模型,在系统中重绘,显示不错的三维效果。用户可以对模型进行一定的处理和控制,这些处理和控制包括对象的材质编辑、场景中的灯光进行控制、利用鼠标来对视点进行控制和实现漫游功能等等。依照系统设计的功能可以将整个系统分为三个模块,即:3DS文件的导入模块、材质、光照处理模块、多视点观察模块。
本系统的功能模块框架如下图所示。
5系统实现
5.1构建OpenGL图形开发环境[3]
(1)创建MFC界面,向工程中添加OpenGL编译链接库opengl32.lib、glu32.lib、glaux.lib、glut32.lib,并确保在系统的system32目录下有下列动态链接库文件的存在:glu.dll、glu32.dll、glut.dll、glut32.dll、opengl32.dll。
(2)编写创建函数。因为OpenGL仅能在客户窗口中绘图而无法在该窗口的子窗口和兄弟窗口中绘图,所以必须在客户区域中加以去除。本程序在VIEW类的PreCreateWindow()函数中添加下面语句来实现:
cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;