基于OpenGL的3ds数据可视化
2014-04-18闫浩文张志华
肖 坤,闫浩文,张志华
(1.兰州交通大学 测绘与地理信息学院,甘肃 兰州,730070)
基于OpenGL的3ds数据可视化
肖 坤1,闫浩文1,张志华1
(1.兰州交通大学 测绘与地理信息学院,甘肃 兰州,730070)
探讨了基于OpenGL的3ds文件读取、绘制和控制方法,从三维模型在地形中移动的坡度和坡向问题入手,逼真地模拟了3ds文件模型在GRID地形中移动的交互控制过程。开发的三维模拟可视化实验系统,在3ds文件模型和GRID地形的贴合程度方面效果良好。
OpenGL;3ds;三维可视化;交互控制
OpenGL是一个开源的三维图形软件包,作为一个性能优越的图形应用程序设计界面,被广泛地应用于各种计算机环境中,成为三维图形开发的标准[1]。目前,GRID地形和三维模型的可视化已经被广泛地应用于地形模拟和景观仿真等方面,但模型运动的自主性不强,贴合度不好[2,3]。本文将建立的3ds文件利用Visual C++快速导入到实验系统,通过研究该模型文件的读取、绘制与控制方法,结合规则格网GRID模型的特点,实现了3ds文件模型在凸凹不平GRID地形的交互控制移动过程,以及三维模型与GRID地形的动态实时贴合。本文方法在模型的移动和位置关系的结合上,取得良好效果,可为三维动态模拟、三维模型之间的贴合以及场景快速构建等提供技术参考。
1 3ds文件结构
3ds文件是最常见的一种三维模型保存格式,具有获取方式多样、保存方便等特点。本文使用的3ds文件通过3ds max建模获得,建模过程在此不再详细说明。
3ds文件由许多“块”组成,是一个块的嵌套结构。每一个“块”由两部分组成:ID和下一个数据块的位置[4]。基本块包含两个主块,分别是3D编辑器块和关键帧块,前者ID是0x3D3D,后者ID是0xB000。在3D编辑器块中,有图形的顶点列表、三角形列表、面列表、材质、颜色等信息。接下来描述该块的数据信息及其子块,子块的描述与上一级块相同。但不是所有的块都含有子块,可以用块的长度与偏移量(如表中的 6+n)比较来判断是否包含子块[5]。本文主要用到的是3D编辑器块。“块”的定义如表1。
表1 3ds文件结构
2 3ds文件的读取和控制
2.1 数据结构
3ds文件都是按照块模式存储,因此可将块结构定义如下:
struct t_Chunk
{
unsigned short int ID; //块的ID
unsigned int length; //块的ID
unsigned int bytes_Read; //块读入的字节数
};
在数据的读取过程中抽象出二、三维点、面和材质信息结构模型,然后得出三维对象模型定义如下:
struct t_3DObject
{
int num_Verts; //点的个数
int num_Faces; //面的个数
int numTexVertex; //材质坐标的个数
int materialID; //材质的ID
char strName[255]; //对象的名称
CVector3 *pVerts; //对象的顶点
CVector3 *pNormals; //对象的法线
CVector2 *pTexVerts; //纹理的UV坐标
t_Face *pFaces; //对象的面信息
};
然后再由对象模型抽象和绘制出整个场景,获得整个场景的画面。下面为三维模型的定义:
struct t_3DModel
{
int num_Objects; //对象的个数
int num_Materials; //材质的个数
vector<t_MaterialInfo> pMaterials;
//材料信息的列表(材质和颜色)
vector<t_3DObject> pObject;
//模型的对象列表
}
2.2 读取流程
3ds文件由chunk构成,每一个chunk包括一个头和一个主体,chunk的头又由两部分组成:块的ID,chunk的长度[6]。chunk是相互嵌套的,这就要求必须以递归的方式进行读取,主要涉及RGB颜色、灯光、顶点、面、UV坐标、材质、纹理坐标等,详细读取过程见图1。
图1 读取流程
2.3 定 位
在GRID地形上模拟三维实体模型的行进过程,需要解决的关键问题是如何将其在凸凹不平的GRID地形上停放。本文将越野车作为三维实体进行研究,首先把越野车抽象成一个长方体,然后判断长方体的下表面是否和地表该点的贴面重合,若重合则表明可以实现停放,亦即只要长方体下表面的法线方向和地面点的法线方向一致,就可实现停放。具体旋转只需要知道该点地形的坡度和坡向的两个角度值,就可以通过OpenGL中的旋转矩阵实现。其中,越野车在GRID地形上行进时坡度和坡向的计算可分为以下3种情况(图2)。
图2 格网示意图
1)当越野车(点5)到达一个正方形表面时(图2a),可由正方形表面的法线方向得到坡度S和坡向A的信息。
2)当越野车(点5)到达两个正方形边界时(除顶点外)(图2b),可以将两个正方形表面的单位法线的平均值作为边界上点的法线方向。可由点5的法线得到坡度S、坡向A。
3)当越野车到达四个正方形的共享顶点5时(图2c),由于点5的坡度S、坡向A可以看作地形曲面函数Z = f ( x , y )在东西、南北方向上高程变化率的函数[7,8],即式中,fx和fy分别为东西、南北方向上的高程变化率。本文中fx和fy的计算由相邻的2个点获得其在2个方向上的变化率。例如图中点5的变化率由点2和点8、点4和点6获得其在东西、南北两个方向上的变化率[9,10]。
一般情况下,车的动力是有限的,以我国现行最大坡度建议值[11]为例,若车速100 km/h,坡度建议值imax为5,坡度大于这个建议值时停止移动。
2.4 其他操作控制
本文对3ds模型在GRID地形中转弯采用旋转的方式进行控制。在坐标系统中,顺时针为负,逆时针为正,在此设定一个角速度去控制它旋转的角度,当角速度为正时为左转弯,反之为右转弯。此外还实现了匀速、加速行驶等功能,加速采用设定加速度累加方式实现,设定最大速度进行限制。
整个场景的放大、缩小、改变视角旋转等操作都是通过相应的矩阵进行控制[3-4]。
3 实 验
本文的实验系统首先读入一个越野车模型的3ds文件,然后对其添加控制,使之可以随GRID地表起伏,对正常的行进过程进行模拟。在此把越野车模型抽象为一个长方形,在模拟地形上移动过程时对其左右方向进行旋转控制(左转弯和右转弯),对车头和车尾随地表起伏上下偏移进行旋转控制,然后在移动过程中确定越野车模型在每个点的位置和旋转状态,并进行显示。整体效果如图3所示。
图3 系统整体效果图
4 结 语
本文基于OpenGL技术在VC中实现3ds文件的浏览和交互控制,并实现越野车模型在简单GRID地形中的正常移动,着重讲解了3ds文件的读取过程和模型在其中的控制方法,及其坡度坡向对模型在移动过程中的影响。该技术可以有效地模拟三维模型的构建,
及其动态显示和移动过程,方法简单直观,与地形表面的贴合程度效果好,效率较高,极大地缩短了三维开发的周期,对三维建模及动态交互控制方面的研究具有借鉴意义。
[1] Shreiner D.OpenGL Programming Guide:the Official Guide to Learning OpenGL,Versions 3.0 and 3.1[M]. Boston:Pearson Education,2009
[2] 闫志刚. GIS 专业地学可视化课程的建设与教学实践[J]. 地理空间信息, 2011, 9(4): 159-161
[3] 刘芳,刘贤梅.3DS文件读取、绘制与控制方法的研究与应用[J].计算机工程与设计,2009,30(19): 4 575-4 578
[4] 殷素峰,高雪强,杨胜强.在OpenGL环境下开发3DS文件浏览器[J].工程图学学报,2005,26(6): 22-24
[5] 蔡强,李海生,陈谊.3DS文件浏览器的设计与实现[J].系统仿真学报,2008, 20(增刊): 147-149
[6] 刘虎, 陈汉文. 基于 3DS MAX 的校园三维模型室内外一体化制作[J]. 地理空间信息, 2013 (2): 53-54
[7] 郭仁忠.空间分析[M].北京:高等教育出版社,2001
[8] Spatial Analysis and GIS[M]. Cleveland, Ohio: CRC Press,2004
[9] 汤国安,李军锋.规则格网DEM坡度坡向算法的比较分析[J].干旱区地理,2004,1(9): 398-403
[10] 洪莹, 王继周, 李昂. 地形特征提取的一种简易算法[J]. 测绘科学, 2009, 34(6): 125-127
[11] 裴玉龙,邢恩辉.高等级公路纵坡的坡度、坡长限制分析[J].哈尔滨工业大学学报,2005,37(5): 629-632
P208
B
1672-4623(2014)05-0082-03
10.3969/j.issn.1672-4623.2014.05.029
肖坤,硕士,主要从事三维GIS的开发工作。
2014-03-24。
项目来源:国家科技支撑计划资助项目(2013BAB05B01)。