【信息科学与控制工程】
基于VisualStudio的虚拟现实与半实物接口设计
邓飙,刘连伟
(第二炮兵工程大学,西安 710025)
摘要:Virtools交互式操作中半实物接口的实现方法主要有2种。一是编写串口通信类,使用Virtools SDK模块开发实现;二是基于Virtools SDK,通过调用系统应用程序接口函数开发串口通信行为模块实现。2种方法对开发者使用C++语言编程能力要求很高。针对此问题,提出以Visual Studio 2010作为开发平台,使用C#开发环境中的串口控件,通过添加COM组件中的Virtools 3D XE Player,实现虚拟现实作品与硬件的交互。实验证明,该方法在实现串口通信的同时,缩短了开发周期。
关键词:Visual Studio;Virtools;虚拟现实;半实物接口;交互式操作
收稿日期:2014-08-06
作者简介:邓飙(1969—),男(苗族), 博士,副教授,主要从事系统仿真理论与技术研究;刘连伟(1989—),男,研究生,主要从事虚拟仿真技术研究。
doi:10.11809/scbgxb2015.01.032
中图分类号:TP391.9
文章编号:1006-0707(2015)01-0114-04
本文引用格式:邓飙,刘连伟.基于VisualStudio的虚拟现实与半实物接口设计[J].四川兵工学报,2015(1):114-117.
Citationformat:DENGBiao,LIULian-wei.DesignofSemi-PhysicalInterfaceBasedonVisualStudio[J].JournalofSichuanOrdnance,2015(1):114-117.
DesignofSemi-PhysicalInterfaceBasedonVisualStudio
DENGBiao,LIULian-wei
(TheSecondArtilleryEngineeringUniversityofPLA,Xi’an710025,China)
Abstract:There are two main methods to realize the semi-physical interface of the Virtools interactive operation. One is that writing serial port communication class with the help of Virtools SDK. The other is that calling the application program interface (API) function of the system to develop the serial port communication building blockings (BB). There is a high requirement on the developers’ programming ability of using C++ . According to the problem, a new method was put forward. Taking Visual Studio 2010 as an intermediary platform, using serial port control in the C# development environment, Virtools 3D XE Player from the COM components were added to realize the interactive operation between the virtual scene and the physical system. It turns out to be a better way to achieve the designed goal and to shorten the development cycle.
Keywords:VisualStudio;Virtools;virtualreality;semi-physicalinterface;interactiveoperation
虚拟现实VR(VirtoolsReality)技术又称为“灵境”技术,指用计算机搭建一个逼真的三维感觉世界,使人和计算机很好地 “融为一体”,给人以“身临其境”的感觉[1]。经过近30年的发展,虚拟现实技术在许多领域有着广阔的应用前景[2,3]。虚拟现实的实现需要硬件和软件2方面的支持,硬件方面主要包括数据手套、三维鼠标、运动跟踪器、力反馈装置、语音识别及合成系统等。
Virtools软件自带了大量的行为模块供开发者使用,但是Virtools软件并未提供标准的数据通信模块,不能与虚拟现实仿真系统进行数据通信,因此,虚拟现实仿真系统设计的难点在于半实物接口的设计。朱湘龙[4],张跃文[5]利用VirtoolsSDK(SoftwareDevelopmentKit),通过调用相应的应用程序接口函数(API)创建自定义通信模块,实现了实物系统与视景仿真之间的通信,这种方法要求开发者对操作系统的底层函数有很好的理解,并能熟练使用;覃伯明[6]通过编写串口通信类,利用VisualStudio2003编译生成.dll通信插件,完成了对串口的打开,读写操作,这种方法对开发者的C++ 语言使用能力提出了很高要求;傅招国[7],夏华锦[8],徐望[9]利用Virtools自带的行为模块(BB)实现了游戏方向盘与仿真系统的交互控制,这种方法较为简单,但连接的外部设备比较单一,工业情况下不适用。
针对此问题,提出以VisualStudio2010(以下简称VS2010)中的C#开发环境为平台,载入Virtools3DXEPlayer组件后,利用VS2010现有的SerialPort串口控件,通过虚拟现实仿真系统(*.cmo文件)与VS2010通信,VS2010与硬件(单片机)通信,最终实现虚拟现实仿真系统与硬件通信。本文利用Virtools自带的实例,CameraOrbit.cmo与单片机进行信息交互试验,通过单片机上按键控制虚拟场景中石像进行转动或平移运动,以及虚拟场景通过发送消息控制单片机数码管显示不同数字,以此验证本文提出方法的可靠性。逻辑关系如图1所示。
图1 通信实现逻辑
1软件平台
1.1Virtools
Virtools是一套具备丰富互动行为模块的实时3D环境虚拟实景编辑软件。本身自带了700多个BuildingBlock(BB)模块,使用这些模块可以迅速方便地处理丰富和交互性强的3D模型。对于某些特殊用途,比如,串口通信的实现,就需要使用VirtoolsSDK开发出新的适用于特殊需求的BB模块。SDK针对C++语言,具有C++面向对象语言的所有特点。
1.2VS2010
VS2010是微软公司推出的开发环境,采用拖曳式便能完成软件的开发。简单的操作便可以实现一个界面的生成,支持C#、C++、VB等多种语言开发环境。其主要特点有:支持多个监视器、快速浏览代码、调用层次结构项目功能对应等。
2关键技术及实现
2.1虚拟现实仿真系统与VS2010交互
为减少原型开发周期并减少工作量,本文使用VS2010中C#开发环境与3DXEPlayer组件开发原型的界面。3DXEPlayer组件具有以下优点:
1) 支持所有.NET开发环境,方便程序开发人员。
2) 不仅提供播放器窗口功能,还包括多种常用方法控件。
C#是可用于创建要运行在.NETCLR上的应用程序的语言之一,是微软专门为使用.NET平台而创建的。它能使用.NETFramework代码库的每种功能 其主要特点有语法简单、易于移植到其他操作系统上等。相比于C++,它是类型安全语言,运行更加稳定。
2.1.1虚拟现实仿真体统载入
为了在VS2010中载入虚拟现实仿真系统,首先要完成Virtools3DXEPlayer组件的加载。在“工具箱”选项中,依次右键——选择项——COM组件——Virtools3DXEPlayer,点击确定即可加载。
完成组件的加载后,便可以进行仿真系统的载入。以下为Virtools3DXEPlayer组件载入仿真系统函数原型:
publicvirtualvoidLoad(stringfile):该函数用于将虚拟场景仿真系统文件,即将*.cmo文件载入到C#开发环境中,其参数file有2种实现方式,一是填写完整的文件路径名,如“D:ProgramFiles/3DVIA/*.cmo”,这里需要注意的是,文件名之间不能用“”,否则会出现编译错误;二是填写相对路径,即“Application.StartupPath+”.*.cmo””,这里要注意的是,要将待加载的*.cmo文件放入到该项目工程中的Debug文件夹内。
关键代码如下:
privatevoidtimer1_Tick(objectsender,EventArgse)
{
this.axXEPlayer1.Load(Application.StartupPath+ ".//CameraOrbit.cmo");
this.timer1.Stop();
}
2.1.2虚拟现实仿真系统向VS2010发送消息
该模块实现的功能是,当虚拟现实仿真系统成功导入到VS2010中后,利用Virtools软件自带的“FireVirtoolsEvent”BB模块实现由虚拟现实仿真系统向VS2010发送消息,该模块具有2个参数,如图2所示。
图2 Fire Virtools Event参数设置
“EventName”为发送数据说明,应该简单明了,容易识别,“EventData”为发送数据内容。
2.1.3VS2010接收虚拟现实仿真系统消息
在VS2010中,利用Virtools3DXEPlayer组件中的VirtoolsEvent事件接收来自虚拟现实仿真系统的消息,其函数原型如下:
privatevoidaxXEPlayer1_VirtoolsEvent(objectsender,AxXEPlayerActiveX._IXEPlayerEvents_VirtoolsEventEvente):该函数中需要注意的是第二个参数“e”,其对应于虚拟场景文件中“FireVirtoolsEvent”模块中的参数“EventName”,利用“e.eventData.ToString()”可以获取其所携带的数据,即“EventData”参数的内容,进而通过对数据内容的判断,做出相应的动作,触发不同的事件。
部分代码如下:
privatevoidaxXEPlayer1_VirtoolsEvent(objectsender,AxXEPlayerActiveX._IXEPlayerEvents_VirtoolsEventEvente)
{
if(e.eventData.ToString() == "8") / /如果仿真系统发送数字8,则向单片机发送如下信息
{
byte[]send1 =newbyte[5]{ 0x77,0xAA,0x03,0xbd,0x01 };
serialPort1.Write(send1,0,5);
}
if(e.eventData.ToString() == "9")/ /如果仿真系统发送数字9,则向单片机发送如下信息
{
byte[]send=newbyte[5]{0x77,0xAA,0x03,0xbd,0x02};
serialPort1.Write(send,0,5);
}
}
2.1.4VS2010向虚拟现实仿真系统发送消息
当VS2010接收到来自硬件的消息时,需要向虚拟现实仿真系统发送对应消息,虚拟场景中的物体接收到来自VS2010的消息后做出相应的动作,借此实现硬件与虚拟场景对象之间的交互。VS2010中向虚拟现实仿真系统发送消息的函数声明如下:
publicvirtualvoidBroadcastMessageSingle(stringmessage)。
关键代码如下:
privatevoidVT_work(stringtext) //VS2010向仿真系统发送消息
{
axXEPlayer1.BroadcastMessageSingle(text);
}
2.1.5虚拟现实仿真系统接收VS2010消息
为了实现对VS2010所发送消息的接收,虚拟现实仿真系统脚本中需加入多个“WaitMessage”BB模块,该BB模块当接收到与设定内容相同的消息时,便触发“out”输出端口。所以,通过对接收内容的设置,及在该模块后添加相应脚本,可以实现不同的动作响应。如图3所示为该模块的参数设置对话框,“Message”所接收内容。
图3 “ Wait Message” BB参数对话框
2.2VS2010与硬件交互
单片机具有体积小、功耗低、控制能力强、扩展灵活、微型化和使用方便等优点,目前已渗透到生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。例如,仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制领域。单片机与各种硬件之间的交互控制技术已经非常成熟,所以,只要实现VS2010与单片机之间的信息交互,再通过单片机与所需控制的外围硬件连接,便可完成VS2010对其他外接硬件设备的间接控制。因此,本文只讨论VS2010与单片机之间的信息交互实现方法。
2.2.1VS2010向单片机发送消息
当VS2010接收到来自虚拟现实仿真系统发送的消息时,需要根据消息内容做出相应的判断,并根据判断向单片机发送消息。这一功能实现需要借助SerialPort串口控件的“Write”函数,其函数声明如下所示:
publicvoidWrite(byte[]buffer,intoffset,intcount):该函数的“buffer”参数表示一个字节数组,“offset”参数表示从“buffer”数组中第几个字节开始写入串口,“count”参数表示需要写入的字节数量。
其关键代码参看2.1.3小节。
2.2.2VS2010接收单片机消息
此功能模块实现的是,VS2010作为单片机与虚拟现实仿真系统的中介平台对单片机发送的消息进行接收,这一功能实现需要借助SerialPort串口控件中的“DataReceived”事件,及“Read”函数(与“Write”函数类似,不再赘述)。需要注意的是,串口控件在工作时为保证能实时接收和发送消息,会在主线程外开辟一个新的线程。所以,当在“DataReceived”函数事件中向仿真系统发送来自单片机的消息时,需要进行委托,才能进行跨线程参数传递,否则编译会出现错误。
关键代码如下:
privatevoidserialPort1_DataReceived(objectsender,System.IO.Ports.SerialDataReceivedEventArgse)
{
byte[]receive;
s=null;
intnum=serialPort1.BytesToRead; //确定单片机发送给VS2010数据的字节数
if(num> 0)
{
receive=newbyte[num];
serialPort1.Read(receive,0,num); //读取单片机发送数据
for(inti= 0;i { s+=receive[i].ToString("X2"); } if(s== "77AA03BDEE22")//根据单片机发送数据,向仿真系统进行跨线程对应参数传递 { if(axXEPlayer1.InvokeRequired) { DelegateVT_workdelegatevt=newDelegateVT_work(VT_work); axXEPlayer1.Invoke(delegatevt,newobject[] { "zhuandong" }); } } } } 3应用案例 本文将Virtools自带的实例CameraOrbit.cmo集成到VS2010生成的窗体中,发现半实物接口能够很好地工作,单片机发送的数据都及时,准确地到达了CameraOrbit.cmo。CameraOrbit.cmo中的石像实时的对单片机的操作做出了预定的反应。使用单片机按键可以很好地控制石像进行旋转,移动等动作,同样,利用CameraOrbit.cmo文件中的“FireVirtoolsEvent”模块也可以通过发送数字“8”、“9”控制单片机数码管实时显示“8”、“9”。系统整体运行流畅,未出现可觉察延迟现象,在各种操作组合下,计算机COM口都能正确地接收发送指令,达到预期的效果。 4结束语 本文在VS2010平台下,通过添加Virtools3DXEPlayer组件,调用SerialPort串口控件,利用其现有的串口打开,关闭,读写等函数,完成了对Virtools自带实例CameraOrbit.cmo半实物接口的设计与开发,实现了基于VS2010的虚拟现实系统与半实物之间的实时通信。这一技术利用现有串口控件,避免了使用VirtoolsSDK开发相同功能BB模块时,复杂及大量的C++编程,减少了系统开发设计中的工作量,实现了效率的提高。 参考文献: [1]杨湛,陈德焜,严佳伟.基于Virtools的会场布置系统的开发[J].计算机应用与软件,2012,29(11):328-330. [2]张学鹏,陈国华,张爱军.基于3D的虚拟运动仿真及Virtools功能实现[J].北京化工大学学报,2009,36(4):93-95. [3]王洪泊,黄翔,曾广平,等,智能三维虚拟试衣模特仿真系统设计[J].计算机应研究,2009,26(4):1405-1408. [4]朱湘龙,于天朋,侯师.基于Virtools虚拟训练系统半实物接口设计[J].弹箭与制导学报,2012,32(6):167-169,173. [5]张跃文.某型号火炮发射制导系统半实物仿真平台的研究[D].长沙,湖南大学,2013. [6]覃伯明.Virtools引擎3D游戏程序设计[M].北京:清华大学出版社,2013:457-465. [7]傅招国.虚拟驾驶系统开发与应用研究[D].上海:华东理工大学,2012. [8]夏华锦.基于Virtools的叉车模拟培训系统设计与实现[D].成都:电子科技大学,2011. [9]徐望.北京市大型立交桥虚拟驾驶训练与路考系统的设计与实现[D].北京:北京工业大学,2013. (责任编辑杨继森)