彭偉國(guó),栗昊
(平頂山學(xué)院計(jì)算機(jī)學(xué)院(軟件學(xué)院),平頂山467000)
隨著智能手機(jī)的普及,人們通過(guò)手機(jī)圖片和視頻去觀察了解事物,但是不能從三維視角下觀看物體的方方面面。AR 的優(yōu)勢(shì)就在于能夠把原本在現(xiàn)實(shí)物理世界中難以體驗(yàn)到的真實(shí)的感官信息,通過(guò)科學(xué)技術(shù)模擬仿真后再疊加到現(xiàn)實(shí)世界被人類感官所感知,從而達(dá)到超越現(xiàn)實(shí)的感官體驗(yàn)[1]。而AR 技術(shù)的這一優(yōu)勢(shì)能幫助人們?cè)谔搶?shí)結(jié)合的場(chǎng)景中有更好的交互體驗(yàn)。槍械并不是每個(gè)人都能接觸到的物品,但又有很多人對(duì)槍械特別感興趣。眾多人的愛(ài)好需求和社會(huì)現(xiàn)狀出現(xiàn)了矛盾,《AR 槍械》通過(guò)增強(qiáng)現(xiàn)實(shí)技術(shù),將真實(shí)的環(huán)境和虛擬的物體實(shí)時(shí)地疊加到了同一個(gè)畫(huà)面或空間。AR 技術(shù)使真實(shí)場(chǎng)景與虛擬物體無(wú)縫對(duì)接,通過(guò)《AR 槍械》這一科普軟件,用戶能夠以立體真實(shí)的視角,增強(qiáng)用戶對(duì)槍械知識(shí)的學(xué)習(xí)興趣,了解槍械科技的發(fā)展。
《AR 槍械》能夠讓用戶通過(guò)掃描槍械平面識(shí)別圖來(lái)觀察三維的槍械模型,并且會(huì)出現(xiàn)槍械數(shù)據(jù)和槍械歷史,用戶可以通過(guò)閱讀屏幕上的內(nèi)容來(lái)了解所掃描的槍械的數(shù)據(jù)及歷史。并且三維槍械模型出現(xiàn)后,用戶可以通過(guò)滑動(dòng)屏幕旋轉(zhuǎn)模型,滿足用戶全方位觀察槍械的需求。
啟動(dòng)AR 程序,用戶能夠看到開(kāi)始識(shí)圖、藏品、項(xiàng)目設(shè)置、項(xiàng)目幫助和退出項(xiàng)目等五個(gè)按鈕。用戶點(diǎn)擊開(kāi)始識(shí)圖,項(xiàng)目會(huì)跳轉(zhuǎn)到識(shí)圖界面,用戶通過(guò)槍械識(shí)別圖獲取該槍械的三維模型。通過(guò)單個(gè)手指在手機(jī)屏幕上下左右滑動(dòng)控制模型上下左右旋轉(zhuǎn)。當(dāng)兩個(gè)手指間的距離變小時(shí)模型縮小,當(dāng)距離變大時(shí)模型放大。用戶可通過(guò)數(shù)據(jù)和歷史按鈕來(lái)查看該槍械的相關(guān)數(shù)據(jù)和歷史介紹。用戶也可選擇截圖、收藏和退出等功能。
用戶點(diǎn)擊藏品按鈕,項(xiàng)目會(huì)進(jìn)入到藏品界面,在藏品界面用戶可查看槍械藏品的三維模型及該槍械的槍械數(shù)據(jù)和槍械歷史,用戶也可選擇取消收藏該槍械。通過(guò)設(shè)置按鈕可跳轉(zhuǎn)到設(shè)置界面,用戶可以通過(guò)滑條控制項(xiàng)目音效大小。通過(guò)射擊體驗(yàn)按鈕可跳轉(zhuǎn)到射擊體驗(yàn)場(chǎng)景,可以使用自己選擇的槍進(jìn)行射擊體驗(yàn)。通過(guò)項(xiàng)目幫助按鈕可跳轉(zhuǎn)到項(xiàng)目操作介紹界面,用戶點(diǎn)擊退出按鈕,退出項(xiàng)目界面。
《AR 槍械》應(yīng)用程序主要運(yùn)用Unity3D 游戲引擎、Vuforia 軟件開(kāi)發(fā)工具包和C#腳本語(yǔ)言進(jìn)行開(kāi)發(fā),項(xiàng)目UI 主要運(yùn)用Photoshop 和Unity 軟件進(jìn)行制作,項(xiàng)目中的槍械3D 模型主要運(yùn)用Maya 軟件進(jìn)行建模。《AR 槍械》在項(xiàng)目策劃的基礎(chǔ)上,首先完成了槍械3D 模型、項(xiàng)目UI 等設(shè)計(jì)工作,然后進(jìn)行AR 識(shí)圖、槍械收藏、資源加載、截圖、藏品展示、項(xiàng)目幫助、項(xiàng)目設(shè)置、射擊體驗(yàn)等功能的開(kāi)發(fā)。項(xiàng)目中的槍械數(shù)據(jù)使用JSON 進(jìn)行存儲(chǔ)。項(xiàng)目模塊間采用了單例模式進(jìn)行通信。
項(xiàng)目資源準(zhǔn)備方面,除了模型、UI 效果圖之外,實(shí)現(xiàn)AR 槍械的關(guān)鍵一環(huán)就是識(shí)別圖的制作了。
首先,在Maya 中渲染出槍械模型的正視圖,保存其位置,作為AR 槍械模型的渲染圖;然后,在Vuforia的官網(wǎng)(https://developer.vuforia.com/)注冊(cè)并登錄賬號(hào),通過(guò)官網(wǎng)Add Database 按鈕創(chuàng)建槍械數(shù)據(jù)庫(kù)Firearms?Database;最后,在數(shù)據(jù)庫(kù)界面點(diǎn)擊Add Target 按鈕,選取制作的渲染圖,完成一個(gè)識(shí)別圖的添加。重復(fù)前面步驟,添加其他槍械識(shí)別圖,完成識(shí)別圖數(shù)據(jù)庫(kù)的創(chuàng)建。
在軟件系統(tǒng)開(kāi)發(fā)過(guò)程中,類圖設(shè)計(jì)起到承上啟下的作用,對(duì)上是用例分析的結(jié)果,對(duì)下是系統(tǒng)代碼設(shè)計(jì)的藍(lán)本[2]。類圖也是描述系統(tǒng)詳細(xì)功能設(shè)計(jì)的有效方式之一,能夠描述系統(tǒng)設(shè)計(jì)中類與類之間的聯(lián)系,也能夠?qū)︻惖膬?nèi)部構(gòu)成加以說(shuō)明[3]。AR 識(shí)圖、資源加載、藏品展示是整個(gè)項(xiàng)目里面最核心的幾個(gè)功能,在進(jìn)行項(xiàng)目開(kāi)發(fā)的初期,首先要完成各個(gè)功能模塊的類圖設(shè)計(jì)。
AR 槍械軟件啟動(dòng)后,當(dāng)用戶點(diǎn)擊應(yīng)用軟件上的識(shí)圖功能,打開(kāi)相機(jī),相機(jī)對(duì)準(zhǔn)識(shí)別圖進(jìn)行識(shí)別,根據(jù)不同的槍械識(shí)別圖,用戶能識(shí)別出不同的槍械模型,并對(duì)識(shí)別出的模型進(jìn)行放大縮小和旋轉(zhuǎn)操作。
AR 識(shí)圖類圖如圖1 所示,類GameManger 和類MyDefaultTrackableEventHandler 之間是依賴關(guān)系。設(shè)計(jì)單例類GameManger 儲(chǔ)存識(shí)別的槍械的名字,在該類中設(shè)計(jì)string 類型name 字段儲(chǔ)存槍械名稱,設(shè)計(jì)方法SetFirearmsName()獲取槍械名稱。設(shè)計(jì)類MyDefault?TrackableEventHandler 解析識(shí)別圖數(shù)據(jù)庫(kù)以及實(shí)現(xiàn)模型的加載,在該類中設(shè)計(jì)GameObject 類型的pregabs儲(chǔ)存槍械模型資源,設(shè)計(jì)方法OnTrackingFound()加載模型,設(shè)計(jì)方法OnTrackingLost()刪除模型。
圖1 AR識(shí)圖功能類圖
當(dāng)用戶掃描槍械識(shí)別圖時(shí),加載對(duì)應(yīng)的槍械模型,當(dāng)用戶點(diǎn)擊菜單欄中的數(shù)據(jù)按鈕時(shí)會(huì)加載并顯示當(dāng)前槍械的數(shù)據(jù);當(dāng)用戶點(diǎn)擊菜單欄中的歷史按鈕時(shí)會(huì)加載并顯示當(dāng)前槍械的歷史信息。
資源加載類圖如圖2 所示,資源加載功能有關(guān)類的設(shè)計(jì)如下:類CollectionUIManager 和類UIManager 都與類InventoryManager 存在依賴關(guān)系,類InventoryMan?ager 和類Firearms 組合關(guān)系。設(shè)計(jì)類InventoryManager通過(guò)JsonLoadFirearms()方法實(shí)現(xiàn)對(duì)Item.Json 文件的解析,解析槍的數(shù)據(jù)、歷史和槍械模型Prefab。類Col?lectionUIManager 和類UIManager 實(shí)現(xiàn)對(duì)類Inventory?Manager 解析的槍的數(shù)據(jù)、歷史和槍械模型Prefab 加載到相應(yīng)位置。設(shè)計(jì)類UIManager,在該類中設(shè)計(jì)方法DataButtonClick()和HistoryButtonClick()實(shí)現(xiàn)在識(shí)圖場(chǎng)景當(dāng)用戶點(diǎn)擊數(shù)據(jù)或者歷史按鈕時(shí),顯示對(duì)應(yīng)的數(shù)據(jù)。
圖2 資源加載功能類圖
藏品展示功能為了滿足藏品場(chǎng)景的互動(dòng)性和簡(jiǎn)潔性進(jìn)行單獨(dú)設(shè)計(jì),當(dāng)用戶點(diǎn)擊主界面的藏品按鈕,進(jìn)入藏品界面,在藏品界面的右邊是收藏的槍械列表,左邊是槍械的數(shù)據(jù)以及歷史,中間是槍械模型,用戶能滑動(dòng)中間屏幕旋轉(zhuǎn)、放大和縮小槍械模型,也能滑動(dòng)歷史Panel 查看完整的歷史介紹。當(dāng)用戶點(diǎn)擊藏品列表的槍械時(shí),在對(duì)應(yīng)位置顯示所點(diǎn)擊槍械的模型、數(shù)據(jù)以及歷史。
藏品展示功能類的設(shè)計(jì)如下:類CollectionUIMan?ager 和類InventoryManager 之間是依賴關(guān)系,類Inven?toryManager 和類Firearms 之間是組合關(guān)系。在類Col?lectionUIManager 中設(shè)計(jì)方法Init()實(shí)現(xiàn)控制藏品場(chǎng)景中槍械列表的刷新;對(duì)類InventoryManager 解析的槍的數(shù)據(jù)、歷史和槍械模型Prefab 加載到相應(yīng)位置,設(shè)計(jì)方法CollectionButtonClickTo()實(shí)現(xiàn)當(dāng)用戶點(diǎn)擊槍械列表中的槍械圖標(biāo)時(shí),加載對(duì)應(yīng)槍械的數(shù)據(jù)、歷史和槍械模型Prefab。類Firearms 用來(lái)存放槍械對(duì)象,在類Inven?toryManager 中設(shè)計(jì)方法JsonLoadFirearms()解析的槍械數(shù)據(jù),槍械數(shù)據(jù)都是按照類Firearms 對(duì)象的狀態(tài)儲(chǔ)存在內(nèi)存中,方便查找。
藏品展示功能的類圖設(shè)計(jì)如圖3 所示。
圖3 藏品展示功能類圖
在SampleScene 場(chǎng)景的Hierarchy 面板中鼠標(biāo)右鍵創(chuàng)建Vuforia Engine Image,并在該Image 的Inspector面板中點(diǎn)擊選擇Image TargetBehavior 中的Type 為Predefined,Database 為FirearmsDatabase,ImageTarge為槍械中的一個(gè),并將Image 的名稱改為選擇的Imag?eTarge 的名稱一致。重復(fù)上述步驟完成所有槍械Im?age 的制作。
為所有Image 槍械添加MyDafaultTrackableEven?tHandler 腳本,在這個(gè)腳本中編寫(xiě)名字為OnTrack?ableStateChanged()方法,當(dāng)程序運(yùn)行時(shí)通過(guò)該方法中的Stattus 屬性去解析識(shí)別到的圖片是否是當(dāng)前Image圖片,如果不是繼續(xù)識(shí)別,如果是當(dāng)前圖片將調(diào)用名字為OnTrackingFound()方法將該槍械模型加載到內(nèi)存中,通過(guò)GameObject 類型的gameobj 去索引模型,通過(guò)Instantiate 方法將gameobj 加載到場(chǎng)景中,完成對(duì)應(yīng)槍械模型的加載,實(shí)現(xiàn)識(shí)圖功能。AR 識(shí)圖功能效果圖如圖4 所示。
圖4 AR識(shí)圖功能效果圖
在項(xiàng)目場(chǎng)景的Hirerarchy 面板創(chuàng)建空物體,創(chuàng)建InventoryManager 的腳本并加載在空物體上,通過(guò)腳本中的JsonLoadFirearms 方法,以文件讀寫(xiě)的方式讀入Items.Json 文件中槍械編號(hào)、槍械名稱、槍械收藏狀態(tài)、槍械歷史、槍械重量等槍械資源。通過(guò)firearmsList 列表存儲(chǔ)JSON 解析的全部槍械數(shù)據(jù),然后通過(guò)GetFire?armsState()方法獲取某個(gè)槍械的所有數(shù)據(jù)。
在識(shí)圖場(chǎng)景,當(dāng)用戶識(shí)別槍械后,用戶點(diǎn)擊菜單欄中的數(shù)據(jù)按鈕,該按鈕通過(guò)監(jiān)聽(tīng)事件通過(guò)MainMe?nuButtonClick()方法通過(guò)GameManager 類獲取當(dāng)前槍械的名稱name 字段,在通過(guò)DataButtonClick()方法將槍械名字name 發(fā)送給InventoryManager 類的GetFire?armsText 方法,該方法將返回一個(gè)Firearms 對(duì)象,該對(duì)象存儲(chǔ)著當(dāng)前槍械的數(shù)據(jù)信息,獲當(dāng)前數(shù)據(jù)后,將槍械數(shù)據(jù)發(fā)送給Datapanel 面板寫(xiě)的DataText 的Text 文本,將數(shù)據(jù)顯示在屏幕上;當(dāng)用戶點(diǎn)擊HistoryButtonClick按鈕時(shí),重復(fù)數(shù)據(jù)按鈕方法,將槍械歷史顯示在屏幕上。
藏品展示功能的實(shí)現(xiàn)效果圖如圖5 所示,該功能的實(shí)現(xiàn)步驟如下:
(1)給藏品場(chǎng)景中的Canvas 掛在CollectionUIMan?ager 腳本,當(dāng)場(chǎng)景運(yùn)行時(shí),該腳本將通過(guò)Init 方法獲取場(chǎng)景中的藏品展示列表CollectionPanel 以及面板下的所用子物體。
(2)在場(chǎng)景中的Hirerarchy 面板中創(chuàng)建一個(gè)空物體,命名為InventoryManager,再掛載InventoryManager腳本,當(dāng)場(chǎng)景運(yùn)行時(shí),該腳本將運(yùn)行腳本中的JsonLoad?Firearms()方法,將Items.Json 文件中的數(shù)據(jù)讀入Fire?List 列表中。Items.Json 文件中通過(guò)State 存儲(chǔ)槍械的狀態(tài),通過(guò)查看FireList[n].state 的值來(lái)確定槍械是否收藏。
(3)在場(chǎng)景中類CollectionUIManager 通過(guò)UpdateS?ceneCollectionFirearmsList()方法將從InventoryManager類的GetCollectionNameList()方法中獲取的收藏中的槍械名稱存儲(chǔ)TextList 列表內(nèi),并依次在CollectionPan?el 通過(guò)Init()方法將槍械名稱加載到藏品列表中,在屏幕上顯示。根據(jù)當(dāng)前列表中槍械名稱,通過(guò)Resource.load()方法將槍械對(duì)應(yīng)的圖片,從Resource 文件夾內(nèi)加載到列表中。
AR 槍械這款應(yīng)用程序,用戶通過(guò)手機(jī)掃描槍械識(shí)別圖,識(shí)別出槍械模型;用戶通過(guò)資源加載功能讀寫(xiě)槍械配置資源,以在UI 界面顯示槍械數(shù)據(jù)信息和歷史信息;用戶通過(guò)藏品展示功能,收藏喜愛(ài)的槍械。另外,用戶還可以運(yùn)用槍械模型進(jìn)行射擊體驗(yàn),享受射擊的快樂(lè)。
圖5 藏品展示功能效果圖