李顶峰 孔国梁
(铁道第三勘察设计院集团有限公司,天津 300142)
传统的工程设计往往是在二维纸质图或电子地图上进行,设计成果不直观,缺乏真实感。工程三维仿真是一门将工程设计成果数据转化为三维立体图形,模拟现实环境,建立虚拟仿真场景的技术。应用这一技术,可以在工程设计、施工过程中,建立三维仿真景观系统,真实呈现工程建成后的逼真场景,让设计、决策人员对工程设计成果有直观的三维立体印象,从而为工程设计的整体协调、合理性等提供决策依据,并做出更科学的分析和评判,在很大程度上提高了设计的质量和效率。随着计算机软硬件水平的提高,三维仿真技术在工程设计领域越来越得到广泛应用,相关院校及设计施工单位对各种工程三维仿真系统也进行了相关研究开发。由于各类工程既具有一定的共性,又具有一定的差异性,应用需求变化较大,没有合适的统一平台,都需要定制开发。这样造成了很大程度上的重复开发,生产开发效率和质量受到制约。
软件开发平台是指用来构建、支撑应用软件开发的独立软件系统,通常是一个封装了各种底层模型、特定功能模块的更加方便实用的高级API函数库或工具包,它是开发、部署、定制特定软件的基础[1]。一个应用软件,往往是一个复杂的系统,降低其复杂度和提高效率的最好办法就是将系统分层实现,每一个层次实现自身的功能模块,并屏蔽其以下层次的技术细节,这些层次模块具有相对独立的功能,可在不同的应用系统开发中复用和扩展。
为了简便、高效、快速地开发各种工程三维仿真应用系统,本文深入分析工程三维仿真需求及特点,基于OpenGL技术,设计了一种适用于开发各类工程三维虚拟仿真系统的通用平台。文中重点介绍了该平台的层次结构、各模块的功能及关键技术特点、应用方法以及开发实例。
工程三维仿真系统通用开发平台是用来快速构建、开发工程三维虚拟仿真应用系统的高级软件工具包。平台分三层设计,提供可重用的类库,支持系统框架结构的自动生成,全部源程序开放,用户可自由修改内核,在各层次各模块的基础上都能加以扩展和定制,以满足不同的系统应用需求,具有很好的开发性和扩展性。经过反复使用验证,自身具有较高的质量,基于平台开发的新系统也就具有较高的质量保证。
工程三维仿真系统通用开发平台架构分为三层,包括底层基础类库、中间层通用模块及系统应用层,如图1所示。
图1 平台层次结构
底层包括各种基础类库,如Windows API、OpenGL(Open Graphics Library)图形库及Visual C++MFC类库,这些是本文三维仿真平台得以实现和应用的必要基础,处在平台的最底层。其中,OpenGL是绘制高真实感三维图形,实现交互式视景仿真和虚拟现实的高性能三维图形库,是目前应用最广泛的三维图形应用程序设计接口之一,也是行业领域中最广为接纳的计算机图形标准[2]。作为图形硬件的软件接口,OpenGL包括了超过700个图形操作函数,它们分别属于OpenGL的核心库(gl)、实用库(glu)、辅助库(aux)、实用工具集(glut)、窗口库(glx、agl、wgl)和扩展函数库等不同的库。OpenGL的一个长处就是其灵活的扩展机制,扩展函数库正是硬件厂商为实现硬件更新,利用OpenGL的扩展机制开发的函数,软件开发人员可以通过OpenGL扩展使用最新的硬件功能。Visual C++MFC(Microsoft Foundation Classes),是微软公司提供的基础类库,是一种应用程序框架,随Visual C++开发工具发布,MFC提供了应用程序向导自动生成框架,大大简化了应用程序初始框架的构建和界面的设计。
中间层包括各种通用模块、功能件和众多高级API。OpenGL是比较低级的绘图函数库,仅限于生成简单的几何图元(点、直线和多边形),无法直接创建更为复杂的三维物体,同时OpenGL也没有包含应用程序窗口及键盘鼠标事件处理的函数,要创建完整的图形应用程序,必须利用底层函数,整合包装成更加实用的高级API或扩展功能模块,如常用几何图元绘制模块、高级图元绘制模块、视图窗口模块等。工程三维仿真系统在建模、渲染、操作、计算等方面具有较大的共性,在中间层通过对底层模块加以扩展封装,形成更加通用的模块,如纹理映射模块、文字模块、几何运算模块、相机模块等。由于源程序全部开放,用户也可以在必要时使用底层函数进行二次开发,扩展或添加新的功能模块。
应用层是面向具体的工程三维仿真应用搭建的系统框架,包括常用的工程仿真应用模块,如工程数据管理模块、场景构建绘制模块、场景显示控制模块、场景漫游控制模块等,可广泛应用于工程数据可视化、虚拟现实、三维辅助设计、演示汇报等领域,用户只需要在此平台基础上进行一定的功能扩展和改造,即可快速定制开发出一套仿真应用系统,从而大大减少由最原始的基础开发一个仿真应用系统的成本和难度。
该平台对各主要功能都进行了封装,使之成为通用的开发模块,各接口规范统一。平台主要由基础功能模块和应用功能模块两大部分构成,如图2所示。
图2 平台功能模块结构
基础部分涉及三维仿真最基础的功能模块,包括纹理映射模块、文字模块、几何运算模块、高级图元绘制模块、对象拾取模块、视图窗口模块、渲染控制模块和相机模块。应用部分是常用的工程仿真应用模块,包括工程数据管理模块、场景构建绘制模块、场景漫游控制模块、场景显示控制模块、信息查询显示模块、场景输出模块。这些模块都可以直接使用,快速实现系统相关功能,也可以对各模块进行调整改造,满足更加特殊的应用要求。
以下分别介绍各模块的主要功能,同时就其中的关键技术进行深入研究。
纹理映射模块主要解决各种纹理图像的加载及纹理对象、纹理缓冲区对象的创建。
纹理贴图是把一幅纹理图像加载映射到一个多边形的表面,可以增强场景渲染真实感。该模块采用GDI的方式包装了纹理图像的加载及纹理函数的指定,可以统一处理 bmp、jpg、gif、tga等纹理资源的加载以及透明纹理的贴图。
纹理对象通过一个单独的数字来标识纹理,能够在内存中保存多个纹理,而不需每次使用的时候再去加载,从而减少了运算量,提高了速度。纹理缓冲区对象把像素数据存储在OpenGL服务器端,可以消除每一帧渲染时把数据从客户机内存传输到服务器的开销,以提高应用程序的性能。该模块封装了纹理对象以及纹理缓冲区对象的创建。
文字模块主要解决各种字体2D、3D文字的绘制。
OpenGL通常只能处理英文字体的绘制,对于汉字及字体设置都比较麻烦。该模块通过字符位图等方式,包装了2D、3D中英文字符的绘制、字体的设置及字体显示列表的创建,简化了文字的处理工作,提高了开发效率。
几何运算模块主要处理各种几何元素及几何变换的运算。
该模块定义了点、矢量等基本几何元素的数据结构,实现了相应的C++类,可供其他模块开发时用来定义更复杂的数据结构和几何运算。
高级图元绘制模块主要实现各种高级图元的绘制。
OpenGL是比较低级的绘图函数库,仅限于生成简单的几何图元(点、直线和多边形),无法直接创建更为复杂的几何图元或更高级的三维实体。该模块包装了多种直线样式的绘制、多种四边形样式的绘制、凹多边形,以及内部有孔多边形、复杂镶嵌多边形、圆柱体、圆锥体等的绘制,实现了3DS等模型的加载绘制,使各种工程构造物及三维实体的模型构建更加简便、高效。
对象拾取模块主要实现三维仿真环境下实体对象的选择。
对象拾取是指在视图窗口中用鼠标选择物体的过程,涉及用户和图形之间的交互操作,是交互式三维仿真系统必要的组成部分之一[3]。对于二维绘图程序,一般通过计算二维线框与鼠标拾取框的交叉关系来实现,相对比较容易。但对于三维应用程序,由于场景绘制时,几何对象都经过了空间的多次旋转、平移和投影变换,直接设计算法来计算拾取的对象会非常困难。OpenGL的选择模式为用户提供了一种拾取物体的机制,它通过在绘制前命名对象,拾取时可返回特定区域的对象名称,从而获得拾取的对象。该模块包装了对象拾取的相关操作,简单实用。
视图窗口模块主要处理 Windows视图窗口与OpenGL图形绘制的连接,是在Windows环境下使用OpenGL进行三维图形绘制的基础。
Visual C++中没有提供现成的视图类可直接用OpenGL进行图形绘制,OpenGL本身也不包括任何Windows窗口管理和用户交互的函数,它使用渲染场景(Rendering Context)进行图形绘制,因此使用OpenGL在Windows窗口中绘制图形时,需要在每个窗口中嵌入一个渲染场景,通过渲染场景与设备场景的关联,实现OpenGL与窗口的关联。渲染场景保存了与OpenGL发生联系的信息,负责处理应用程序发出的OpenGL命令。像素格式为设备场景设置一些与OpenGL相关的属性,如实现图形动画效果的双缓存、像素的颜色模式、颜色的位数、深度缓存的位数等,在创建一个渲染场景之前,需要为窗口的设备场景设置一个合适的像素格式[4]。该模块在 MFC视图类CView的基础上创建了一个封装OpenGL的视图基类,实现了渲染场景的自动设置,使Windows窗口与OpenGL相关联,可直接调用OpenGL的命令进行图形绘制。
渲染控制模块主要包装渲染绘图模式的控制。该模块通过相关函数,统一实现了多边形填充模式切换、开启关闭纹理贴图、打开关闭光照等功能。
相机模块主要处理三维视景体的设置及操作,类似于照相机的取景功能,包括视点坐标系设置、模型视图变换、投影变换和视口变换。
在三维仿真系统中,屏幕所显示的景物范围是由OpenGL的取景设置决定的。取景操作是OpenGL图形显示绘制的一个关键技术,它通过设定视点坐标系,确定视点的位置及视线的方向,经过模型视图变换及投影变换,定义出要观察的景物空间,并将三维景物投影成二维图像,最后利用视口变换将图像输出到对应的窗口区域中。该模块设计了一个相机类,封装了OpenGL取景操作的基本功能,使开发人员更方便地在应用程序中实现场景的设置。
工程数据管理模块是工程设计数据库与三维仿真系统紧密联系的部分,是系统与数据及文件的接口,包括数据的输入输出、格式转化及相关计算。
工程设计数据是工程三维仿真系统的基础数据来源,在此基础上可以进行各种场景及实体模型的构建、计算。该模块设计了一个数据管理类,包装了设计数据的加载、工程构造物模板的初始化,漫游路径的引入,以及场景数据的分块索引功能。系统开发人员可以在此类的基础上加以修改,以适应各自工程设计数据的导入导出及相关计算应用。
场景构建绘制模块是三维仿真系统的核心模块之一,其中搭建了场景实体构建绘制的统一程序框架,封装了各种通用场景的构建绘制,如背景天空、三维地形、地物等。
该模块通过场景对象基类搭建了场景实体构建绘制的程序框架,使其过程完全规范化与统一,开发人员可以根据需要在此基类的基础上派生新的场景对象类,修改其中对应函数,最大化减少重复劳动,把精力集中在具体的构建及绘制细节需求上,该框架特别适合各种工程构造物模型的构建与绘制。其框架图如图3所示。
图3 场景实体构建绘制的程序框架
该模块采用搭积木的方式构建场景,先将整个工程场景划分为苦干个结构特征各异的子场景或实体,各部分具有较强的功能性和独立性,分别采用合适的实体造型技术构建模型,选用有利的渲染技术绘制场景,最后将各子实体搭建在一起显示,形成整体统一的仿真场景。该方法使复杂的场景简单化,问题处理有的放矢,是一种分而治之的基本策略,非常有利于程序开发的编制、测试及功能扩充。图4为基于此平台开发的某工程三维仿真系统场景实体类层次结构示意。
图4 场景实体类层次结构示意
场景漫游控制模块主要用于场景的静态交互浏览和动态漫游控制。静态交互浏览是一种重要的虚拟观测手段,主要是通过界面、键盘、鼠标等工具,实现对三维空间的交互操作,让用户可以从不同侧面、不同角度、方位进行实时的观测或浏览,给人以身临其境的感觉。交互控制包括平移、旋转、缩放等操作。动态漫游控制统一了漫游视点、漫游路径等相关参数的设置,实现了三维仿真场景的动态演示。
场景显示控制模块主要实现三维仿真场景对象的分类显示控制。该模块统一设定场景对象的显示控制参数,界面采用带检查框的树型控件分类显示各场景对象,并关联对应属性,实现场景对象的按需加载显示。
信息查询显示模块主要实现三维仿真系统中各种数据信息的查询、计算及显示功能。该模块封装了坐标查询、空间距离查询、对象属性查询、视点信息查询以及相应信息显示功能。
场景输出模块包装了屏幕图形的输出及动画录制功能,极大的方便了工程三维仿真效果图的制作及漫游动画的输出,使用户可以脱离系统查看工程三维仿真成果。
工程三维仿真系统通用开发平台是一个高级软件开发工具包,提供了Visual Studio工程模板,实现了平台与Visual Studio的紧密结合,用户可根据需要自动生成三维仿真系统的VC解决方案和工程,也可直接以平台作为系统的基础框架,快速构建工程三维虚拟仿真应用系统的原型,最大化的复用软件代码和各功能模块,减少重复开发。以此基础上,修改相关函数的源代码,自定义各自工程数据的加载及相关计算的引入,组织具体工程实体对象的模型构建与仿真渲染。也可以对平台加以扩展,改造或添加新的功能模块,实现特定的应用需求,快速搭建适应具体工程的仿真应用系统。
目前,使用基于OpenGL的工程三维仿真系统通用开发平台研发了多套直接面向工程实际应用的系统,如“高速磁悬浮铁路轨道梁三维效果图系统[5]”、公路三维实时动态仿真系统、铁路三维虚拟仿真系统、城市虚拟景观系统等,如图5所示。
图5 基于该平台开发的仿真系统实例
上述实践应用表明,该平台的方法及技术切实可行,结构清晰,简化了三维仿真系统的开发过程,减少了重复开发和总的工作量,降低了编程和代码维护难度,可以缩短系统的研发周期,节约软件的研发成本和提高生产效率。平台扩展性强,执行效率高,仿真效果好,运行稳定可靠。
[1]罗昔军,马征.定制软件开发平台的研究与设计[J].计算机技术与自动化,2006,6(2):108-110
[2]吕希奎,周小平.实战OpenGL三维可视化系统开发与源码精解[M].北京:电子工业出版社,2009:10-16
[3]雷鸣,钱世洋,等.基于OpenGL的核心可视化交互功能实现[J].计算机与数字工程,2006(12):138-142
[4]王清辉,王彪.Visual C++CAD应用程序开发技术[M].北京:机械工业出版社,2003:52-61
[5]李顶峰,伍卫凡.基于OpenGL的磁浮铁路实时三维可视化技术研究与实现[J].铁道勘察,2008(2):39-43