时间:2024-07-28
贾露,靳海亮,苗保亮,郑艳慧,李月华,贾英
(1.河南理工大学矿山空间信息技术国家测绘局重点实验室,河南焦作454000;2.中国人民解放军96501部队,陕西汉中723000;3.河南理工大学测绘与国土信息工程学院,河南焦作454000)
虚拟现实技术又称虚拟仿真技术,它以三维图形为主,综合多学科技术,生成逼真的虚拟环境,使用户产生身临其境的感觉[1]。作为21世纪的尖端科技,虚拟现实技术已广泛应用于军事演练、城市规划、大型工程漫游、模拟训练以及交互式娱乐仿真等多个领域。虚拟现实技术从产生至今虽然在很多领域发挥了重要的作用,但在矿业领域的应用存在着滞后性。近几年,随着数字矿山研究进程的加快,人们逐渐意识到虚拟现实技术应用于煤炭行业的重要性,并开始了在理论和实践方面的研究。
人机交互是指人与计算机之间相互施加影响、交换信息的方式,是联系人与机器之间的桥梁和纽带,狭义上的人机交互主要是指人与计算机之间的信息交换[2]。在虚拟现实系统的开发中人机交互功能是一项重要内容,它主要包括两个方面:一方面用户可以通过相应的控制设备在场景中进行自由漫游,能够方便的在不同位置从各个角度观察三维场景;另一方面可以选择场景中感兴趣的对象进行空间和属性信息的查询,并能进行相应的计算获取更多的无法通过视觉获取的信息,增强对地理环境的认知。本文以VC++/MFC为开发平台,通过调用Vega提供的库函数对用户的场景漫游方式进行了设计和改进。
Multigen Creator(简称Creator)是Multigen-Paradigm公司开发的一款功能强大、交互式三维建模软件。Creator是目前唯一一款实时三维建模软件,其建模工具包括25种不同的图像生成器,具有强大的模型构建和定制功能,能够方便地创建现实世界中的各类三维对象。在本文中主要用到绘制面、拉伸、放样、切割等工具构建井上下的虚拟场景,然后通过纹理粘贴技术使构建出来的虚拟矿山场景更加逼真(如图1所示)。在数据结构组织方面,Creator有其独特的层次化数据结构——OpenFlight数据结构,可以快捷方便地对场景内任何元素进行编辑、修改和控制,特别适合图像生成器对其进行实时渲染操作,非常适合大范围地理场景的仿真,且与后续仿真软件Vega紧密结合。
图1 虚拟矿山场景
Vega同样是由MultiGen-Paradigm公司开发的针对Creator建模软件的一款应用于实时视景仿真、声音仿真及其它可视化领域的世界领先的软件[3]。近年来,Vega软件已成为视景仿真业界的主流开发平台。
Vega由图形用户界面Lynx、Vega类库和完整的C++语言应用程序接口组成。Vega函数是用C++语言编写且在Windows平台上开发的,所以用VC++对Vega进行二次开发具有最大程度的软件控制和灵活性,是Vega视景仿真系统开发的首选环境[4]。
建立应用程序之前需要对Vega的运行环境进行相应配置,要在VC++中指定Vega运行必须的头文件和链接库。环境设置完成以后,就可以搭建基本的应用程序框架。
Vega应用程序必须经过三个步骤实现:初始化、定义和系统配置。
(1)系统初始化(vgInitSys):对系统进行初始化,包括通道、图形状态、共享内存区和共享信号区等的创建和初始化。Vega使用内存共享支持多线程处理,可以使不同处理器上单独运行的应用(App)、剔除(Cull)、绘制(Draw)三个过程之间实现数据共享。
(2)定义(vgDefineSys):创建各种Vega类实例,本文在LynX初始化配置时已经定义了几个基本实例,这个过程通过vgDefineSys()函数读取事先定义好的ADF文件,在功能开发中需要用到的实例使用Vega API创建。
(3)系统配置(vgConfigSys):系统配置主要完成进程分配的任务,系统根据应用程序所设的多重处理模式、运行平台的处理器个数等条件确定具体的进程分配方式,并做好进入Vega主循环的准备工作。
(4)Vega系统设置完成之后即可以开始Vega主循环,主循环的作用是对三维场景进行渲染驱动,主要分为两个步骤进行:
a.调用vgSyncFrame()函数进行当前帧的应用进程同步处理,保证应用进程与给定的帧频率同步;
b.调用vgFrame()函数完成当前帧的剔除和绘制进程等相关处理。
Vega中的基本视点方式有4种,分别是静止视点、束缚视点、路径导航视点、运动模式视点。其中运动模式视点是场景漫游较为常用的一种方式,用Vega内置的几种运动方式可以实现不同的漫游效果,如“walk”运动方式可以模拟一个人在场景中行走;“Fly”运动方式是在飞机上俯瞰整个场景的效果;“Driver”运动方式模拟了一辆汽车在场景中行驶。此外,还有其他9种运动方式用以实现特定运动效果的仿真。对本文来讲,要实现矿山虚拟场景的自由漫游,以上3种方式是经常用到的,因此本文提供这3种漫游方式供用户选择,可以随时进行切换。另外,根据Vega视点的运动原理开发出平移、缩放的效果,以适应用户操作二维图形的习惯,便于快速地对感兴趣的区域进行查看。用户可以通过鼠标、键盘联合操作的方式在虚拟矿山场景中进行漫游,并提供MFC操作界面方便用户自定义各种漫游方式所用到的参数,更好地进行漫游控制。
Vega中的视点被封装为一个类,它在三维空间的状态用一个矢量表示,其六自由度分量分别为x、y、z、h、p、r。其中x、y、z分别表示视点在三维空间中所处的空间位置,h、p、r分别表示视线沿x、y、z轴的旋转角度(如图2所示[5])。视点相当于人的眼睛,它的视觉范围是一个以视点为顶点的四棱锥体,称为视锥体(如图3所示)。三维模型落在视椎体内的部分被投影到计算机屏幕上,生成用户看到的场景。当视点与模型的相对位置发生改变时,场景漫游实际上是用户通过鼠标、键盘等设备控制视点移动或旋转的过程。对场景进行缩放、平移就是通过改变视点的状态来实现的,其原理是保持视线的方向而改变视点的坐标。当视点沿四棱锥的中垂线方向前后移动时,场景落在锥体内的部分会以视点为中心扩大或缩小,由于计算机窗口的尺寸是固定的,投影到屏幕上就会产生放大或缩小的效果;当视点在与中垂线垂直的面上运动时场景落在视锥体内的部分将发生改变从而产生场景平移的效果(如图4所示)。
图2 视点六自由度分量
图3 视点原理
图4 场景功能示意图
平移、缩放功能通过以下步骤实现:
(1)vgGetPos()函数获取当前视点的状态并提取六自由度分量的值为(x1,y1,z1,h1,p1,r1);
(2)设置视点进行一次运动的步长k,即平移缩放的速率,以滚动块和输入数值两种方式实现;
(3)设计视点运动公式计算视点更新后的位置(x2,y2,z2,h2,p2,r2)。
场景放大的视点运动公式如下:
反之可以得到场景缩小的视点运动公式。
场景向右平移的视点运动公式如下:
依此,可以分别得到向左、向上、向下的运动公式。
(4)vgPos()函数将视点转移到新位置。
用Creator建立的虚拟矿山场景,具有独特的OpenFlight数据结构组织,每个对象元素对应唯一的ID值,使用Access数据库存储巷道的属性信息,如巷道名称、巷道类型、长度、相邻巷道个数及拓扑关系等信息。三维场景对象与数据库连接的纽带是对象ID,交互查询包括两种方式:(1)在场景中点选对象查询属性,可以通过消息框或表格的形式返回给用户;(2)根据属性寻找符合条件的三维对象,将结果在场景中高亮显示[6]。交互式查询的基本流程如图5所示。
图5 交互式查询流程
在场景中鼠标点击选中对象,调用Vega库函数中的vgGetName()函数获取对象的ID值,根据ID值编写SQL语句用于在Access数据库中查找用户要求的属性信息,然后把相关的巷道信息以对话框的方式显示出来。反向查询时,用户通过对话框输入属性条件,编写SQL语句根据属性条件检索到对象ID值,将检索到的ID值的相应对象设置为拾取状态,调用Vega库函数中的vgPickerHighLightColor()函数将符合条件的对象高亮显示。
本文设计的空间信息查询功能包括3种:鼠标点选获取三维坐标、计算两点或多点间的距离、计算两点间的坡度。
实现这些功能的关键是获取空间中任意点的三维坐标。Vega中获取点的位置信息有两种实现方法:一是先获取鼠标的屏幕坐标,再利用vgGetChanScreenToWorld()等函数转换为世界坐标;二是使用vgPicker功能实时获取鼠标位置。
本文中采用第二种方法,场景三维坐标查询的实现,需要实时的获取场景中鼠标点击场景中的位置信息,在Vega的库函数中调用vgGetPickerIntersection()函数实现点坐标查询。三维场景中要查询两点间的距离,需要先点击获得两个点的坐标值,再进行计算可方便得到两点间的距离。对于多点间的距离量算问题,需要先求得每两个点之间的距离再进行累加,因此需要创建一个一维动态数组,把每一次点击得到的折线段的距离进行储存,最后整体累加就可以实现多点间的距离量算。坡度查询可以先获得两点的坐标,然后通过坡度公式进行计算,即slope=(asin((z2-z1)/sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))))*57.3。
路径分析问题是GIS的一项重要内容,在矿山中具有重要的实际意义。本文将道路、井下巷道的拓扑关系作为属性字段加入数据库中,以此为基础实现最短路径查询功能。道路和巷道的空间数据组织结构类似,都是分段作为一个数据节点(体节点或者面节点),生成数据库时,存储这些结点的ID作为一条记录,将本结点的长度信息与同它相邻的节点ID作为属性值存储。这样就生成了可以进行最短路径分析的拓扑关系数据库,巷道的拓扑关系数据库如图6所示。
图6 巷道的拓扑关系数据库
进行分析时需要建立的存储变量有:(1)路径表,存储每条可行路径的巷道序列;(2)路径长度表,存储当前路径表中每条路径的长度;(3)路径巷道个数表,存储每条路径巷道的个数。
以巷道为例对最短路径的实现步骤如下:
(1)从起始点出发,检索与之相邻的巷道,并将每条可行路径存入路径表中。
(2)从路径表中提取当前最短的路径。
(3)提取最短路径的最后一条巷道,通过拓扑关系数据库检索与其相邻的巷道。
(4)将步骤(3)中检索到的相邻巷道同路径表中存储的巷道对比,剔除已经存入路径表的巷道。
(5)将步骤(4)中的可用巷道作为下一步的可行性路径,并更新路径表。
(6)重复步骤(2)~(5),直到达到终点巷道。
由于在步骤(2)中每次优先处理的都是路径表中的最短路径,所以首先到达终点的那条路径即为整个系统中的最短路径。在系统中查询出最短路径后高亮显示且以对话框的形式显示出最短路径中各巷道名称(如图7所示)。
图7 最短路径功能运行实例
虚拟现实技术的发展前景十分广阔,该技术当前在矿山方面的应用研究还处于起步阶段,目前的产品主要集中在虚拟教学、培训和环境仿真等方面,由于分析计算功能的不足,矿山虚拟现实系统的应用还存在较大的局限性。本文在三维场景漫游的基础上设计实现了GIS相关的查询和分析功能,对虚拟现实系统的人机交互做了补充和完善,初步实现了一个具有GIS功能的应用型煤矿虚拟现实系统。将虚拟现实技术同GIS相结合,可以变革传统的以文字、图纸为主要资料的矿山工作模式,必将使矿山的生产、管理效率得到较大提高。
[1] 夏立文.基于虚拟现实技术的社区场景库设计及应用[D].北京:北京工业大学,2008.
[2] 宫文飞,丁满,蒋燕,等.基于虚拟现实技术的人机交互的研究[J].机电工程技术,2006,35(5):41-43.
[3] 宋洁华,钱自红,李建松.基于Creator和Vega的三维数字小区建模[J].地理空间信息,2005,3(6):26-27,30.
[4] 杨丽,李光耀.城市仿真应用工具—Vega软件教程[M].上海:同济大学出版社,2002.
[5] MultiGen-Paradigm.LynX User's Guide[R].MultiGen-Paradigm.San Jose,CA,2001.
[6] 童小念,罗铁祥,蓝庆青.在视景仿真系统中定制人机交互功能[J].深圳大学学报:理工版,2008,25(1):88-91.
[7] 龚卓蓉.LynX图形界面[M].北京:国防工业出版社,2002.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!