我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>VR>行业资讯>行业知识

基于DI Guy和VR Link的分布交互仿真的实现

文章来源:第三维度 作者: 发布时间:2012年05月01日 点击数: 字号:

    来源:第三维度
    作者:陈喜春
    单位:石家庄机械化步兵学院军事模拟训练中心

    摘要 在以人的操作为核心的分布交互式的虚拟现实仿真应用中,具有生命特征的虚拟人的使用非常重要。相对于机械装置、建筑物等无生命的对象,虚拟人更加复杂,仿真难度更大。在分队作战实验室建设项目中,使用DIGuy和VRLink作为主要开发工具,通过编程实现了人物角色的选择、人物动作的控制以及网络上动作的一致。作战实验的结果表明,这种实现途径方法简单、效果逼真,效果良好。

    0 引 言

    在采用虚拟现实技术的分布交互式仿真应用中,如果能够在虚拟场景中加入具有生命特征的虚拟人,往往可以大大增强场景的真实感。而某些特定的应用中,虚拟人物的应用甚至是必须的。随着计算机图形学,尤其是骨骼动画技术的进步,对人物动作的实时仿真也日臻成熟。目前,虚拟人在公共安全、应急情况处置、预案推演、教育训练领域已经得到了广泛的应用。

    在军队“2110”项目机械化步兵分队作战实验室建设中,要求在虚拟现实条件下构建一个基于高层体系结构(hla)的作战试验、训练平台。在这样一个用于分队作战试验训练的平台上,通过导演配置红蓝双方兵力,每个登录席位扮演一个角色,可以是战斗车辆,也可以是战斗人员,然后由受训者在虚拟视景中进行驾驶、通信、射击等操作,进而完成在虚拟视景下的战术对抗训练。

    对于分队作战实验,仿真粒度必须细化到单兵、单车,所以,需要在虚拟场景中创建虚拟人物,而且要对虚拟人物的种类进行选择,对人物的动作进行编辑、控制,对网络上各个节点显示的同一人物的动作进行同步。在虚拟战场上,对具有生命特征的人进行仿真的困难在于,它比车辆具有更高的自由度,更多的活动关节,更复杂的行为。虚拟人的研究在分布交互式仿真中具有重要意义。本文将描述一个以战术训练为目标,对人物动作进行仿真的平台的实现。

    1 开发工具的选取

    1.1 需求分析

    机械化步兵分队作战实验室建设的目标是搭建一个基于hla架构、采用虚拟现实技术,虚拟仿真、构造仿真和仿真相结合的对抗平台。

    这个对抗训练平台的主要要求有:

    ① 可以对人物种类进行选择,对人物动作进行控制

    在分布交互仿真中,每个终端的登录者作为一个虚拟人的控制者。在程序初始化时,可以对所扮演的人物类型进行选择;在程序运行中通过键盘或其它外设,可以实现对人物动作的操控;

    ② 可以对人物动作进行编辑

    人物的动作其实可以分解为一系列基础动作,如“走”就可以看作摆臂和摆腿动作的循环。战术动作比人物的一般动作有更高的要求,根据战术要求,要能通过编辑功能实现所需要的特殊动作;

    ③ 人物可以与虚拟视景之间可以进行交互

    比如爬坡、碰撞、射击等;另外,人物之间或人物和其它仿真实体如武器装备等也要可以进行交互,进行信息的交换;

    ④ 网络上各节点所表示的同一人物的动作应该同步

    每个虚拟人的动作、方位要通过某种手段发布到网络上,在其它参与者的视景中,这些动作应该做到同步。最终目标是,在进行以上研究的基础上,设计一个带有战术背景的,在一个有30个左右节点的局域网中实现对抗功能。经过对仿真领域相关软件的考察,本项目决定采用DIGuy对虚拟人物进行处理,使用VRLink来实现hla相关的消息发布、订购,使用Vage来对视景进行渲染。

    1.2 DI Guy

    DIGuy是美国BostonDyamics公司的产品,它是一个专门用于在实时仿真环境中添加具有生命特征的人物的工具。DIGuy可以用于很多场合,比如城市作战、执法行动、应急训练、安保训练等等。DIGuy可以运行在多种操作系统上,并且可以使用OpenGl,Performer,DIrect3D,Vage,VagePrime以及mantiS等种图形引擎。

    利用DI Guy实现虚拟人的方法很简单,以使用Vage引擎为例,首先调用DIGuy_create_Scenario函数创建DI Guy的Scenario对象,将其加入Vage场景,然后使用Scenario对象的create_character函数就可以创建人物。通过改变函数的参数可以选择人物对象的类别和外形,通过DIGuy提供的aPi就可以对人物对象进行控制。

    DIGuy利用面相对象的方法,对各种人物类型进行了封装。每一类人都有自己的骨骼结构、纹理映射、行为库以及实时的动作引擎,DIGuy将人物、人物行为以及人物所在的三维场景无缝地连接在一起,使用DIGuy,可以不考虑关节控制、动作合成、几何层次管理、纹理贴图创建、动画等繁琐的基本工作,从而给编程提供了极大的便利。

    1.3 VR Link

    VRLink是美国mak公司为开发基于DIS协议或者hla架构的应用程序提供的软件开发包,在这个开发包中,提供了大量的面向对象的c++类、函数以及定义,对通常依靠编写依靠rti实现的hla程序所需要的程序代码进行了大量的封装,从而大大降低了编程的复杂度。

    VRLink进行封装的主要功能包括:仿真的加入、退出,对象位置捕捉,对象的发布,各种交互类等等,VRLink还提供了一些高级功能,例如fom的映射,对底层通信的控制,多种工具函数等等。VRLink封装的这些功能,大大减少了开发hla应用程序时所做的重复劳动。

    1.4 Vage

    Vage是multigenParaDIgm公司的产品,它一个高性能的实时图像渲染引擎,也是一个虚拟现实应用的开发环境。在结构上,Vage的函数库基于场景图管理系统进行组织,在winDowS平台上,它的函数库在底层使用OpenGl进行渲染。Vage的一个很大的优点就是支持多线程、支持多cPu。

    Vage的函数库通过类进行组织,这些类基本上涵盖了一个虚拟现实应用程序所需要的各个方面。Vage函数库中核心的类包括:vgDataSet、vgmotion、vgchannel、vgoBServer、vgPlayer、vgiSector等等,它们分别处理数据集、运动模型、通道、观察者、游戏者以及相交矢量等。

    2 程序设计

    结合上文对仿真需求的分析,本节将对程序编制的细节进行分析。开发工具是上文介绍的三个软件,以及viSualc++6.0。

    2.1 仿真程序总的流程

    仿真程序总的流程如图1所示。

