曹俊江,昔克,李劍
(新疆電子研究所股份有限公司,新疆 烏魯木齊 830013)
5G技術的高速發(fā)展和應用,推動了VR行業(yè)的發(fā)展。近年來,市面上推出了很多優(yōu)秀的VR應用,但是昂貴的開發(fā)成本和設備成本阻礙著這些優(yōu)秀的應用進入千家萬戶,在這個過程中,WebVR技術就應運而生。WebVR是一種基于WebGL的三維展示技術[1],WebVR將VR體驗搬進了用戶瀏覽器,通過JavaScript和WebGL的有機結(jié)合就可以借助系統(tǒng)顯卡在瀏覽器里流暢地展示3D場景和模型。而WebVR提供了專門訪問VR硬件的接口,讓開發(fā)者能構(gòu)建更加舒適的VR體驗[8],并且可以兼容智能手機、PC、Oculus Rift和 HTC Vive等設備。Krpano作為主流的三維全景和WebVR開發(fā)框架,可以方便地將采集到的圖像進行拼接、整合,生成無縫的三維虛擬空間[2]。Krpano自帶的各種插件也可以方便地將各種圖文、音頻、視頻、模型等資源加載到虛擬場景中,通過編寫腳本實現(xiàn)各種場景下的交互。該技術目前已經(jīng)廣泛應用于虛擬博物館、虛擬景區(qū)、數(shù)字城市等項目中[5]。由于Krpano是基于XML的數(shù)據(jù)結(jié)構(gòu),因此復雜場景的開發(fā)往往需要更多的冗余步驟和繁雜節(jié)點疊加操作,使得場景的開發(fā)缺乏可視化的開發(fā)環(huán)境[9]。該系統(tǒng)的設計使開發(fā)人員構(gòu)建場景更加直觀,同時大大降低了用戶對場景業(yè)務的維護成本。
常規(guī)的Krpano場景開發(fā),需要使用該框架下自帶的Bat批處理程序進行處理[6],通過輸入不同的參數(shù)用以生成不同功能的場景文件。不同場景的生成過程中往往會生成多個場景的配置文件,其中50%以上的文件高度冗余,需要開發(fā)人員在對比分析后進行合并。在前端場景界面的設計過程中,也需要根據(jù)多個場景對節(jié)點進行配置、裁剪、合并,步驟繁瑣,極易出錯。
為了解決上述問題,首先需要了解Krpano的場景生成過程,對場景生成命令進行抽象化處理[11],通過Java語言封裝成類庫加以執(zhí)行。其次對于各個場景下的冗余文件進行分析,通過程序處理完成自動化裁剪和場景合并。
圖1 場景結(jié)構(gòu)分析圖
傳統(tǒng)的Web VR應用在交付給用戶后,如果發(fā)生業(yè)務變更或系統(tǒng)問題,只能交給開發(fā)人員進行維護或者重新開發(fā),直接提高了用戶的維護成本,最終使產(chǎn)品難以落地。為了降低用戶的維護成本,這就需要對各個場景下的圖文、音頻、視頻、模型、腳本等資源進行建庫處理[4]。通過系統(tǒng)后臺界面完成資源的添加、更新和刪除操作。
Krpano引擎同時支持Html5和Flash兩種顯示方式[3],為了更好地支持移動設備,該系統(tǒng)采用了Html5顯示方式。Krpano在場景配置上使用了XML文檔結(jié)構(gòu),只需要改變XML文檔結(jié)構(gòu)就可以對場景進行腳本控制。同Json一樣,XML也是一種通用的解析標準[13],因此外部應用程序可以很方便地對場景進行操作,可以動態(tài)地對場景進行擴展和控制。在腳本交互上,Krpano的action同時支持ActionScript3和Javascript兩種腳本語言[12],分別對應Flash和Html5顯示方式。Krpano.html是場景的入口頁面,通過讀取Krpano.xml配置文件完成場景的加載和切換。每個場景都有對應的XML配置文件,完成對場景各個元素的加載和交互控制。
Krpano通過對XML配置文件的解析,完成對場景、圖片、音頻、VR插件等元素的加載和控制。每個配置文件的根節(jié)點<krpano>下包含了多種元素標簽來實現(xiàn)不同的功能。相同的元素標簽用name屬性加以區(qū)分。<include>元素可以引入不同的XML配置文件,相當于把配置文件里的內(nèi)容全部復制到當前配置文件下。<view>元素控制場景的視野,如起始視角、視角限制與縮放等。<image>元素控制場景的全景圖設置,包括全景圖類型,漸進分辨率切片顯示等,由框架自動生成。<control>元素設置鼠標、鍵盤以及觸摸設備對場景瀏覽的控制方式。<plugin>元素作為插件元素,可以支持在場景空間中加載透明視頻、3D音頻、地圖、模型、粒子特效、VR特效等多種功能擴展。<hotspot>元素主要負責各個場景的熱點切換。<events>元素可調(diào)用各類型事件,例如全景載入的不同階段以及鼠標觸發(fā)的不同行為等。<action>元素可自定義動態(tài)代碼,用以完成各個元素的交互。
系統(tǒng)拓撲架構(gòu)如圖2所示。
圖2 系統(tǒng)拓撲架構(gòu)圖
系統(tǒng)采用B/S架構(gòu),使用Java編程語言進行開發(fā),整個系統(tǒng)包含執(zhí)行層和數(shù)據(jù)層。執(zhí)行層負責對底層文件進行讀寫,包括場景生成和配置文件的修改等操作。數(shù)據(jù)層負責系統(tǒng)XML數(shù)據(jù)的交互和數(shù)據(jù)庫的存取。
VR場景應該具備以下主要功能:
1)場景管理功能。主要負責對場景進行新增、刪除和編輯操作。系統(tǒng)根據(jù)相關操作生成、合并XML配置文件。
2)多線程處理功能。通過調(diào)用Krpano自帶的命令進行XML文件的自動化生成和合并操作。
3)元素管理功能。負責對場景下的各種元素進行新增、刪除和編輯操作,如3D文字、轉(zhuǎn)場鏈接、透明視頻、模型、插件等。
4)可視化場景編輯功能。主要負責場景的可視化編輯,在后臺新增相應的元素后或在編輯相關屬性后對場景進行實時計算和顯示。
5)腳本在線編輯功能。主要負責對腳本進行編輯和語法檢查,配合可視化場景編輯器可以實時對腳本功能進行測試和調(diào)整。
Krpano框架自帶的Bat批處理文件支持場景的生成[7],但是繁多的命令和參數(shù)對于開發(fā)人員和用戶來說操作極為不便并且非常難以擴展。通過對命令和參數(shù)的封裝和處理,可以在系統(tǒng)后臺中完成場景的自動化生成操作。關鍵代碼如下:
圖3 系統(tǒng)功能設計圖
Krpano的場景配置文件基于XML結(jié)構(gòu),目前對于XML結(jié)構(gòu)的解析方式有兩種:Dom(document object model)和 Sax(simple api for xml)。Dom 解析方式是將XML文檔預先加載到內(nèi)存,對文檔的查找和編輯操作比較方便。Sax解析方式是基于事件驅(qū)動[10],無需完全加載XML文檔,效率較高,但是難以實現(xiàn)文檔的排序和編輯操作。系統(tǒng)采用Java下主流的解析工具Dom4j,它同時具備Dom/Sax兩種解析方式[14],可以根據(jù)業(yè)務需要靈活選擇。關鍵代碼如下:
Krpano場景的建立和交互都是基于XML配置文件進行配置的。傳統(tǒng)的開發(fā)方式是基于文本編輯器對XML節(jié)點進行添加和移動[15],對于開發(fā)人員和維護人員來說不僅要對Krpano的語法非常清楚,而且開發(fā)效率也不高,極易出錯。Javascript是一種解釋語言,用于對Web頁面中元素的操作,而JQuery是對Javascript的封裝,使頁面Dom元素的操作更加高效、便捷。JQuery也可以方便地對XML文件進行解析和操作[16],實現(xiàn)代碼如下:
圖4 場景信息流程圖
系統(tǒng)后臺采用主流的Bootstrap響應式框架。該框架包含多種常見界面組件,包括導航菜單、表單、進度條、提示框、媒體對象、縮略圖、代碼編輯器等。Bootstrap支持積木式開發(fā),可以方便地對各種組件自由組合,僅需要將使用到的插件(如縮略圖)的js文件和css文件引用,就可以使用JQuery方便地調(diào)用該組件的各種功能。加載場景縮略圖關鍵代碼如下:
圖5 場景可視化編輯視圖
通過對系統(tǒng)的測試使用和后續(xù)優(yōu)化,本系統(tǒng)已經(jīng)實現(xiàn)了對場景的上傳、生成、元素編輯和交互腳本的編輯等功能,既滿足了開發(fā)人員可視化、便捷化發(fā)布需求,也滿足了維護人員對場景元素的自定義編輯。在用戶體驗上,支持了基于紅藍眼鏡、谷歌紙盒、HTC Vive等設備的VR體驗。在交互體驗上,基于Krpano原生和第三方插件實現(xiàn)了全景視頻漫游、3D展館漫游、虛擬導游講解、VR積分游戲等功能。目前本系統(tǒng)已經(jīng)在旅游集散中心、景區(qū)、展館等領域落地使用,既大大降低了開發(fā)成本,也為客戶提高了服務效率,具有較強的應用價值和推廣價值。