周 杰
(海軍潛艇學院 山東 青島 266042)
?
Virtools與VisualC++信息交互技術(shù)研究
周 杰
(海軍潛艇學院 山東 青島 266042)
為彌補虛擬開發(fā)平臺Virtools通信模式的缺陷,豐富Virtools與其他軟件平臺的通信手段,拓展應用范圍,針對Virtools與VC的通信機制,提出通過開發(fā)UDP通信模塊、串口通信模塊以及利用Virtools消息機制和Virtools陣列輸出機制完成兩種軟件平臺之間數(shù)據(jù)交互的方法。充分發(fā)揮VC開發(fā)平臺良好的兼容性,為Virtools與其他不同軟件平臺間進行信息交互提供可行途徑。
Virtools VC 通信
虛擬現(xiàn)實技術(shù)(VR),通過綜合利用圖片、視頻、三維動畫和聲音等多媒體素材,營造出具有沉浸性、交互性、構(gòu)想性的軟件操作環(huán)境[1]。虛擬現(xiàn)實技術(shù)通過構(gòu)建三維模型,營造多種視角,提供具有沉浸性和交互性的操作環(huán)境,操作者可以親身漫游虛擬世界,多角度觀察操作方法,身臨其境參與交互,給操作者強烈的臨場感和逼真感。這種深層的自然的人機交互,使操作人員改變以往被動的知識接受模式,變?yōu)橹鲃犹骄?,積極尋求新知識,形成潛在技能,可以為實際操作技能的最終形成奠定基礎。將虛擬現(xiàn)實技術(shù)融合到模擬訓練系統(tǒng)中,如運輸工具駕駛、武器裝備操作等訓練平臺,可以有效解決傳統(tǒng)模擬操作中臨場感弱、操作訓練不充分、難以形成有效技能的問題。通過逼真的操作平臺、工具模型和高度還原的操作過程,調(diào)動操作者的主動性,提升知識技能構(gòu)建的效率。在保證設備和人員安全的前提下,實踐所學知識,加速知識到技能的轉(zhuǎn)換過程。
虛擬現(xiàn)實技術(shù)已經(jīng)廣泛應用于設計測試、模擬訓練、游戲娛樂和教學科研等多個領域。隨著VR頭戴設備、應力反饋設備等各種終端設備的大量使用,VR技術(shù)的應用廣度和深度逐年提升,涌現(xiàn)出許多成熟的開發(fā)平臺,如Quest3D、Virtools和Unity3D等。其中Virtools是法國達索公司開發(fā)的三維虛擬軟件開發(fā)平臺,將自身功能模塊與其他三維軟件開發(fā)的模型或場景相結(jié)合,通過編程規(guī)劃其邏輯行為和物理屬性,開發(fā)貼近現(xiàn)實的虛擬交互環(huán)境[2]。Virtools功能、模塊完善,適用于游戲和動畫的開發(fā)制作,也是出現(xiàn)最早、使用最為廣泛的虛擬現(xiàn)實游戲開發(fā)工具。Virtools突出的便捷性和開放性,使其成為許多虛擬現(xiàn)實開發(fā)技術(shù)初學者的首選。利用行為模塊實現(xiàn)圖形化的開發(fā)介面,通過視覺化窗口實現(xiàn)圖形化編程,這些特點都使Virtools的學習門檻降低,易于理解,便于掌握。但對于需要使用多種軟件平臺聯(lián)合開發(fā)的復雜系統(tǒng),使用Virtools與其他軟件平臺進行通信時卻存在一定的技術(shù)缺陷,信息交互技術(shù)的短板限制了Virtools的應用,特別對于使用最為廣泛的Visual C++開發(fā)平臺,僅利用Virtools自帶的行為模塊很難實現(xiàn)二者之間的信息交互。針對這一技術(shù)缺陷,本文提出了行之有效的技術(shù)方案,解決Virtools虛擬軟件和Visual C++軟件開發(fā)平臺之間信息交互困難的難題。
Vtrtools通過模塊開發(fā)機制實現(xiàn)行為開發(fā)與互動操作,各類功能模塊稱作BuildingBlock,將不同功能的BuildingBlock遵循預設的邏輯關系組合起來實現(xiàn)預定的功能[3]。
網(wǎng)絡服務器模塊包含大量Building Block(BB模塊)實現(xiàn)Virtools的網(wǎng)絡通信功能。這些Building Block遵循TCP/IP協(xié)議,按照典型的CS結(jié)構(gòu),完成網(wǎng)絡通信。但必須在VirtoolsDev軟件平臺下調(diào)用這些功能模塊才能構(gòu)建通信網(wǎng)絡。即所有網(wǎng)絡通信節(jié)點都要用Virtools來開發(fā),才能使用網(wǎng)絡通信BuildingBlock構(gòu)建通信體系[4]。在復雜系統(tǒng)的開發(fā)過程中,Virtools經(jīng)常需要響應其他軟件開發(fā)平臺的信息,例如VC編寫的程序向Virtools發(fā)送消息,Virtools接受消息并控制模型產(chǎn)生相應動作。Virtools自帶的模塊庫中沒有此類功能模塊,當需要Virtools軟件平臺和其他軟件平臺之間進行通信,交換數(shù)據(jù),這時Virtools通信的局限性就凸顯出來,內(nèi)置網(wǎng)絡模塊無法與其他軟件平臺進行信息通信。這種缺陷限制了Virools平臺與其他不同軟件平臺之間的信息交互,不利于大型三維虛擬軟件的開發(fā)。
Visual C++(VC)軟件開發(fā)平臺基礎語言較為普及,代碼執(zhí)行效率高,使用微軟編譯器,得到Windows系列操作系統(tǒng)的良好支持,開發(fā)的程序健壯、穩(wěn)定。一般大型程序的核心組件都使用VC開發(fā),以滿足核心程序運行高效穩(wěn)定的要求。VC具有完善的幫助文檔,大量的優(yōu)質(zhì)教材和海量的網(wǎng)絡資源,為開發(fā)者帶來了極大的便利條件。而且VC開發(fā)平臺具有多種控件及函數(shù)接口,可以利用多種方法實現(xiàn)與不同軟件之間的信息通信。研究Virtools與VC之間的信息交互技術(shù),以VC平臺為樞紐,充分利用VC平臺豐富的編程資源、良好的兼容性和擴展性,實現(xiàn)Virtools與其他軟件的信息交互,彌補其信息交互技術(shù)的短板,擴展Virtools的通信手段,拓展應用范圍。
用戶數(shù)據(jù)報協(xié)議(UDP協(xié)議),與TCP協(xié)議相比沒有擁塞控制機制,便于維持最低數(shù)據(jù)率,消除數(shù)據(jù)傳輸時延[5],在實時控制程序中應該利用UDP協(xié)議速度優(yōu)勢建立通信機制,用戶數(shù)據(jù)報協(xié)議通過套接字(Socket)傳輸數(shù)據(jù),將該協(xié)議嵌入到Building Block中,再利用VC的套接字技術(shù)可實現(xiàn)VC與Virtools平臺的通信。Building Block開發(fā)需要利用Microsoft Visual Studio.Net環(huán)境,開發(fā)流程如圖1所示。
圖1 Building Block開發(fā)流程
(1) 使用函數(shù)CKGetPluginInfo()和CKGetPluginlnfoCount()將DLL聲明為Building Block Plugin,定義Plugin為Behavior Plugin類型,定義并聲明Building Block Plugin個數(shù)為一,使用這個Plugin執(zhí)行Building Block,Building Block Plug要執(zhí)行的Building Block用函數(shù)RegisterBehaviorDcclaration()注冊。
(2) 利用CreateCKObjectDeclaration()聲明函數(shù)創(chuàng)建CKObjectDeelaration類型的指針,指向創(chuàng)建的Building Block信息函數(shù),描述Building Block的基本信息,如版本號,作者,功能。
(3) 用創(chuàng)建函數(shù)CreateCKBehaviorPrototype()創(chuàng)建網(wǎng)絡通信相關的模塊輸入端口,定義端口號、網(wǎng)絡地址等。從指定輸入端口上獲取并保存網(wǎng)絡信息和網(wǎng)絡數(shù)據(jù)結(jié)果。
(4) 將使用套接字相關的頭文件和庫文件添加到Building Block中,首先激活模塊的輸入端口,再將網(wǎng)絡應用程序移植到BuildingBlock的執(zhí)行函數(shù)中。讀取輸入?yún)?shù)可利用函數(shù)GetlnputParameterValue()數(shù)據(jù)結(jié)果可通過SetOutputParameterValue()保存到參數(shù)輸出端口。
(5) 使用系統(tǒng)默認同調(diào)函數(shù)完成對Building Block的創(chuàng)建,生成DLL文件。
(6) 編譯成功后,從生成的文件目錄下將DLL文件拷貝到Virtools軟件安裝目錄下的BuildingBlock文件夾中,重新啟動Virtools調(diào)用執(zhí)行。
用戶數(shù)據(jù)報協(xié)議通信模塊發(fā)出的信息在VC中可利用套接字(Socket)進行處理,完成信息交換。
首先調(diào)用WSAStartup()初始化Windows Sockets DLL 。WinSock的動態(tài)連接庫初始化成功后,在服務器端使用函數(shù)socket( int af, int type, int protocol )建立監(jiān)聽Socket,type參數(shù)設定為SOCK_DGRAM,以使用UDP(數(shù)據(jù)報)通信協(xié)議。接下來調(diào)用bind()函數(shù)為Socket指定地址和端口(Port)。服務器端完成Socket對象綁定之后,使用listen()函數(shù)建立監(jiān)聽隊列,進入監(jiān)聽狀態(tài)準備接收客戶端連接請求,并設定最大連接數(shù)。當需要真正完成通信連接時,客戶端需調(diào)用connect()發(fā)出請求,系統(tǒng)使用WSAAsyncSelect()函數(shù)發(fā)出通知,服務器端調(diào)用accept()響應請求,完成通信連接。建立連接后,客戶端的Virtools程序就可以借由用戶數(shù)據(jù)報BB模塊發(fā)出自定義消息,而VC開發(fā)的服務器端通過分析消息,調(diào)用相關函數(shù)進行處理。結(jié)束通信連接由服務器或客戶端的任一端調(diào)用closesocket()套接字,并調(diào)用 WSACleanup()通知套接字動態(tài)鏈接庫釋放占用的資源。
串口通信是利用數(shù)據(jù)信號線連接外設和計算機,完成按位數(shù)據(jù)傳輸?shù)囊环N通信方法[6]。串口通信雙方連接采用端對端的方式,連接方式單一,硬件要求低,不容易出現(xiàn)相互干擾,查錯糾錯難度低,容易實現(xiàn)。但其存在接口插拔風險,要避免兩端通電狀態(tài)下的拔插,安全性低于網(wǎng)口。串口通信傳輸速度較慢,對于操作對象較多,交互數(shù)據(jù)量較大的虛擬操作軟件,傳輸數(shù)據(jù)量很難達到實時通信的要求,串口通信僅能應對虛擬環(huán)境較為簡單,操作對象單一的虛擬操作軟件。而且應用程序?qū)Υ诰哂歇氄夹?,一旦某個程序占據(jù)串口,其他的程序則無法使用該串口。單一程序由于串行通信的特點也無法使用多線程進行串口通信否則會發(fā)生多個命令之間的干擾導致通信失敗。
開發(fā)串口通信模塊需要利用Virtools SDK開發(fā)構(gòu)架,通過調(diào)用Win 32 API完成,靠指針依次調(diào)用執(zhí)行注冊函數(shù)、聲明函數(shù)、創(chuàng)建函數(shù)、執(zhí)行函數(shù)和回調(diào)函數(shù),完成對模塊的開發(fā)(具體開發(fā)步驟可參考用戶數(shù)據(jù)報協(xié)議通信模塊開發(fā))。在回調(diào)函數(shù)中調(diào)用Win32 API文件操作函數(shù)實現(xiàn)串口打開/關閉。CreateFile()函數(shù)實現(xiàn)串口打開,WriteFile()函數(shù)實現(xiàn)數(shù)據(jù)發(fā)送,ReadFile()函數(shù)則用來實現(xiàn)接受數(shù)據(jù)[6]。程序運行過程中,首先利用執(zhí)行函數(shù)完成Building Block激活,接著參數(shù)初始化,然后與通信端利用握手機制建立連接,從計算機串口讀取并處理數(shù)據(jù),數(shù)據(jù)結(jié)果可供其他模塊調(diào)用。串口通信模塊的循環(huán)調(diào)用可通過Virtools幀循環(huán)方式實現(xiàn)。
VC可利用多種方式接受Virtools通過串口發(fā)出的數(shù)據(jù),如串行通信控件MSComm或利用串口通信類。串行通信控件主要應用于基于對話框開發(fā)的程序,通過事件驅(qū)動處理串行端口信息交互,發(fā)生數(shù)據(jù)交換或通信錯誤時,OnComm事件觸發(fā),捕捉CommEvent屬性值,應用程序根據(jù)屬性值做出相應的信息處理。
其次可開發(fā)自定義的串口通信類,在單線程或多線程中實現(xiàn)串口通信。利用CreateFile()函數(shù)指定通信串口及相關屬性。通過調(diào)用GetCommState()函數(shù)讀取當前串口設置,通過SetCommState()函數(shù)寫入修改后的屬性。調(diào)用SetCommTimeouts()函數(shù)通過COMMTIMEOUTS結(jié)構(gòu)設置異步讀寫的超時控制。串口讀寫操作主要運用ReadFile()與WriteFile()API函數(shù)。
消息是對象之間在一次交互中所傳送的信息。為保持封裝對象成為各司其職,互不干擾的高內(nèi)聚獨立單位,消息通信成為對象之間唯一合法的動態(tài)聯(lián)系途徑,使不同功能單元的行為互相配合,構(gòu)成一個動態(tài)、有序的系統(tǒng)[7]。當系統(tǒng)發(fā)生某個事件時,操作系統(tǒng)將與這個事件關聯(lián)的消息放置到消息隊列,應用程序從消息隊列中接收消息并傳遞給適當?shù)拇翱?,窗口響應并處理消息。所有的開發(fā)環(huán)境都有消息機制,因此借由消息機制,可以實現(xiàn)不同平臺之間的應用程序調(diào)用請求。消息機制可用于緩解甚至消除系統(tǒng)瓶頸,消息處理可并行展開,緩解點對點同步連接造成系統(tǒng)瓶頸,甚至可以消除瓶頸。通過多個消息接收者并發(fā)處理不同消息,還可以提高系統(tǒng)的整體可伸縮性和吞吐量。消息機制的這些特點都使它非常適用于完成虛擬平臺和VC軟件平臺之間的實時大數(shù)據(jù)量信息交互。
利用消息機制進行通信,首先需要Virtools留出通信接口,以方便VC讀取相關信息。Virtools消息通信模塊的開發(fā)基本步驟與串口通信模塊、UDP通信模塊類似,完成指定消息的發(fā)送需在執(zhí)行函數(shù)中調(diào)用函數(shù):
CKMessageManage:SendMessageSingle(CKMessageType MsgType,CKBeobjectdest,CKBeObjecl*sender=NUll)
VC可利用鉤子機制獲取Virtools發(fā)送的特定消息。應用程序使用鉤子機制能夠完成特定事件的截獲和處理。應用程序可以在鉤子(Hook)這個消息處理平臺上面設置子程序,以監(jiān)測其他進程所創(chuàng)建的特定窗口的指定消息。指定消息存儲在鉤子鏈表中,即與信息相關聯(lián)的指針列表,該鏈表中的指針為各個類型的消息指定處理子程。這些處理子程叫做鉤子子程,鉤子子程可由應用程序自定義,它是應用程序的回調(diào)函數(shù),可通過API函數(shù)SetWindowsHookEx()將其安裝到鉤子鏈表中。
VC利用鉤子機制截獲并處理Virtools發(fā)出的消息后,可以通過發(fā)送指定的虛擬鍵盤消息將消息處理結(jié)果反饋Virtools完成通信。Virtools自帶行為交互模塊Keyboard Controller、Keyboard Mapper支持將按鍵操作映射為系統(tǒng)消息或自定義消息。響應鍵盤消息可保證信息傳遞的多樣性。VC可以實現(xiàn)在不激活應用程序的情況下向其窗口發(fā)送模擬按鍵消息。首先使用FindWindow() 及 FindWindowEx()函數(shù)取得接收按鍵消息的窗口句柄,然后用PostMessage()向該窗口發(fā)送按鍵消息。運用這種方法可以依據(jù)VC發(fā)送的信息對虛擬物體或角色進行靈活多變的控制,流程圖如圖2所示,利用消息機制實現(xiàn)VC與Virtools的通信。
圖2 消息機制通信流程
Virtools中的陣列用于建立數(shù)據(jù)、時間變量控制等,它由Column(列)和Row(行)組成[9]。Virtools的陣列可以存儲三維對象和攝像機的三維位置、矢量位移、旋轉(zhuǎn)方式、旋轉(zhuǎn)角度和動作時機等動作因素。Virtools提供了大量陣列操作BB,可以直接讀取三維物體的相關參數(shù)存儲到陣列或者根據(jù)陣列內(nèi)存儲的參數(shù)驅(qū)動三維物體動作。在Virtools程序運行時,通過Test和2D Picking行為交互模塊判斷此時被用戶操作的虛擬物體,并將虛擬物體的參數(shù)變化通過SetCell行為交互模塊對陣列的每一個元素及相應參數(shù)進行設置。然后利用Array Save行為交互模塊將數(shù)組數(shù)據(jù)儲存成指定路徑下的文件檔案[9]。一旦VC軟件讀取這些文件檔案就可以提取Virtools虛擬軟件操作的結(jié)果,并根據(jù)結(jié)果做出反饋,完成信息交互。
完成存儲后利用Windows API實現(xiàn)對指定目錄中文件的監(jiān)控,一旦發(fā)現(xiàn)文件改變,則立即進行處理,獲取數(shù)據(jù)??墒褂玫腁PI函數(shù)有:FindFirstChangeNotification()和ReadDirectory ChangesW()。兩個函數(shù)都能夠監(jiān)測文件最終寫入時間和文件大小的改變,從而實時監(jiān)測陣列輸出指定文件,快速提取Virtools通過陣列機制輸出的信息。
當監(jiān)控條件滿足時,F(xiàn)indFirstChangeNotification()函數(shù)返回的監(jiān)控句柄結(jié)束在WaitForMultipleObjects() 上的等待狀態(tài),變?yōu)榧ぐl(fā)狀態(tài),這時應用程序得知目錄發(fā)生了變化并立即進行數(shù)據(jù)處理,數(shù)據(jù)處理結(jié)束后調(diào)用BOOL FindNextChangeNotification()來將該監(jiān)控句柄置為去激活狀態(tài),并繼續(xù)等待下一次被激活。完成文件監(jiān)控時調(diào)用FindCloseChangeNotification()關閉監(jiān)控句柄。
ReadDirectoryChangesW()函數(shù)使用CreateFile()獲取要監(jiān)控目錄的句柄;然后循環(huán)調(diào)用ReadDirectoryChangesW()判斷文件是否改變,并分配內(nèi)存用來存放目錄變化通知并傳給該函數(shù)。當監(jiān)控條件滿足文件發(fā)生改變,函數(shù)把目錄變化通知存放在指定的內(nèi)存區(qū)域內(nèi),并進行相關處理。
在VC程序中利用上述函數(shù)實時監(jiān)控數(shù)組文件檔案存儲的指定路徑,一旦發(fā)現(xiàn)文件發(fā)生更改,使用CreateFile()函數(shù)取得對應文件的句柄,利用句柄使用ReadFile()函數(shù)讀取文件內(nèi)容到指定字符串,并進行相應處理,處理完成后結(jié)果可使用WriteFile()函數(shù)再次寫入數(shù)組文件。Virtools可以在完成陣列輸出后,在規(guī)定響應時間內(nèi)利用Array Load模塊讀取數(shù)組文件,利用數(shù)組元素完成虛擬物體的控制。利用Virtools數(shù)組輸出保存/讀取機制和VC文件監(jiān)控函數(shù)完成信息交互,流程如圖3所示。
圖3 陣列輸出機制通信流程
本文對Virtools與VC的信息交互技術(shù)進行了深入分析,通過自定義模塊開發(fā)技術(shù),將UDP協(xié)議、串口通信技術(shù)、消息通信機制嵌入到了Virtools的Building Block模塊中,豐富BB模塊的功能,彌補Virtools本身通信模塊的功能缺陷。在僅需利用Virtools已有模塊的情況下,提出利用Virtools陣列進行信息交互,使得Virtools與VC之間的通信手段更加多樣化。VC由于其突出的兼容性使其可以成為Virtools信息交互的中介,在技術(shù)上克服了Virtools與其他軟件平臺間通信的瓶頸問題,為Virtools與其他不同軟件平臺間進行信息交互搭建了一座橋梁,拓展了其應用范圍。
[1] 姜學智,李忠華.國內(nèi)外虛擬現(xiàn)實技術(shù)的研究現(xiàn)狀[J].遼寧工程技術(shù)大學學報,2004(4):238-241.
[2] 牛彥,張爍男.基于Virtools技術(shù)的產(chǎn)品虛擬交互式操作指導系統(tǒng)構(gòu)建[J].沈陽建筑大學學報,2012(5):569-572.
[3] 劉明昆.三維游戲設計師寶典[M].成都:四川出版集團四川電子音像出版中心,2005.
[4] 于修洪,項輝宇,牛凱.虛擬現(xiàn)實技術(shù)在機械產(chǎn)品裝配中的應用[J].現(xiàn)代制造工程,2011(5):39-42.
[5] 汪云飛,晁愛農(nóng),黃飛.基于Virtools的UDP協(xié)議嵌入模塊技術(shù)研究[J].計算機工程與設計,2010,31(8):1852-1855.
[6] 滕英巖,張福艷.基于Virtools和串口通信的界面交互性的設計與實現(xiàn)[J].微計算機信息,2010,26(17):88-90.
[7] 劉航,王春水,王積忠.基于視景仿真技術(shù)的某型裝備虛擬操作訓練系統(tǒng)[J].指揮控制與仿真,2007,29(2):79-82.
[8] 張豫南,郭文濤,田鵬,等.VC對Virtools二次開發(fā)實現(xiàn)網(wǎng)絡監(jiān)控的研究[J].電腦編程技巧與維護,2010(20):118-120.
[9] 于丹東,徐英新,胥林.三維游戲設計師寶典一Virtools行為模塊詞典大全[M].電腦報電子音像出版社,2009.
RESEARCHONINFORMATIONCOMMUNICATIONBETWEENVIRTOOLSANDVISUALC++
Zhou Jie
(NavalSubmarineAcademy,Qingdao266042,Shandong,China)
To make up for the communication defect of Virtools (i.e. one of the virtual development platform mode) and rich the means of communication between Virtools and other software platform and expand the scope of application. This paper aim at the communication mechanism for Virtools and VC and propose methods of developing UDP communication module, serial communication module, using the Virtools message mechanism and Virtools array output mechanism to complete the data exchange between the two kinds of software platform. The methods can give full play to good compatibility of the VC development platform and provide a feasible way for data exchange between Virtools and other different software.
Virtools VC Communication
2017-02-20。周杰,講師,主研領域:發(fā)射裝置。
TP3
A
10.3969/j.issn.1000-386x.2017.08.059