李宏宏,康凤举
(1.西北工业大学航海学院,陕西西安710072;2.水下信息处理与控制国家重点实验室,陕西西安710072)
OpenFlight模型是 Multigen-Paradigm公司(简称MPI)推出的用于描述三维虚拟场景的数据模型,广泛应用于各种视景仿真系统中,并成为视景仿真领域事实上的行业标准。随着三维视景仿真系统规模的增大,三维实体建模工作耗费时间越来越长,占据了系统开发的大量时间,延长了视景仿真系统开发周期[1],因此就三维建模存在的建模耗时长,扩展难等问题,对可组合的建模技术提出了更高的需求。可组合建模即对多个模型中共同的部分进行建模,后期根据需求以装配的方式组装成所需的模型即可。目前对OpenFlight模型可组合性研究比较少,就OpenFlight模型建模存在的问题,王娇艳等使用OpenFlight AP I函数扩展了Creator,实现了模型细调、重组等功能,缩短了建模时间,但是在模型控制方面没进一步研究[2]。姚林海等利用配置表描述模型的组装扩展信息,在模型加载过程中实现了模型重组,虽然根据配置表实现了模型的按部件控制,但是在仿真前期对模型的修改非常不直观[3]。李荣江等利用分块技术实现了模型的分块建立[4],在后期仿真过程中,模型的部件可以根据视点的远近动态加载,加快了模型的加载速度和显示帧频。
本文首先对OpenFlight模型数据格式进行研究,利用OpenFlight API函数通过对模型数据的读取、修改、组合和写入等方式实现了多个OpenFlight模型的组合,并提供了友好的人机界面实现模型的可视化组合,完善了模型可组合建模工具,大大缩短了建模时间,加快了视景仿真系统的开发周期。
Creator是软件源码不可获取的商品化的虚拟现实建模工具,但是Multigen-Paradigm公司提供了OpenFlight API对Creator的功能进行扩展和对OpenFlight模型进行读取操作,因此可以利用OpenFlight API读取三维模型的数据对模型数据进行调整组合操作,然后再根据用户需求写成一个三维模型数据文件,即可实现三维模型的组件化建模技术[5]。OpenFlight API是一个基于C语言的二次开发函数库,它提供了访问OpenFlight数据库和Creator模型系统的接口方法。通过API可以进行OpenFlight模型的转换、实时的模拟仿真、自动建模以及通过插件的形式对Creator进行功能扩展。OpenFlight API函数库的功能函数主要分成读取、写入、扩展和工具四个不同操作功能模块,对于构建OpenFlight模型来说,使用其中的读取和写入两个模块的OpenFlight API函数即可。
OpenFlight三维模型建模方式主要可以扩展为两种:一种是通过Creator建模工具直接进行三位实体建模来得到OpenFlight模型,另一种是通过creator建模工具建立各组件,然后利用该模型组合工具来得到OpenFlight模型[6]。总括这两种建模方式,OpenFlight三维模型建模流程如下所示。
(1)首先对所建模型的三维实体进行分析,将其拆分为几个不同的组件,划分的目的是使各模型更容易通过组合实现模型的构建,模型组合也可以使用已有的模型组件。
(2)对于单个实体的建模,一般不需要拆分,直接利用Creator建模即可。对于拆分好的组件,一一建模即可。
(3)利用该软件组合模型,完成多个模型的初步建模工作。
(4)在进行导出模型前,需要对纹理图片,LOD和面片等进行校正、拼接等处理,这样可以减少优化模型。然后导出生成模型即可。
(5)完成整个三维对象模型的构建工作。
OpenFlight格式及OpenFlight API是Multigen开发的,在视觉仿真领域最为流行的标准文件格式。OpenFlight采用几何层次结构和节点(数据库头节点、组、物体、面等)属性来描述三维物体,数据节点种类很多,其常用的数据节点类型如表1所示。各类型的节点具有不同的属性信息,其中一些属性使用属性调色板索引号来描述,如颜色、材质、纹理等。在OpenFlight模型中,数据节点大致包括:根节点、组节点、体节点、面节点和点节点等五大类,这些节点按照树状结构组织起来。一个OpenFlight数据库的层次结构被作为一个文件存储在磁盘上。模型以0,1二进制代码存储,8位为一字节,字节的存储顺序是按照正序方式存储的。所有的模型文件都是以4个字节开始记录。前两个字节代表记录类型,后两个字节代表文件长度。其中在相邻节点上,子节点隶属于父节点无论是在空间位置还是功能上,而兄弟节点之间则存在着一定的相关性。OpenFlight的这种树状多层结构允许用户直接对树根节点和下属各节点进行操作,保证了从大型模型数据库每个顶点的精确控制[7]。
表1 OpenFlight主要数据节点的说明Tab.1 Main data node of OpenFlight
利用OpenFlight API对OpenFlight文件进行基本读写的流程主要包括程序初始化,创建头节点,新建组节点以及其他节点等,然后绘制几何节点,并建立节点间的层级关系,最后写入并关闭数据库,程序退出等若干步骤。具体流程如下:
(1)程序主参数进行初始化;
(2)新建头节点,建立数据库集;
(3) 创建节点(光照,声音,DOF,LOD,…),并给记录集属性赋值;
(4)通过若干三维坐标创建顶点集;
(5)创建若干子面 addVertex,组成面集makePoly;
(6)创建若干体节点fltObject,组成组节点fltGroup;
(7)写入数据文件形成模型文件mgWriteDb(db)。
3.2.1 组件的添加
添加组件主要指将组件库中的组件模型添加到其他模型中,形成一个新的模型供仿真使用。其中组件以该子节点的形式在所装备的主模型中显示,为了使导出模型与纹理的路径不相关,在此都使用绝对路径。组件添加采用将组件以外部扩展节点的调用方式加到主模型中。利用外部扩展节点,可以更加快速、方便地组合模型。这样做也便于后期将完整模型拆分成相对独立的组件模型,对于拆下来的组件模型还可以应用到组件模型库的构建中,从而提高了模型的利用率。
添加组件节点的具体实现代码步骤如下:
得到当前的数据库头节点mgGetCu rrentDb();
新建一个Group节点mgNewRec();
创建一个外部节点mgNewRec();
选择的组件文件mgListGetSe lectedItemString();
将选择的文件设置为外部节点mgSetA ttL ist();
将外部节点作为新建Group节点子节点mgA ttach();
写入数据库头节点mgW riteDb()。
添加组件模型后,在Creator中的结构如图1所示。
图1 模型结构Fig.1 Model structure
3.2.2 组件的删除
组件的删除主要是指将外部添加进来的外部节点删除,由于外部组件都是添加了一个节点,所以从模型中删除一个组件模型可以通过删除其父节点而实现,代码如下:
g=mgGetRecByName(db,selectFullFltName);//选择节点
mgDelete(g);//删除节点
3.2.3 组件的移动
模型的移动首先需要定义两个点,一个点是模型初始位置,另一个点是模型中心要移动的差值点,然后将这两点赋给fltXmTranslate格式记录集,模型经过记录集的变换即可实现模型的移动。具体代码如下:
mgrec* c=gNewRec(fltXmTranslate);//定义记录集
mgSetCoord3d(c,fltXmTranslateFrom,a1,a2,a3);//设置模型初始位置点
mgSetCoord3d(c,fltXmTranslateDelta,b1,b2,b3);//设置模型移动差值量
mgAttach(g,c);//将组件进行移动
3.2.4 组件的旋转与缩放
模型的旋转与缩放在此提供绕xyz轴旋转和缩放,通过选择中心点、旋转轴和旋转角度或缩放系数即可实现模型的旋转与缩放,具体代码实现如下:
mgrec*x=mgNewRec(fltXmRo tate);
mgSetCoord3d( x,fltXmRotateCenter,a1,a2,a3);//选择中心点
mgSetVector(x,fltXmRotateAx is,0,0,1);//选择以z轴为旋转缩放轴
m gSetA ttList(x,fltXmSca leZ,z,MG_NULL)//以z轴缩放z倍
mgSetAttList(x,fltXmRotateAngle,50,MG _NULL);//设置旋转角度为50°
mgAttach(g,x);//旋转与缩放模型
图2为模型平移缩放后在Creator中的结构图。
图2 模型结构图Fig.2 Model structure
按照以上的框架设计和操作模型的基本功能,基于 MFC 单文档框架、vegaprime 2.2和OpenFlight API编程实现了模型可组合建模工具,其界面如图3所示。该工具具有良好的人机交互编辑模型功能,以所见即所得的形式提供模型元件的平移、旋转、缩放等几何变换操作和拆分、组合等编辑操作以实现模型的可组合构建。
图3 可组合建模工具运行界面Fig.3 Interface of the modeling tools
在此利用该工具将一架飞机和若干导弹进行了组合建模(图4,图5)。
图4 分离的导弹和飞机Fig.4 Missiles and aircraft
图5 组合过程和组合模型Fig.5 Process and portfolio model
本文通过调用OpenFlight API接口语言,实现了通过组装模型组件建立完整模型的功能,并且模型组件可以被任意删除、移动、旋转、缩放等,解决了模型可组合建模的问题。这样可以充分利用已有的模型资源,减少虚拟模型的建模工作量。但是本文对模型的纹理编辑,LOD节点、DOF节点等特殊节点编辑功能还未实现,有待进一步解决。
[1] 李荣江,赵刚,陈雷.基于Creator的分块技术研究与实现[J].四川理工学院学报:自然科学版,2010,23(2):216-218.LI Rongjiang,ZHAO Gang,CHEN Lei.Research and implemention of block technology based on creator[J].Journal of Sichuan University of Science&Engineering:Natural Science Edition,2010,23(2):216-218.
[2] 张建.Creator三维模型数据库优化技术[J].系统仿真技术,2010,6(12):164-168.ZHANG Jian.Optimization technique of creator three dimensional model database[J].System Simulation Technology,2010,6(12):164-168.
[3] 孔中武,石林锁,王涛.基于 Creator和VegaPrime的导弹飞行视景仿真系统设计与实现[J].四川兵工学报,2014,35(10):111-114.KONG Zhongwu,SHI Linsuo,WANG Tao.Design and implementation of missile flight scene simulation based on creator and vega prime[J].Journal of Sichuan Ordnance,2014,35(10):111-114.
[4] 丁伟利,王露.基于OpenFlight模型的通用桥梁红外辐射特性模拟方法[J].光电工程,2013,40(10):54-62.DING Weili,WANG Lu.Infrared radiation characteristics of general bridge based on OpenFlight model[J].Opto-Electronic Engineering,2013,40(10):54-62.
[5] 常彦博,李智.虚拟三维地形模型的建模技术研究[J].桂林航天工业学院学报,2014,73(1):12-15.CHANG Yanbo,LI Zhi.Study on the modeling technology of virtual 3D terrain model[J].Journal of GuiLin University of Aerospace Technology,2014,73(1):12-15.
[6] 罗丹,蒋自成,王跃峰.OpenFlight模型的OpenGL接口研究[J].计算机仿真,2005(1):402-404.LUO Dan,JIANG Zicheng,WANG Yuefeng.Research of interface of OpenFlight model into OpenGL based systems[J].Computer Simulation,2005(1):402-404.
[7] 刘立嘉,刘裕.OpenFlight模型编辑器的设计与实现[J].石家庄铁道学院学报:自然科学版,2009,22(2):54-58.LIU Lijia,LIU Yu.Design and realization of OpenFlight model editor[J].Journal of Shijiazhuang Railway Institute:Natural Science,2009,22(2):54-58.