仿真程序总的流程图
图1 仿真程序总的流程图

     这个仿真程序是一个基于hla的分布交互式仿真应用,参与仿真的所有节点构成一个联邦,每个终端节点扮演不同的角色。程序开始运行后,首先需要确定自己的角色。在训练使用的局域网中,每台计算机具有唯一的iP地址以及主机名。在每次演习前,导演机可以向每个终端上发送一份主机名地址和角色对应的初始化文件拷贝。系统登录时,通过系统函数getPrivateProfileString读取初始化文件中与主机名对应的角色编码,这样系统初始化时完成对相应角色的初始化。每个角色的初始位置也可以采取这种方法进行处理,登录后,将仿真对象转移到初始化文件中规定的位置。

    另外,在每个联邦成员计算机上,都需要维护一个已经加入联邦的成员的列表。仿真运行时,采取某种机制对这个列表的成员进行不断的更新。这个列表通过mfc关联数组类ctyPeDPtrmaP实现,数组元素的关键码是每台联邦成员计算机的主机名,元素值是DIGuy的DIGuycharacter指针,通过这种办法建立主机名和虚拟人之间的联系。

    初始化完成后,同时打开Vage和VRLink的线程,Vage线程负责前台的图形显示,VRLink负责hla后台的网络数据传输。

    2.2 VR Link线程分析

    VR Link线程的流程如图2所示。

VR Link线程的流程
图2 VR Link线程的流程

    线程运行后,通过DtexcerciSeconn类建立hla的网络连接。在初始化过程中,需要创建一个远程实体对象列表DtreflecteDentityliSt,并创建本地的DtentityPuBliSher对象,为编程方便,本地对象以主机名命名。这个本地的VRLink对象和本地的Vage对象相对应,他们描述的都是本机的联邦成员,不同的是,一个负责前台的显示,一个负责网络上数据的发布。

    VRLink进入消息循环后,将调用DtexcerciSeconn的DraininPut方法,监听各类hla的网络事件,例如新的联邦成员加入、联邦成员退出、各种交互事件;调用DtentityPuBliSher的tick方法,进行本地仿真实体属性的发布。

    例如,当有新的联邦成员加入联邦时,就要响应“添加实体事件”,通过ctyPeDPtrmaP类的Setat方法增加新的成员;当有成员退出联邦时,使用remove方法移除退出联邦的成员。新的联邦成员加入的时候,根据反射实体(DtreflecteDentity)的名称,在初始化文件中查询对应的角色,按照对应的角色创建相应的DIGuycharacter,并加入Vage的场景。

    2.3 Vage线程分析

    Vage线程的流程如图3所示。

