彭偉國 李文松
平頂山學院 計算機學院(軟件學院) 河南 平頂山 467000
在平頂山學院60華誕之際,2019年10月平頂山學院(以下簡稱平院)校史館正式落成開放。開發一款VR版的平院校史館,校內外師生和游客可通過網絡身臨其境的去參觀校史館,是線上展示校情的平臺和窗口,以增強師生的集體榮譽感、時代責任感,提升學校的社會美譽度,達到良好的教育宣傳效果。
通過已有校園虛擬漫游項目分析,可知大部分項目在場景上主要呈現的是三維模型、圖片、文字等,在交互功能上主要有交互式地圖、漫游路線、圖片展示、語音解說等。VR平院校史館在項目策劃上,吸取了已有類似項目交互設計的先進經驗,將VR項目交互形式分成圖文交互、視頻觀看、語音解說、答題測試、圖片消消樂等多種形式,在不失趣味性的前提下,真實還原平院校史館的實際場景布局。為此,本項目在功能策劃上有注冊與登錄、虛擬漫游、虛擬交互、校史導學、小游戲等。
本項目使用主流的Unity引擎進行開發;用戶借助HTC VIVE設備,可以通過戴頭盔、拿手柄的方式實現對角色的控制;開發過程中采用單例設計模式,使項目滿足“高內聚、低耦合”的需求。本項目的3D場景使用Maya建模軟件進行制作,然后使用C#編程語言實現交互功能。
本項目的場景主要由房屋建筑、展板、桌子、燈等一些物品組成。房屋建筑主要是參考現實中的校史館進行設計,場景總共分為四個部分。第一個部分主要是由一間房子劃分開來,中間豎立著平頂山學院的牌子;第二個部分是一個走廊加一個方形的房子,中間豎立一個圓柱,圓柱上面是一個像扇子一樣的建筑;第三個部分是一個走廊和一個圓形展臺建筑;第四個部分是一個圓形建筑加上一個圓臺。
VR校史館虛擬場景里面有許多展板,分為前言展板、內容展板、后記展板。前言展板主要介紹校徽、校訓、校歌、校史的簡介;內容展板主要有校史模塊、院系模塊、黨建模塊、民主管理、團學活動、學校規劃;后記展板主要是回望歷史、審視當下和展望未來,全力譜寫新時代平頂山學院的絢麗華章。
玩家以虛擬的第一視角的形式,在場景里面游走,手握HTCVIVE手柄、頭戴頭顯設備來操作虛擬人物以達到體驗的效果。
依據項目交互功能設計,項目設計了登錄注冊界面、開始界面、加載界面、視頻播放界面、答題界面、消消樂界面、柱狀圖界面等UI界面。在功能設計上,以面向對象程序設計思想為指導,運用C#語言編寫交互腳本,通過類圖的形式設計了登錄與注冊功能、虛擬漫游功能、虛擬交互功能、校史導學功能、小游戲功能等方面。在此,以虛擬交互功能設計為例進行詳細闡述。
在虛擬現實系統中,用戶與虛擬世界之間要實現自然的交互,必須采用特殊的輸入輸出設備,用以識別用戶的各種信息輸入,并實時生成逼真的反饋信息。VR輸入設備如動作捕捉、手勢識別、聲音感知等體感類設備,通過感知用戶輸入信息,與虛擬世界進行交互,輸入設備是實現消費者交互、沉浸感的重要技術[1]。
根據設計,本項目就是要借助HTC VIVE設備來實現這個功能。兩個帶有按鈕和振動反饋的手柄,一個可以看見虛擬場景的頭盔,它們會實現用戶與虛擬世界的交互。首先就是設備如何使用,怎么才算連接成功,其次是怎么獲取手柄的接口,最后就是通過按鈕與虛擬世界的交互。
虛擬交互功能是在Control Manage類里面實現,hand變量是指兩個手柄,m_pose變量是指手柄的動作,m_Touch變量是指手柄圓盤的位置,類圖如圖1所示:

圖1 虛擬交互功能類圖
場景中主要由房子、展臺、圓柱、展板、燈等物體組成,對于場景的實現,一是模型的制作、貼圖的制作,二是場景的布局(展板的位置、大小等內容)。
根據項目設計總共有四個房間,運用Maya軟件先制作出墻體的形狀,然后通過復制、移動、壓扁、調整位置,制作出房子形狀;通過Maya多切割工具和擠壓工具形成房頂上的各種形狀;然后,創建幾個立方體,用來制作展板、展臺、攝像頭等房屋設施;針對房屋每個部分進行UV操作,保存圖片在Photoshop軟件里做貼圖,然后在Maya里面添加材質;最后,在Maya里將模型導出,格式為fbx,然后將它導入到Unity。
前言展板、內容展板、后記展板制作步驟幾乎一樣,都是創建Text和Image,并改變其內容和參數。
從VR環境搭建、VR按鍵和頭盔、VR視頻播放三方面為例分析本項目功能的實現。
(1)VR環境搭建
HTC VIVE是一款虛擬頭盔,是VR虛擬現實交互設備,HTC Vive套件由頭戴式顯示器(HMD)、兩個基站、兩個無線操控手柄和一個串流盒構成[2]。VR環境搭建分為兩個步驟,第一步驟是SteamVR的導入,第二步驟是Player的設置。
1)SteamVR的導入
從Unity Asset資源商店里導入SteamVR插件;在Unity中將PlayerSetting的設置為OpenVR;打開Window下的SteamVRInput編輯界面,默認的default不用改,Actions 下In則為要輸入的事件,out為輸出事件;點擊In里面的“+”,Name為當前事件的名字,Type為事件的返回值類型,Required目前測試3種選擇沒有區別,Localized String直接設置為當前事件的名字一樣即可;定義一個觸摸板觸摸事件,類型為boollean,編輯完后點擊save and generate按鈕就可以把這個事件寫入到SteamVR_Input_ActionSet_default_In;點擊Open binding UI按鈕,進行手柄按鍵的操作。
2)Player的設置
找到SteamVR示例場景Player,將其拖到場景中即可實現基礎的瀏覽;調整合適大小,然后將其放入場景的第一個地方;選中Player添加相應的代碼,對其進行設置;運行場景,如果能夠在頭盔里面看到場景的話,表示設置成功。
(2)VR手柄按鍵
1)獲取手柄按鍵的方法是聲明一個Hand類型的變量,通過SteamVR_Input.GetStateDown方法獲取手柄按鍵。
2)手柄按鍵獲取后就要檢測與場景中UI的交互了,此時向Canvas物體中掛在SteamVRLaserWrapper腳本。
3)SteamVRLaserWrapper腳本主要實現射線與UI的碰撞問題,首先引出OnPointerClick、OnPointerOut、OnPointerIn三個方法,然后連接EventSystem中的檢測方法,最后添加到相應的事件上。
(3)VR視頻播放
視頻播放子功能主要是指用戶點擊按鈕進行視頻的播放,它主要把視頻渲染到了UI界面上,然后將內容展現給用戶。
本功能在PlayVideoOnUGUI類和SliderEvent類里面實現,PlayVideoOnUGUI類和SliderEvent類是依賴關系。PlayVideoOnUGUI類處理是視頻加載邏輯,SliderEvent類處理的是進度條邏輯,ShowVideoTime方法處理的是進度條顯示視頻時間的邏輯,類圖如圖2所示:

圖2 視頻播放功能類圖
該功能的主要實現,有以下幾個步驟:
1)在video組件里掛上PlayVideoOnUGUI腳本并且將相應的Button添加上實踐。
2)在PlayVideoOnUGUI類里面,首先將視頻渲染到原先定義好的UI界面上,獲取videoPlayer組件和rawImage組件,然后在Update里面將videoPlayer的texture賦值給rawImage的texture,最后在場景中就可以看到視頻在播放。
3)在PlayVideoOnUGUI類里面,實現播放、暫停、關閉功能就要用到Bool指isPause和isClose,當isPause為false且isClose為false時,用Play()方法來讓視頻播放;當isPause為true且isClose為false時,用Pause()方法來讓視頻暫停;當isPause為true且isClose為true時,用Stop()方法來讓視頻暫停并且讓原先的圖片將視頻替換掉。
4)實現進度條功能,首先是ShowVideoTime方法,先獲取當前的視頻播放時間,再將當前視頻播放的時間顯示在 Text上,后把當前視頻播放的時間比例賦值到Slider 上,然后就是在Update方法里面調用此方法,最后實現時間實時更新的效果。
5)在SliderEvent類里面,創建SetVideoTimeValueChange方法,目的是當前的 Slider 比例值轉換為當前的視頻播放時間,然后在OnDrag方法里調用此方法并將isPause改為true,最后再OnEndDrag方法里將isPause改為false。
6)最后通過運行場景,用戶可以點擊這些按鈕。界面效果如圖3所示:

圖3 VR視頻播放效果圖
VR平院校史館項目的實現,用戶從入館前到入館后有十幾個任務點,用戶完成一個任務之后才能進入下一個任務點。任務分為圖文交互、視頻觀看、答題測試、圖片消消樂等。技術實現上,該項目使用主流的Unity引擎進行開發,用戶可以通過戴頭盔、拿手柄的方式在VR校史館內進行虛擬漫游和交互,能讓平院師生去通過虛擬環境了解平院六十年的發展史,增強了平院師生的集體榮譽感和時代責任感。