宋世坤
(四川大學計算機學院,成都610065)
虛擬現實是一種結合多媒體技術、圖形學和人機交互技術等科技發展的最新技術,綜合應用光學、數學、力學等學科,在計算機上生成可交互的三維環境,并利用多源信息融合的交互仿真使用戶達到沉浸式的效果,隨著信息技術和互聯網技術的飛速發展,虛擬現實已漸漸滲透到生活中的各個方面,并在這些領域大放異彩,由于它具有基于虛擬現實技術的交互性、體驗性和沉浸性,使比起文字描述、全景圖片等形式的展示方式更具有優勢,本項目基于HTC Vive 頭盔手柄設備作為交互方式,以Unity3D 為主要開發工具,以車間為背景,真實還原生產車間中設備與房間,使用戶達到身臨其境的觀感。
本項目實現功能有:
(1)第一人稱與第三人稱漫游。支持真實三維場景瀏覽,支持多視角瀏覽、多視距瀏覽,第一人稱視角漫游:提供第一人稱視角漫游,通過交互手柄控制視點位置前進、后退、旋轉,改變視角觀看內容。第三人稱自由視角:提供第三人稱自由視角,通過交互手柄控制視點位置,自由旋轉、拖曳、放大、縮小,改變視角觀看內容。
(2)人機交互與設計,文字、箭頭等展示效果的顯示與隱藏。提供交互界面,用戶可以瀏覽廠房的介紹信息,介紹內容以文字方式表現,能夠通過交互操作隱藏和顯示文字信息。
(3)虛擬儀表和監控界面設計和開發。系統通過虛擬儀表和監控界面顯示車間內部的工作狀態,虛擬儀表及監控提供數據輸入接口,供其他系統或軟件將獲取到的傳感器數據實時傳入。
HTC Vive 在2015 年巴薩羅那世界移動通信大會上首次公開面世,由HTC 與Valve 兩家公司聯合研發出的VR 虛擬現實產品,主要包含1 個頭戴式顯示器,2 個激光傳感定位器,2 個單手控制器,其中頭戴式顯示器通過左右眼觀看不同顯示屏蔽達到實現雙目立體視覺,采用OLED 液晶屏來作為頭盔顯示器的屏幕,該屏幕雙眼合并的有效分辨率高達2100×1600 像素,其較高的分辨率可以有效降低畫面的顆粒感,從而達到不錯的用戶體驗,2 個手柄有多個功能按鈕,通過判斷是否按下的狀態信息實現豐富的交互功能,2 個定位系統采用的是Value 公司研發的Lighthouse 來作為產品的特有定位系統控制器,Lighthouse 由兩個基站構成,其主要原理是通過發射的激光和光敏傳感器之間的相互交互來確定物體的運動軌跡和位置,從而得到六自由度信息。
本項目的仿真系統是基于Unity3D 平臺實現的,Unity3D 是由Unity Technologies 開發的一個讓玩家輕松創建諸如三維視頻游戲、建筑可視化、實時三維動畫等類型互動內容的多平臺的綜合型開發工具。它是能夠將開發的產品發布到Windows、Linux、Mac、iOS、Android 等平臺上的輕量級引擎,具有操作簡單、跨平臺、所見即所得的模型實時渲染效果。同時由于社區的活躍,用戶許多豐富實用的插件資源,腳本是Unity3D 邏輯功能實現的核心,Unity 腳本支持三種語言,C#、JavaScript 和Boo 腳本,其中Boo 腳本用的較少,C#和JavaScript 為主流,將腳本拖到對應的游戲對象上,設置好初始參數和對象,點擊程序運行就能實現相應的功能了。
前期根據需求分析得到需要創建的場景,進行車間實地測試及現場調研,搜集對應的數據和材料,確立平面圖,建筑風格,場景面積大小,交互功能設計,動畫制作等方便后期制作。對于場景模型的建立,有多種方法,一種是利用Unity 引擎本身的建模功能創立物體,另外一種是利用專門建模軟件進行制作,常見的建模軟件有3DMax、Maya 等,每個軟件有各自的優勢,3DMax 適用于工程建模、室內外場景等方面的指針而Maya 偏向于三維動畫、電影的制作,因此,本項目選擇3DMax 更加合適。充分利用3DMax 的可視化特點,從現場拍攝的圖片中,根據三維視圖和相關的數學攝像原理,得到車間中各個設備的大小,完成三維虛擬建模,建模過程中要遵循以下原則:①為了達到場景的流暢運行,要盡可能地控制模型的面數;②對于看不見的部分,合理的刪除面片數據;③UV 拆分中UV 點均勻分布,防止后期貼圖出現畫面變形失真。三維模型優化有很多的技巧,主流的有LOD 技術,這種技術是根據視點的遠近選擇不同性能的模型,對于在遠處的場景,選擇面數少的,不僅保全了模型的視覺效果不影響整體感官,而且提高了模型的繪制速度,使系統加載響應更快。建立完模型后,保存后將其導出為.fbx 的文件,存入到Unity 項目Project 文件夾中。其中導入有物體的位置信息、材質、貼圖、動畫等。最終參考效果間圖1。