Vage线程的流程图
图3 Vage线程的流程图

    线程开始后,按照初始化文件中对本机角色的定义初始化。Vage线程进入消息循环后,将按帧更新画面的显示,并接受用户输入,DIGuy的人物也按照用户的输入完成各种动作。

    如果本地或者远程DIGuy人物的动作没有改变,在Vage的帧循环中,DIGuy的uPDate函数可以自动完成任务动作的帧循环;如果通过用户的控制,人物动作发生了改变,必须修改本地实体状态,在网络上进行发布,通知其它联邦成员,作出相应的更新,这样才能做到同一人物动作的同步。

    需要强调指出的是DIGuy人物在Vage场景中的地面贴附问题。Vage对象的地面贴附问题,通过Vage的运动模型就可以实现,DIGuy在Vage中的地面贴附必须重新设计。本项目采用的方法是对DIGuycharacter的位置实时进行z相交矢量检测,根据获得的高程值,对DIGuycharacter的高程进行实时更新。

    2.4 其它问题

    这是一个多线程应用程序,因此必须考虑线程间的同步问题。在上文所述的应用程序中,Vage线程以及VRLink线程都会对本地Vage对象,远程列表对象等进行操作,为避免出现竞争,应该采用恰当的同步机制。本课题中采取的方法是关键区域,可参见文献[9]。

    另外,上文只讨论了对抗训练中参演者终端程序的编制,实际应用中,还需要考虑导演机程序的编制。导演机应该具有观察战场的全局态势,干预战斗进程,对战场环境进行调节的功能。导演机程序的编制可以仿照参演机程序编制的思路进行,在此不再赘述。

    3 实验结果与讨论

    根据以上讨论的方法,加上适当的战场环境处理,建立了一个分队对抗训练系统。在这个对抗系统中,演习导演可以编制初始化文件,对参演的角色进行分配,对初始位置进行确定。演习过程中,参演者可以通过键盘、鼠标等输入设备改变姿态、运动方式,进行武器、装备的操作,根据战场态势进行随机的处置,从而完成战术训练,取得了良好的实验效果,基本上满足了训练的需要。

    图4为试验系统运行的画面。左方计算机登录的节点是平民,右方计算机是一名持枪士兵。为便于观察自身的动作,观察视点选在每个角色的后上方。角色身上的绿色竖线是碰撞检测时的相交矢量,在实际系统中可以隐藏。由画面可以看出,两个节点人物的动作是协调一致的。

基于DI Guy和VR Link的分布交互仿真的实现
图4 试验系统运行效果图

    4 结 论

    在军事训练领域,当仿真粒度达到单兵一级时,对人物动作的仿真是必须的。在分布式仿真中,由于人物动作特有的复杂性,实现起来有一定的难度。本文分别选用DIGuy以及VRLink作为工具进行人物动作的实时渲染和网络通信,通过两个线程之间的数据交换,给出了这类仿真的一个实现方案。试验结果表明,此方案基本满足了分布交互仿真中对人物动作的要求。

    参考文献

    [1] 周彦,戴剑伟.hla仿真程序设计[m].北京:电子工业出版社,2006.

    [2]吴政,陈喜春,佟绍禹.基于虚拟视景的分队级战术模拟训练软件设计[m]//陆军作战实验理论与实践.北京:海潮出版社,2009:269 270.

    [3]太欣旺.基于VageDIGuy的人物仿真模块的设计与实现[D].长春:吉林大学,2008.

    [4]方琦峰,康凤举,王宝龙,等.基于DIGuy的人体视景仿真研究与应用[J].计算机工程与科学,2008(1).

    [5]耿奎,李为民,赵晨光.多武器模拟器训练系统中通信的设计与实现[J].计算机工程,2004(8).

    [6]张军,周卫华,刘培志,等.高炮DIS中PDu设计及与VRLink通信的实现[J].系统仿真学报,2000(5).

    [7]赵晨光,李为民,耿奎.多层防御拦截巡航导弹攻防对抗仿真系统研究[J].计算机仿真,2003(7).

    [8]宋志明,康凤举,唐凯,等.水下航行器视景仿真系统的研究[J].系统仿真学报,2002(6).

    [9] JimBeveriDge,roBertwiener.win32多线程程序设计[m].侯捷,译.武汉:华中科技大学出版社,2002.

    [10] maktechnologieS.rLinkDeveloPer'SguiDe[cP/Dk].camBriDge:maktechnologieS,2002.

  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料