摘 要:復雜虛擬系統(tǒng)的交互界面,一般由二維的動態(tài)圖示框架構成。但是用Virtools自帶BB模塊過于復雜和繁瑣。本文提出一種基于VSL的混合模式的的解決方案,用簡單、清晰的流程和更有效的方法,實現(xiàn)動態(tài)圖示表。
關鍵詞:Virtools;VSL;混合模式;動態(tài)圖示表;VSL-BB模塊
中圖分類號:TP751
Virtools是一個典型的面向?qū)ο蟮拈_發(fā)環(huán)境,其編制程序的過程是基于流程化(Schematic)的編程模式,同時具有良好的可視的流程化編程的功能。也就是把一部分代碼封裝成一個模塊,也稱為BB模塊,每個可以單個獨立實現(xiàn)某一特定的功能,把若干個具備單個功能的BB模塊依次連接,形成一個邏輯流程。流程化的優(yōu)點是:邏輯明確、思路清晰,邏輯及流程上的改動相對比較方便;其次,不用編寫任何代碼也能實現(xiàn)程序的功能。
基于Virtools的虛擬現(xiàn)實中二維按鈕交互功能設計實現(xiàn)[1]中,閘述了二維按鈕在交互功能在虛擬現(xiàn)實中的重要性以及實現(xiàn)方法。在虛擬現(xiàn)實環(huán)境中,特別在圖形界面下,實現(xiàn)人機交互,鼠標進行交互為主,因此用Virtools開發(fā)的虛擬系統(tǒng),不管是主界面還是進入功能模塊,采用二維按鈕交互,會取得更佳的交互效果。換言之,用好二維按鈕交互功能,決定了產(chǎn)品界面的優(yōu)與劣。典型的二維交互式主界面由一個動態(tài)圖示表構成,《就是要做3D游戲》[2]的第十三章給出了一個制作動態(tài)圖示表的方案并給描述了實現(xiàn)的整個過程,給讀者提供一個可以借鑒的經(jīng)典的實例。但是,其實現(xiàn)動態(tài)圖示表的方法,全程做用Virtools自帶的BB模塊實現(xiàn),共用18個BB模塊實現(xiàn)動態(tài)圖示表顯示的功能,而程序流程連線隨著模塊數(shù)量的增加而增加,至使程序的邏輯不夠明確而影響程序的易讀性和程序的維護,凸顯單純使用自帶BB模塊的局限性,換句話說,單一使用自帶BB模塊實現(xiàn)較復雜的功能,須用犧牲程序和流程的易讀為代價。換言之,為實現(xiàn)某一特殊功能,僅靠Virtools自身的BB還不能滿足需要,這時需要使用合適的工具(如VSL)編寫新的BB模塊以適用于特殊用途。為此,本文提出一種基于VSL的混合模式的解決方案,用簡單、清晰的流程和更有效的方法,實現(xiàn)動態(tài)圖示表。
1 混合式實現(xiàn)動態(tài)圖示框架的流程
用Virtools開發(fā)項目的流程中的各個功能單元,一般可通過三種途徑實現(xiàn),即用BB模塊實現(xiàn)、在可視化環(huán)境下實現(xiàn)或編寫VSL程序?qū)崿F(xiàn)。三種方法各有優(yōu)勢和劣勢,因此,項目流程的開發(fā)過程中,根據(jù)不同的情況,采用三種方法的組合形式實現(xiàn)單功能單元,可提高程序的易讀性,使程序的邏輯更加清晰,便于程序的修改與維護。
基于VSL混合模式的解決方案,就是在解決問題時,采用多種方式的組合而非單一的用Virtools自帶BB模塊的組合方法,換言之,用可視化環(huán)境、自編VSL-BB模塊或Virtools自帶模塊,分別實現(xiàn)各個功能單元,形成一個混合模式,至于各功能單元用什么方式,視具體情況而定。以下是上述這種混合模式實現(xiàn)動態(tài)圖示表的流程。
基于VSL混合式方式實現(xiàn)動態(tài)圖示框架,可分為以下三個模塊實現(xiàn)。
模塊一:創(chuàng)建2Dframe序列并依次命名。
模塊二:創(chuàng)建列數(shù)=1的數(shù)據(jù)表array,
與2Dframe序列號進行以字符串形式的鏈接。
模塊三:確定行數(shù)(row)和列數(shù)(column)、縱向和橫向偏移量(Offset);
遍歷array的記錄;
設置框架與2Dframe序列的父子關系;
計算每個2Dframe的二維坐標并根據(jù)坐標值定位。
其中,1至2模塊均在可視化環(huán)境完成,由于Virtools的可視化程度很高,結果即時在視化環(huán)境的schematic窗口上展現(xiàn),因此,模塊1至2模塊的實現(xiàn)過程容易、簡單,過程一目了然。第3模塊通過編寫VSL-BB模塊來實現(xiàn)2Dframe序列的相對二維坐標的定位。
2 VSL函數(shù)和VSL-BB模塊的實現(xiàn)
2.1 VSL的GetElementObject和Cast函數(shù)
VSL-BB模塊的實現(xiàn),需要調(diào)用GetElementObject和Cast函數(shù)。
首先,GetElementObject是數(shù)據(jù)表對象Array的函數(shù)。
調(diào)用格式:Array.GetElementObject(int x,int y),其中,x,y分別對應數(shù)據(jù)表的行標和列標,函數(shù)返回值是數(shù)據(jù)表Array第x行、第y列單元格所存放的內(nèi)容,通常是字符串,Array第y列的域的數(shù)據(jù)類型為parament。
由于Array存放的數(shù)據(jù)并不是物件本身,而是與物件建立了一一映射的字符串(物件的名字),因此,Array.GetElementObject()的返回值是字符串并不是物件,VSL要對字符串所映射的物件進行操作,須用對象Object的函數(shù)Cast進行轉換并賦予臨時變量,通過對臨時變量的操作實現(xiàn)在物件的操作。
Cast的調(diào)用格式形如:Object.Cast(String temp)。
對GetElementObject和Cast函數(shù),可用復合的方式實現(xiàn)對兩個函數(shù)的調(diào)用,本文中的VSL-BB模塊,是實現(xiàn)對2DFrame具體操作,因此,其調(diào)用格式為:
temp=Entity2D.Cast(MyArray.GetElementObject(x,y));其中temp為Entity2D類型變量。
2.2 VSL-BB模塊的實現(xiàn)
模塊的主要功能是對2Dframe物件序列(2DButton0~8)的相對定位,其中參考體為框架的裝飾圖像。根據(jù)框架裝飾圖像、2Dframe物件的大小(2Dframe的長與寬都是48)以及經(jīng)驗,做如下的初值設置:
row=3;column=3;Offset=19;interval=5;
按以下公式計算第i個2DButtoni(i=0,1,2,…,8)的坐標:
主要的程序段如下:
for (row=0;row<3;row++)
for (column=0;column<3;column++)
{
temp=Entity2D.Cast(MyArray.GetElementObject(x,y));
temp.x=xi;
temp.y=yi;
}
……
3 實驗及測試結果
準備:首先將框架裝飾圖像導入當前場景;在可視化環(huán)境(LayOut窗口)下,建立一個2DButton0,復制8個,名字依次為2DButton1~8,共9個,創(chuàng)建只有一列的數(shù)據(jù)表Array,其中,域的數(shù)據(jù)類型設置為paratmenter,添加9個行,依次將9個行的數(shù)據(jù)設置為字符串2DButton0~8并與2DButton0~8進行以字符串形式的鏈接,將字符串2DButton0~8與物件2DButton0~8建立一一映射關系。
打開Schematic窗口,添加VSL-BB模塊并打開VSL編輯窗,此時,在其右側(可視化環(huán)境)的input添加row、column、初始變量并設置相應的初值。在VSL代碼編輯區(qū)域輸入程序代碼(見2.2),通過編譯并運行,得到如圖所示的結果。
過程在兩個窗口中完成,首先在可視化窗口(3DLayOut)完成;其次,在VSL編輯窗實現(xiàn)特定功能的VSL-BB模塊的編譯和調(diào)試,流程簡潔明了。
4 結束語
本文在Virtools下,用VSL語言編程的方式,提出了在虛擬系統(tǒng)中,界面動態(tài)圖示框架的方案,解決了用Virtools自帶BB模塊過于復雜的缺陷。一般來說,復雜虛擬系統(tǒng)的交互界面,都由二維的動態(tài)圖示框架構成,因此,本文中的方法具有一般性,適用在虛擬系統(tǒng)開發(fā)中,對高效實現(xiàn)二維交互界面的開發(fā)有一定的指導意義。
參考文獻:
[1]李梅,韓秀玲,陳光.基于VirtoolsSDK的虛擬實驗室BB模塊開發(fā)方法研究[J].計算機與現(xiàn)代化,2013.
[2]劉明昆.就是要做3D游戲-Virtools秘笈篇[M].北京:中國青年出版社,2010.
作者簡介:趙智(1962.10-),男,廣西龍州人,廣西師范大學本科,副教授,研究方向:計算機應用。
作者單位:廣西教育學院 數(shù)學與信息科學學院,南寧 530023