圖1 車間內部模型
按照官網的教程下載相應的驅動,之后安放2 個激光定位傳感器,將頭盔和手柄控制器放在定位器可見的范圍內,然后就是定位,即需要設置一個原點的位置,構造一個虛擬的坐標系統,一起設置好之后,便可以準備開發了,雖然官方提供的SteamVR 插件提供了一個C#接口,讓開發人員可以與Vive 設備進行交互,但獲取控制器輸入狀態或設備姿勢會導致大量冗余代碼,主要為以下兩點:①您必須連續獲取正確的設備索引(2 個手柄控制器的哪一個),該索引由Steam-VR_ControllerManager 在連接控制器時確定;②定位SteamVR_ControllerManager 也會帶來更多的開銷,所以這里我們采用的是ViveInputUtility 插件,封裝了底層細節,讓我們開發更加簡單,ViveInputUtility 有以下一些特點,使用靜態函數獲取設備輸入按鈕事件跟蹤姿勢,使用ViveRaycaster 組件發送射線,可以實現多種碰撞檢測,包含2D、3D、UI 等。下面是一些C#腳本示例:


配置ViveInputUtility 插件的具體步驟如下:①打開Steam 平臺下載SteamVR 這是由Value 提供的官方庫,可以簡化Vive 開發;②在Unity 的AssestStore 中下載ViveInputUtility 插件;③導入到工程中,選擇默認的推薦設置;④將ViveInputUtility 中的預設體拖到項目中,根據功能的需要,給相應的物體加上可拖拽,可瞬移的腳本。
(1)視角的切換
通過在場景中放置多個攝像機,當獲取到手柄控制器按下扳機的指令時,進行視角的切換,即隱藏第一人稱相機,將其狀態設置為GameObject.SetActive(false),同時打開第三人稱相機進行人物移動的跟隨,保持一定的距離。主要代碼如下:

(2)交互組件開發
HTC Vive 設備通過控制手柄來實現輸入信息,可以使用瞬移、點擊、拖拽等功能。實現瞬移功能時,要預先設置好可瞬移的區域,避免造成畫面的丟失。因為不能夠讓用戶可以走出到場景之外的區域或者穿越到不透明物體的內部,這里采用虛擬碰撞器的原理,當到達邊界時,由于存在碰撞檢測算法,控制器便不能繼續往邊界之外移動了,瞬移地點的選擇方式為貝塞爾曲線,生成選擇地點的遠近由用戶使用控制器手柄的方式,越高則可選擇的范圍越大,如果用戶將手柄舉起角度大于45 度,系統會鎖定這個距離的交點,從而實現瞬時移動。使用瞬移的好處是減少不適感,由于要達到流暢的VR 體驗對硬件設備要求比較高,所以采用瞬移的方式具有普遍性,減少用戶的疲憊感和眩暈感。
3D 拾取技術,在漫游過程中,用戶可以通過發射射線與場景中的物體交互,其主要原理是由攝像機和屏幕上的位置確定一條射線,射線指向3D 世界,最先第一個可碰撞的物體與此射線相交的物體就是被選中的物體,通過捕獲這個消息,可以實現材質的更改或者動畫的播放,從而達到交互的目的。
(3)打包發布
完成所有的場景創建和功能開發后,選擇要運行的平臺操作系統,即可將整個平臺發布為可執行.exe文件,連上HTC Vive 設備后,點擊運行該應用程序即可實現漫游效果。
本項目通過對虛擬現實車間漫游的研究與實現,利用建模軟件3DMax 進行車間實體場景的真實還原,通過HTC Vive 作為交互設備和Unity 作為開發工具實現了車間的交互式漫游體驗,實現了多種視角的漫游體驗,通過其交互功能更加生動了模擬真實生產中的過程,證明了虛擬現實技術用于展示與生產教學的有效性,同時這些技術也可以應用于其他相關領域的仿真,具有一定的借鑒性。