【信息科學與控制工程】
基于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. (責任編輯楊繼森)