1. 引言
随着虚拟现实技术的不断发展 [1] ,多个用户终端通过网络连接,共享同一个虚拟现实环境,通过不同用户之间的数据交互,协同完成某项工作已经成为人们的迫切需求。尤其是在传统的纸质培训考核领域,培训考核方式单一枯燥。因此,为用户建立一个沉浸感逼真、交互流畅稳定、思想性高的分布式虚拟现实系统是具有重要的意义和价值。
分布式虚拟现实(Distributed Virtual Reality,简称DVR)技术是计算机网络技术,通信技术,仿真技术和虚拟现实技术等多学科交叉结合的产物。在DVR系统中,多个地理位置不同的用户终端同处于一个虚拟环境中,彼此之间通过网络进行实时交互协作,具有良好的可扩展性。在DVR中,每个用户都以“替身”的形式出现。替身的行为由用户本身的行为决定,并且通过消息传送机制将用户的行为和虚拟环境状态的变化更新到其他节点中。目前,DVR技术主要被用于两方面:一是军事仿真领域,国内外已经有很多成熟的系统,例如美国的DIS系统 [2] ,俄罗斯的T72坦克训练模拟器,北京航空航天大学的飞行员模拟训练系统等;二是近年来DVR技术被广泛应用于网络游戏,推动了这项技术的发展和普及,与一般应用在民用领域不同的是,网络游戏着重强调了用户的沉浸感和场景的复杂度,一般都采用了C/S结构,对用户的硬件条件要求较高 [3] 。
本文我们所要介绍的是一个基于Virtools的多用户分布式虚拟现实,它主要采用的是B/S结构,使用Java语言开发,具有免安装、可用性高,可移植性强,对客户端要求较低,适用于很多民用应用程序的开发。
2. 虚拟检修培训考核系统的设计方案
2.1. 系统总体设计
传统的零部件检修工艺培训考核多是采用纸质的人工的方式,培训方式单一枯燥,培训考核结果数据记录不完善,没有一套统一化科学化的管理,因此其工艺培训一直进展不是很理想,其培训效果无从衡量。因此我们设计建立基于分布式虚拟现实的多人同时在线,协同完成一项模拟检修工作的系统。
我们建立一个B/S管理平台,将用户角色分为普通用户和管理员两个部分。系统结构如图1所示。管理平台是一个集用户管理、任务管理、考核管理和零部件管理于一体的综合性平台,用户可以准确从管理平台中获取训练目标,减小了整个系统的开销。
2.2. 分布式结构方案
2.2.1. 分布式结构设计
分布式虚拟现实结构分为两种:集中式结构和复制式结构。
集中式结构的优点是结构简单,同步操作只在中心服务完成,容易实现。缺点是对网络带宽要求较高,对中心服务器过分依赖。
复制式结构的优点是对网络带宽的需求小,交互式响应效果好,操作简便。缺点是仍是单线程,因其本身的结构决定了多个客户端之间的数据同步的复杂性 [4] 。
综合以上两个结构的优缺点,并结合分布式虚拟系统的需求,本系统将采用集中式结构与复制式结构相结合的复合型结构。即设定一个中心服务器,同时在每一个客户端都有一份本地信息,但是该复合型结构不是对中心服务器的完全复制,而是对本地客户端所需的信息进行局部复制 [5] (如图2所示)。
Virtools Server提供了两种多人联机服务器:独立网络服务器和P2P服务器模式。考虑到以后本系统在文件资料传输、数据库的利用及以后系统的可扩展性,本文采用独立服务器模式。即系统中设有一台中心服务器,它负责虚拟检修系统各项数据的操作及分析,负责系统的实时仿真功能,并且负责维护各协同客户端虚拟环境的一致性;客户端只负责系统场景展示及交互操作等任务。
2.2.2. 分布式信息交互设计
在分布式系统中,需要进行处理的信息主要包括网络消息和分布式对象状态。网络消息是客户端之间的基本交互方式,它只能传输较为简单的消息信息。而分布式对象在一段时间内只允许被一个客户端操作,直至该客户端完成操作并释放该对象。因此所有的分布式对象应该进行统一管理,并且可以交互

