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