基于OpenGL的三维模型渲染技术研究*
2015-03-14董鸿鹏姜本清
董鸿鹏 姜本清 方 伟
(海军航空工程学院信息融合研究所 烟台 264001)
基于OpenGL的三维模型渲染技术研究*
董鸿鹏 姜本清 方 伟
(海军航空工程学院信息融合研究所 烟台 264001)
物体三维模型的渲染是仿真领域中的一个重要方面,论文以OpenFlight模型为例,设计了一种基于OpenGL的三维模型渲染方法。分析了OpenFlight模型的格式特点,根据其特点利用API实现了基于OpenGL的三维模型正确表现,并可在渲染后对目标模型进行采样、面片选择等进一步处理。仿真结果显示了该方案的有效性。
三维模型; OpenGL; OpenFlight
Class Number TP391.9
1 引言
随着计算机仿真技术、虚拟现实技术的飞速发展,如何建立一个高质量、高精度且数据易于处理的三维物体模型成为一个越来越重要的问题。
OpenFlight是由Multigen公司开发的由Creator软件生成的一种用于存储空间模型数据和图像信息的空间数据格式,被认为是目前虚拟现实领域中空间数据格式的工业标准。但由于其应用平台的限制性,只能对模型进行有限的处理。目前支持不同模型格式进行相互间操作的软件接口较少且效果不高,可拓展的应用范围有限。
为使OpenFlight模型得到进一步应用,如计算三维模型的电磁散射特性、与其格式他模型和软件平台进行数据交互等,本文基于OpenGL的图形渲染功能和Visual Studio的编程功能,实现读取OpenFlight模型文件并对其进行再处理。
2 OpenFlight三维模型
OpenFlight是一种按层次组织的逻辑化场景描述数据库。一般的OpenFlight模型由几何对象数据、属性和层次结构三方面组成。几何对象数据以一系列有序的三维坐标的集合描述了几何对象。属性包括一些如纹理、材质等方面的附加内容[1]。层次结构将数据节点以层次化的逻辑结构组织起来,适用于实时显示。OpenFlight三维数据库将各层数据节点按树状结构进行组织,如图1所示,子节点在空间位置或功能上隶属于父节点,兄弟节点之间则存在着相关性。不同类型的节点拥有不同的属性信息,其中一些属性如颜色、材质、纹理等,使用属性表索引号来描述。
OpenFlight文件由线性的二进制流记录组成,所有字节都按照Big Endian(低地址存放最高有效字节)方式存储。为了方便用户快速解读和构建OpenFlight文件,Multigen公司提供了独立于建模平台的二次开发函数库OpenFlight API,包含了四类不同功能的函数: 1) 读取函数,用于遍历数据库并查询其中的信息; 2) 写入函数,用于创建和编辑OpenFlight数据库中的节点; 3) 扩展函数,用于创建OpenFlight数据库中新类型节点或节点的新属性; 4) 工具函数,注册和插入用户自定义的插件和算法。这些函数使开发者不需过多关注二进制文件的底层结构细节[2,8,10]。
图1 OpenFlight模型结构
3 OpenFlight三维模型的提取
图2 OpenFlight模型读取流程
OpenFlight用结合层次结构和节点(数据库头结点、组、物体、面等)属性来描述三维物体,允许用户直接对层次结构及节点进行操作,实现了从大型数据库到物体单个顶点的精确控制[3~4]。因此,要完全获取OpenFlight数据格式文件的信息并正确渲染出来需要很大的工作量,在一般的仿真场景下也没有必要。可先利用OpenFlight API获取数据库中所有多边形的信息,包括三维实体的顶点坐标、顶点法向量、纹理坐标和多边形的材质、纹理等,然后将这些信息储存在多边形链表中,利用OpenGL来渲染三维模型。
OpenFlight数据库的储存信息分为两个部分:一个部分是数据库的公用信息,包括纹理、光照、材质、声音等,通过pallete(托盘)的形式放在根节点上的;另一部分是三维模型中所有多边形面的几何和渲染信息,这些信息则分别存储在各个多边形节点上。因此三维模型在渲染上也分成两个部分:一个部分是纹理数据的预读取,首先利用函数将纹理数据读入内存,然后将其绑定,把绑定索引值和纹理索引值对应起来,这样下一部多边形渲染的时候就能按索引值找到对应的纹理;另一部分是多边形的渲染,从头至尾遍历多边形链表,调用函数根据每一个多边形的属性进行绘制[5,9]。
程序具体实现过程:
1) 创建纹理、材质、顶点坐标、多边形等结构体链表作为基本类;
struct vertex{double x,y,z; float i,j,k;…}
struct texture{…}
struct polygon {…}
…
2) 利用API的mgOpenDb(…)使程序进入到FLT文件的头结点,开始提取三维模型数据;
3) 编辑函数分别对模型的纹理、材质、头结点和视点位置信息进行读取;
loadTexture(…);
loadMateria(…);
readHeader(…);
loadEyepoint(…);
4) OpenFlight是以三角面片形式提供顶点的信息,因此在提取时可将模型以三角面片为基本存储单位,利用循环函数,将模型的基本信息存储在一个多边形结构体的链表中;
5) 将多边形结构体链表和上一步中提取的纹理链表利用索引值对应起来;
6) 利用函数mgCloseDb(…)关闭FLT文件,清理程序缓存。
4 三维模型的渲染技术
OpenGL(Open Graphic Library)是一个优秀的三维图形硬件的软件接口(Application Programming Interface,API),同时也是一个跨平台、开放性的三维图形和模型库。OpenGL在不同平台上都具有非常快的渲染速度,是高性能图形和交互性场景处理的行业标准[6]。
在使用OpenGL渲染前,必须根据模型对OpenGL做合理的初始设定,如绘制前首先要对场景进行初始化:创建窗体,设置OpenGL绘图窗口大小、投影模式,定义视图体,设置光源,定义视点位置、视角和视线方向等等。为更准确的观察、使用渲染后的模型,程序使用函数glTranslatef(…)、glScaled(…)和glRotatef(…)来实现模型的移动、缩放和旋转。
在OpenGL中,深度表示像素点在3D世界中距离摄像机的距离(绘制坐标),深度缓存中储存着每个像素点的深度值。为使在绘制时避免后绘制的物体把先绘制的物体覆盖掉,可以利用OpenGL的深度检测功能[7]。
启动深度检测,打开深度检测开关并设置检测方式:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
并且在完成绘图以后,实现禁止深度检测:
glDisable(GL_DEPTH_TEST);
5 仿真结果及功能拓展
为验证程序的正确性,用Creator软件分别建立了B2轰炸机和某型舰船的三维模型,对比图3和图4,可看出渲染效果较好证明了程序的实用性。
图3 B2飞机模型在Creator和本文程序中的对比
图4 舰船模型在Creator和本文程序中的对比
通过把OpenFlight三维模型从限制性比较强的Creator软件转换到编辑功能强大的Visual Studio平台上,可以对模型数据进行处理实现更多功能。
5.1 三维模型面片选择
由于OpenFlight模型底层是由三角面片构成,故可对模型的基本三角面片信息进行编辑,实现如设置模型纹理等功能,方便进一步进行图像仿真等处理。
在渲染时,暂时先不将多边形链表与纹理链表对应,而直接将其绘出。并在绘制时设置相邻多边形颜色不同,便于区分。
图5 面片选择
为实现面片选取功能,程序采用线面相交法,即判断鼠标垂直于幕布的直线是否与模型面片相交:首先,在选择模式下,点击鼠标时获取鼠标点的坐标和其垂直于幕布的法向量;然后将其与所有多边形的法向量进行比较,求出与之相垂直的多边形;再判断鼠标法向量与多边形是否有交点,有交点即为选择成功,改变显示颜色为红色,否则选择失败不做改变。
判断交点时可先求出直线与多边形所在平面的交点,然后通过判断该点是否在多边形内来判断直线与多边形是否存在交点。
5.2 三维模型的取点采样
建立模型很多情况下需要对模型进行取点采样,如计算点反射率等,取点方法可仿照上文中面片选取的原理。首先根据需求确定采样的分辨率,以分辨率为基准设置方向一致的射线群。然后求出每条射线与多边形的交点即可作为采样点。
根据不同的采样要求,可通过设置射线群方向、同一直线不同交点的高度差等信息来调节,通比如过选择离雷达最近的交点来实现遮挡效应等,最后将需要的交点保存到文件中,便于后续计算。
6 结语
本文提出的三维模型渲染方法拓展了OpenFlight模型的应用范围,并可在此基础上对模型作进一步更复杂的处理,提高了其应用价值。最后实验渲染效果也较好,在工程实践上尤其是飞行仿真软件设计、雷达成像仿真软件等方面有一定的使用价值。
[1] 肖羽,李光耀,王文举.基于3DS的OpenFlight模型构建方法[J].计算机应用,2009,29:302-304.
[2] 罗丹,蒋自成,王跃峰.OpenFlight模型的OpenGL接口研究[C]//2005全国仿真技术会议论文集,2005:402-404,446.
[3] Donald Hearn, M. Pauline Baker.计算机图形学[M].第三版.北京:电子工业出版社,2010:330-380.
[4] Richard S. Wright, Nicholas Haemel. OpenGL超级宝典[M].第五版.北京:人民邮电出版社,2012:25-57,84-109.
[5] 方伟,何友,欧阳文,等.基于OpenFlight的数字地形处理软件包设计及应用[J].计算机仿真,2006,11:291-295.
[6] 常远,秦小麟,夏斌.基于CNSDTF和OpenFlight的空间数据互操作研究[J].中国图像图形学报,2005,10:1554-1559.
[7] 王静,席泽敏,周超.OpenGL在计算目标电磁散射特性中的应用[J].船电技术,2012,32:30-32.
[8] 刘立嘉,刘裕嘉.OpenFlight模型编辑器的设计与实现[J].石家庄铁道学院学报,2009,22:54-56.
[9] 唐凯,康凤举,宋志明,等.用OpenFlight API开发分地形[J].舰船电子工程,2004,75:74-77.
[10] 王阳生.基于OpenFlight的三维地形自动纹理映射方法[J].城市勘测,2011,3:52-54.
Researchof Data Change Based on OpenFlight Model
DONG Hongpeng JIANG Benqing FANG Wei
(Institution of Information Fusion, Naval Aeronautical and Astronautical University, Yantai 264001)
The rendering of 3D object model is an important aspect in the field of simulation. Taking the OpenFlight model as an example, a 3D model rendering method based on OpenGL is designed. The characteristics of OpenFlight model format are analyzed, and according to its characteristics the rendering, sampling and patch selecting of 3D object, are realized perfectly based on OpenGL with OpenFlight API. Simulation results show the effectiveness of the proposed project.
three-dimensional model, OpenGL, OpenFlight
2015年4月7日,
2015年5月24日
董鸿鹏,男,硕士研究生,研究方向:战场环境仿真。姜本清,男,教授,硕士生导师,研究方向:军用电子技术仿真。方伟,男,副教授,研究方向:作战系统仿真。
TP391.9
10.3969/j.issn.1672-9730.2015.10.030