Figure 2. Distributed system architecture
图2. 分布式系统结构图
更新 [6] 。在本系统中,客户端之间的交互将通过网络信息方式,例如,用户的操作行为;而分布式对象的则用于系统中被操作对象,例如部件的状态、零件的位置、工具的使用状态等信息。
2.3. 数据库设计
分布式虚拟现实系统中的数据具有以下几个特点:一是分布式数据库庞大且分布广泛数据分布在系统的各个节点;二是数据存储对象不一,管理复杂;三是数据对象种类各异,数据格式复杂。
数据库设计包括两个部分:数据库结构设计和数据库表的设计。
对于分布式虚拟现实系统来说,数据库结构设计分为两大类,一类是统一的局部数据库,指的是每一个用户端都要使用的相同的数据库;另一种则是各个客户端之间不同的局部数据库。
本系统综合考虑这两种数据库结构,整个虚拟系统拥有一个中心数据库用于存放这个系统的总数据,并将其存放于中心服务器中。同时各个客户端也拥有自己的局部数据库,用于存放局部数据,当客户端需要进行数据传输时,则通过中心数据库实现。
3. 虚拟检修培训考核系统实现
在本文的第二部分中,我们已经提出来本系统的具体需求,对虚拟检修培训考核系统进行了设计,确定了系统的分布式结构和数据库设计方案。因此我们将按照设计方案,实现对分布式结构、数据库模块以及各个功能模块。
3.1. 分布式结构实现
在本系统中,中心服务器上同时担任了Web Server,Virtools Server和数据库服务器。当一个考核任务被用户选择时,本考核任务将创建新的Session,并且主持会话,其他当不同的客户端与服务器连接并加入同一个Session后,它们之间就可以进行通信和交互,实现了虚拟现实系统中的多用户连接,流程如图3所示。其创建过程如下:
用Connected To Server连接建立服务器,连接成功后,返回一个唯一的ID,根据ID创建新的会话。其伪代码如下:
int connection_id=task.Connect_Server(Host,Modules, task_id,session_name);
int session_id=Creat_session(connection_id).getSession_id();

Figure 3. Schematic diagram of client connecting session
图3. 客户端连接Session示意图
其他客户端也是同样使用Connected To Server连接服务器,并且获取唯一的ID,然后使用Get Session Lise行为交互模块获取服务器中的Session列表,获得对应的会话ID后,客户端加入该会话。其伪代码如下:
int connection_id=task.Connect_Server(Host,Modules,task_id, session_name);
Boolean joinin=Join_Session(Connection_id,Get_Session_List(Session_Type));
通过以上两个步骤,完成客户端与服务器的连接。
当客户端离开Session时,系统也要进行相应的操作,客户端离开Session一般可以分为两种情况:一是Session关闭或者任务结束,二是客户端主动离开Session时,其他客户端同步更新这种变化,并且需要删除数据库中与其相关的本地信息和数据库信息,其过程如下:首先获取当前Session的状态,判断其是否关闭,若Session状态显示未关闭,则删除相关对象。若Session并未关闭,则需要实时感知是否有客户端离开,我们设置关键数据为Connection_id时,若关键值的发生变化时,我们获取客户端的信息,并将其对应的数据库中的数据删除,同时删除其对分布式对象的操作。
3.1.1. 通信技术
网络消息是一种最基本的通信方法,它主要包括六种行为交互模块,客户端之间的通信主要由Network Send Message和Network Wait Message两个模块来进行消息传递,这种方法只适用于传递较为简单的信息,例如文字信息和对象的简单位移信息等。
分布式对象则是一种针对复杂的信息包括对象的复杂动作、运动的同步的消息传送机制。一个Distributed Object对应一个本机控制的角色,也就是说Distributed Object的状态就是一个本机对象的状态,这些状态可以通过网络发送给其他客户端,这些状态信息我们事先在Manage Distributed Classes中定义好,包括它的位置、方向、动画等等。这样通过Distributed Object我们就可以将与它对应的对象的行为消息发送至其他客户端。
3.1.2. 协同操作
所谓的协同操作是指多个用户可以对同一个对象进行协同操作,就如同现实世界中大家分工完成一项工作 [7] 。Virtools提供的Distributed Objects模块负责协同操作,并且每一个用户都可以实时的看到该对象在协同操作过程中的变化。多个用户通过Distributed Objects处于同一个虚拟环境中,彼此之间不仅可以感知其他人的存在,而且也可以感知其他用户的行为、操作等。
1) 用户角色同步。当一个用户加入到虚拟环境中时,我们用Create Distributed Object模块来新建一个代表该用户的角色对象,创建完成后,该角色像会发送一个信息给环境中的其他用户,告知其有一个新的角色被建立。其他用户则可以通过Distributed Object Created接受这个消息,并通过Bind Distributed Object与新建立的用户角色进行捆绑。这样一个新的分布式用户角色就被建立了,其状态信息例如动作、位置等都会实时的反映给虚拟环境中的其他用户,实现用户角色之间的信息同步。
2) 操作对象同步。在本系统中,需要保持用户操作对象的信息的一致,也就是说,当一个用户对虚拟环境中的一个零件进行操作后,对象的状态信息的改变必须被其他用户实时感知。实现方式为通过Manager Distributed Classes模块为被操作对象创建类,再类中添加对象的属性,参数和数据处理方法。我们用Create Distributed Object建立分布式对象,当有用户进入虚拟环境时,直接用Bind Distributed Object与被操作对象进行绑定,这样当用户进行操作时,被操作对象的状态信息可以实时的反应给其他用户。这样,当不同的用户对场景中的对象进行操作时,就如同多个用户对同一对象进行操作,因此他们之间可以相互配合、协同操作、共同完成任务。
3.1.3. 实现效果
用户登录系统后,选择训练任务,等待其他用户,共同进入一个部件的检修环境。启动一个Virtools Server之后,出现对应的待检修零件,并且出现两个在线操作的用户,如图4所示。
当02号客户机的用户进行操作,将一号螺丝拆除时,01号客户端上也实时更新本次操作,当01号客户机进行操作时,02号客户机上也显示该操作,如图4从这两个方面可以看出,该分布式结构的搭建时成功的。
3.2. 数据库结构的实现
在虚拟检修培训系统中,我们所使用的数据库为postgreSQL,并且Virtools数据库也是支持该数据库的。在Virtools中提供了Database Module模块,其中Array是作为系统程序和数据库之间的中间者,因此系统数据库必须保持和Array中的数据类型完全一致才可以进行数据传输,Virtools的数据库模块功能主要包括将数据库数据保存到对应的Array中,将Array中的数据写入数据库,删除数据库中的数据,操作数据进行查询并将结果保存到Array中,在通过Array中的数据与局部数据库进行交互,最后局部数据库和中心数据库之间进行数据的更新,将结果写入中心数据库。
根据本系统的具体需求,我们数据库表设计如图5所示。
在本系统中,整个数据库的操作可以分为:获取数据库数据,更新操作。
获取数据库数据:Virtools中的Get From Database BB可以直接从数据库中获取信息。当用户选择了对应的操作任务,例如轮轴检修,则参与本次检修的客户端就可以从数据库中获取相关信息,进行场景的加载。
更新操作:Virtools中的Insert/Update Database BB可以实现系统的插入更新操作,例如当我们需要使用固定板手工具时,则选中该工具,此时界面中出现该工具。
4. 总结
本文对分布式虚拟现实技术中的分布式技术中的分布式技术、分布式结构和数据库技术进行了研究,并根据研究内容设计了一个虚拟检修培训考核系统,阐述了如何利用Virtools模块来实现多用户连接,

Figure 4. Collaborative training schematic
图4. 协同训练示意图
网络消息的传递和数据库的建立。整个系统运行在普通计算机服务器和PC机组成的局域网上,运行流畅,操作简单。